java - 如何在构建时将从源代码文件名或内容派生的数据添加到资源

标签 java mongodb maven ant

背景

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

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

问题

困扰我的一个领域是如何处理标记 Java 源代码所需的数据库版本。我希望避免每次构建和添加迁移时手动输入此内容。

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

1 - 这可行吗?

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

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

最佳答案

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

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

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

关于java - 如何在构建时将从源代码文件名或内容派生的数据添加到资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47397595/

相关文章:

MongoDB 对同一文档中多个字段的结果进行分组和计算

java - 在maven中指定依赖

java - 构建简单的 Spring JPA 项目时出现 NoSuchBeanDefinitionException

java - CacheResolver 和 KeyGenerator 之间有什么区别以及何时使用它们

java - 正则表达式在多行模式下不匹配空字符串 (Java)

java - Swing:随时间变化绘制可用性图表

mongodb - 多个集合作为hadoop mapreduce作业的mongodb的输入

java - 如何避免代码库中存在 keystore/trustore 纯文本密码?

javascript - 查找一个元素,使用数据,然后删除它

java - 检查对服务器的所有请求的有效负载