如何在运行Tomcat时获取软件包版本?
我尝试使用getClass()。getPackage()。getImplementationVersion(),但这总是返回null
。
我想这是因为我的战争尚未打包,Tomcat执行.classes(又名爆炸战争)。
META-INF\MANIFEST.MF
出现在最终战争中,但不在target\<project.name>\META-INF
文件夹
包对象包含有关实现的版本信息 和Java包的规范。此版本控制信息是 检索并由加载的ClassLoader实例提供 这个班级。通常,它存储在清单中 与班级一起分发。
相关的是Get Maven artifact version at runtime
更新。在我已经为war build添加配置之前。但是当从Eclipse运行Tomcat时,我得到null
。
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.1</version>
<configuration>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
</archive>
<!-- this actually moves classes from \WEB-INF\classes to new jar
<archiveClasses>true</archiveClasses>
-->
</configuration>
</plugin>
答案 0 :(得分:16)
解决了
1)使用mvn war:manifest
在webapp文件夹中创建META-INF \ MANIFEST.MF
2)编码
version = getClass().getPackage().getImplementationVersion();
if (version==null) {
Properties prop = new Properties();
try {
prop.load(getServletContext().getResourceAsStream("/META-INF/MANIFEST.MF"));
version = prop.getProperty("Implementation-Version");
} catch (IOException e) {
logger.error(e.toString());
}
}
logger.info("Starting App version "+version);
感谢@javadude在How do I read the manifest file for a webapp running in apache tomcat?
的回答答案 1 :(得分:1)
包的版本/标题/供应商信息的正常来源是JAR文件清单中的属性。请参阅JAR File Specification。
如果getters返回null
,则表示尚未指定相应的属性。 (这对于常规JAR文件也是正常的。)
是的,它与链接的问题有关。接受的答案描述了如何告诉Maven将一些Maven版本的详细信息添加到JAR清单中,以便您可以使用Package
API在运行时访问它们。
如何在运行Tomcat时获取软件包版本?
您需要创建JAR文件,并将版本信息放入相应的JAR清单中。显然,您也可以在WAR文件级别执行此操作。
参考:Fred Puls的"Deploy: War File Versioning and Manifest Reader"。