7

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

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

java.lang.Package

包对象包含有关 Java 包的实现和规范的版本信息。此版本信息由加载类的 ClassLoader 实例检索并提供。通常,它存储在与类一起分发的清单中。

相关的是在运行时获取 Maven 工件版本

更新。在我已经为战争构建添加配置之前。但是当从 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>
4

2 回答 2

17

解决方法1)使用 2)编码
在 webapp 文件夹中创建 META-INF\MANIFEST.MFmvn war:manifest

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 在如何读取在 apache tomcat 中运行的 webapp 的清单文件?

于 2013-02-19T05:36:48.077 回答
2

包的版本/标题/供应商信息的正常来源是 JAR 文件清单中的属性。请参阅JAR 文件规范

如果 getter 返回null,则表示尚未指定相应的属性。(这对于常规 JAR 文件也是正常的。)

是的,它与链接的问题有关。接受的答案描述了如何告诉 Maven 将一些 Maven 版本详细信息添加到 JAR 清单中,以便您可以在运行时使用PackageAPI 访问它们。


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

您需要创建 JAR 文件,并将版本信息放入相应的 JAR 清单中。显然,您也可以在 WAR 文件级别执行此操作。

参考: Fred Puls 的“部署:战争文件版本控制和清单阅读器”

于 2013-02-18T11:49:42.043 回答