我目前正在使用Java,Maven,Jenkins和Artifactory构建项目的快照,并在Tomcat上运行WAR。
将一个WAR文件从Artifactory复制到Tomcat并重命名后,我基本上“丢失”了该应用程序的版本。我有两个远程团队,他们不断地在集成机器上放下战争,很快就会很难分辨出在哪里运行。
最终我希望能够在应用程序中查询它的版本,或者甚至只是在启动时将应用程序版本打印到日志文件中,但首先我必须将该版本放入war文件本身。
我不完全确定哪个实体负责创建版本,但它看起来像Artifactory创建SNAPSHOT版本,如“myapp-1.2.0-20140514.145130-1.war”。
我能想到的唯一解决方案是停止使用快照,在签入时手动增加maven版本,然后运行一个脚本,在编译之前将maven版本注入.java文件。呸。有没有办法让我用我当前的设置将这个版本放到应用程序中?
答案 0 :(得分:2)
这是一个相当普遍的问题。在这样的环境中,对于多个团队和提交,您可能希望拥有的不仅仅是一个简单的版本 - 即谁发起了这个构建,何时以及为什么/如何。看看这里:Job Exporter Plugin。它将输出一个很好的(Java友好的)格式化属性文件,您可以轻松地将其导入到您的应用程序中,以获取有关构建和部署该特定版本的应用程序的作业的所有详细信息。好吧,如果您要实现这一点 - 没有“开箱即用”的机制,您可以使用常规Java API编写自己的机制。
另一个选择是使用Maven的插件为您完成工作。由于它更便携,实际上更难实现。一种方法是使用Maven BuildNumber plugin。它可以使用时间戳,在一个属性文件中存储内部版本号并做很多事情......但它是本地的,因为这个文件应该不会被提交。另一种选择是依赖您的存储库(SVN,git或其他)并获取最后一个修订版ID(即使用this plugin)。它也很方便,但它并不完美且易于阅读。
我建议使用选项1 - Jenkins插件运行良好,您将获得更多方便的信息。只记得用if子句读取该文件,因此本地构建可以依赖其他东西,否则如果文件丢失,你将跳过阅读文件......
此外,我偶然发现了一个插件,可以很好地从Maven或SBT构建过程中提取你的版本 - Semantic Versioning Plugin。这就做了所宣传的内容 - 从POM或其他任何方面提取版本,并将其作为文件和构建过程中的变量包括在内。因此,您可以自由地使用这两者,或者在构建过程中包含文件并按照您的意愿执行操作和/或使用该变量来影响Jenkins中的构建流程。现在,因为这个插件仍然有几个错误,我想现在指向你自己的这个插件的构建,其中已经有修复,可以从这里获得。在将所有修复程序合并到官方插件的那一刻我将采用自己的版本...