【问题标题】:How to add data derived from source code file name or content to a resource at build time如何在构建时将源自源代码文件名或内容的数据添加到资源
【发布时间】:2017-11-20 17:18:52
【问题描述】:

背景

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

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

问题

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

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

1 - 这可行吗?

2 - 有没有办法在不使用 AntRun 的情况下在纯 Maven 中做这样的事情?

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

【问题讨论】:

    标签: java mongodb maven ant


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-05-06
      • 2015-03-14
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多