如何在构建时将源自源代码文件名或内容的数据添加到资源

How to add data derived from source code file name or content to a resource at build time

背景

我正在使用开源项目 mongobee 向现有项目添加数据库迁移。实际的迁移全部由 mongobee 及其变更日志和变更集的概念处理。此增强功能的一部分涉及在运行时检查当前 MongoDB 数据库迁移版本,并将其与 java 应用程序预期的版本进行比较。这背后的原因是我们希望安装我们的产品下载代码更新(新的 *.wars),并且在登录新版本的应用程序时,系统会提示管理员用户更新数据库,如果他们的数据库版本低于预期。

我们目前正在使用 Maven 来打包和构建我们的软件。

问题

困扰我的一个方面是如何处理标记 Java 源代码期望的数据库版本。我想避免在每次构建和添加迁移时手动输入。

我提出的解决方案可能并不理想。我最初的想法是使用变更日志文件的约定和 class 名称,例如 "v0001_first_migration" 然后在构建时,使用 Maven AntRun 插件调用单独编译的 java 文件遍历迁移更改日志目录并查找最新的迁移编号,然后将结果存储在资源文件中,可能 XML。然后应用程序可以在运行时读取该 XML 文件以获得它期望的数据库版本。

1 - 这可行吗?

2 - 有没有办法在不使用 AntRun 的情况下在纯 Maven 中执行类似的操作?

3 - 是否有其他选择可以更轻松地完成此任务?

作为我上面提出的解决方案的替代方案,我使用了一个在这里找到的反射项目:https://github.com/ronmamo/reflections 并遍历了我的迁移目录中遵循上述约定的所有类名(v0001_first_migration, v0002_second_migration)。我使用 regex 解析那些以获得 Integer 并进行比较以确定应用程序预期的迁移版本。数据库方面要容易得多,所以我不会再讲了。

现在,我不使用 Ant 任务,而是将预期的应用程序迁移版本弹出到单例中(我知道这很糟糕),或者只是调用根据使用位置查找预期应用程序迁移的函数。

为什么是单身人士?解析过程很昂贵,我希望在每个想要访问我们的数据库的 REST 调用中使用这些数据。由于我们当前项目的一些限制,我在 REST 层创建了单例。这里更好的方法是在 Tomcat 的情况下,创建一个 ServletListener 并将迁移版本分配为 ServletContext 的属性。由于我们的 REST 层的工作方式,我将修改大量函数签名以传入 @Context ServletContext。我们也没有依赖注入容器,所以如果我不想触及 REST 层中的几乎所有操作,我的选择就会受到限制。 Singleton 在启动时获得预期的应用程序迁移版本,仅此而已,因此使用 mock 进行测试仍然很容易,而且我看不到任何并发问题。