java - 部署后的 WAR 版本

标签 java maven jenkins artifactory

我目前正在使用 Java、Maven、Jenkins 和 Artifactory 构建项目快照,并在 Tomcat 上运行 WAR。

在我将 WAR 文件从 Artifactory 复制到 Tomcat 并重命名后,我基本上“丢失”了应用程序的版本。我有两个远程团队,他们不断地在集成机器之间发生冲突,很快就很难判断什么在哪里运行。

最终我希望能够查询应用程序的版本,甚至只是在启动时将应用程序版本打印到日志文件中,但首先我必须将版本放入 war 文件本身。

我不完全确定哪个实体负责创建该版本,但看起来是 Artifactory 创建了 SNAPSHOT 版本,例如“myapp-1.2.0-20140514.145130-1.war”。

我能想到的唯一解决方案是停止使用快照,在 checkin 时手动增加 Maven 版本,然后运行一个脚本,在编译之前将 Maven 版本注入(inject)到 .java 文件中。恶心。有没有办法可以使用我当前的设置将此版本添加到应用程序中?

最佳答案

这是一个相当常见的问题。在这样的环境中,有多个团队和提交,您可能想要的不仅仅是一个简单的版本 - 即谁发起了此构建、何时以及为什么/如何发起此构建。看看这里:Job Exporter Plugin 。它将输出一个格式良好(Java 友好)的属性文件,您可以轻松地将其导入到应用程序中,以便获取有关负责构建和部署应用程序的特定版本的作业的所有详细信息。好吧,如果您要实现这一点 - 没有“开箱即用”的机制可以做到这一点,您可以使用常规 Java API 编写自己的机制。

另一个选择是使用 Maven 的插件来为您完成这项工作。由于它更便携一些,所以实际上更难实现。一种方法是使用 Maven BuildNumber plugin 。它可以使用时间戳,将内部版本号存储在属性文件中并执行很多操作...但它是本地的,因为该文件可能不应该提交。另一种选择是依赖您的存储库(SVN、git 或其他)并获取最后的修订 ID(即使用 this plugin )。它也很方便,但并不完美且易于阅读。

我建议使用选项 1 - Jenkins 插件效果很好,您将获得更多方便的信息。只需记住使用 if 子句读取该文件,以便本地构建可以依赖其他内容,否则如果文件丢失,您将跳过读取该文件...


此外,我偶然发现了一个插件,它可以很好地从 Maven 或 SBT 构建过程中提取您的版本 - 语义版本控制插件。这会执行所宣传的内容 - 从 POM 或其他内容中提取版本,并将其作为文件和变量包含在构建过​​程中。因此,您可以自由地使用两者,或者将文件包含在构建过​​程中并执行您想要的操作和/或使用变量来影响 Jenkins 中的构建流程。现在,因为这个插件仍然有几个错误,所以我想暂时向您指出我自己构建的这个插件,其中已经有修复程序可以从这里获得。当所有修复都将合并到官方插件中时,我将删除我自己的版本...

关于java - 部署后的 WAR 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23685286/

相关文章:

java - java中的骰子模拟

java - 在eclipse中编译spark项目时出现问题

java - derby 数据库的驱动程序名称

java - Java 内存消耗是一个好的 Web 应用程序健康检查指标吗?

java - 文件 io 搜索直到匹配 java

java - 发布Maven "Vendor Branches"

java - 无法找到/解决 Artifact : Maven error

c++ - 在我的项目中包含 C++ 库的最佳实践

jenkins - 如何在Jenkins Git插件中指定Job DSL checkout 超时?

amazon-web-services - AWS ECS和Docker:无法通过tcp://<MY-ID> .dkr.ecr.us-east-1.amazonaws.com:2375/<PROJECT>连接到Docker守护程序