Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在生成时将源代码文件名或内容派生的数据添加到资源中_Java_Mongodb_Maven_Ant - Fatal编程技术网

Java 如何在生成时将源代码文件名或内容派生的数据添加到资源中

Java 如何在生成时将源代码文件名或内容派生的数据添加到资源中,java,mongodb,maven,ant,Java,Mongodb,Maven,Ant,背景 我正在使用开源项目mongobee将数据库迁移添加到现有项目中。实际迁移都由mongobee及其变更日志和变更集概念处理。此增强的一部分涉及在运行时检查当前MongoDB数据库迁移版本,并将其与java应用程序预期的版本进行比较。这背后的原因是,我们希望安装我们的产品下载代码更新(new*.wars),在登录新版本的应用程序时,如果管理员用户的数据库版本低于预期,则会提示他们更新数据库 我们目前正在使用Maven来打包和构建我们的软件 问题 困扰我的一个方面是如何处理标记Java源代码所期

背景

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

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

问题

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

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

1-这可行吗

2-有没有一种方法可以在纯Maven中不使用AntRun来做类似的事情


3-有没有其他更简单的方法来实现这一点?

作为我上面提出的解决方案的替代方案,我使用了一个在这里找到的反射项目:并迭代了我的迁移目录中遵循上述约定的所有类名(v0001\u第一次迁移,v0002\u第二次迁移)。我使用regex解析这些数据以获得一个整数,并进行比较以确定应用程序预期的迁移版本。数据库方面要简单得多,所以我就不赘述了

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


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

作为我上面提出的解决方案的替代方案,我使用了一个在这里找到的反射项目:并迭代了我的迁移目录中遵循上述约定的所有类名(V001_first_migration,V002_second_migration)。我使用regex解析这些数据以获得一个整数,并进行比较以确定应用程序预期的迁移版本。数据库方面要简单得多,所以我就不赘述了

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

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