gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:55:05 25 4
gpt4 key购买 nike

背景

我正在使用开源项目 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com