如何在运行Tomcat时获取软件包版本?

时间:2013-02-18 10:38:36

标签: java eclipse maven tomcat manifest.mf

如何在运行Tomcat时获取软件包版本?

我尝试使用getClass()。getPackage()。getImplementationVersion(),但这总是返回null。 我想这是因为我的战争尚未打包,Tomcat执行.classes(又名爆炸战争)。 META-INF\MANIFEST.MF出现在最终战争中,但不在target\<project.name>\META-INF文件夹

  

java.lang.Package

     

包对象包含有关实现的版本信息   和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>

2 个答案:

答案 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"