在Java中,如何在日志文件中包含动态版本信息?

时间:2009-08-06 09:25:30

标签: java logging manifest

从Java应用程序中,我可以使用自定义日志记录框架记录字符串,如下所示:

logger.info("Version 1.2 of the application is currently running");

因此,当用户向我发送日志文件时,我可以很容易地看到他们正在运行的应用程序版本。

上面代码的问题是版本在字符串文字中是硬编码的,有人需要记住为每个版本更新它。对于发布而言,更新此字符串是相当不可避免的。

我想要做的是根据应用程序JAR的清单文件中的一个版本号自动更新此字符串文字:

Specification-Version: 1.2
Implementation-Version: 1.2.0.0

我不介意这是在编译时还是在运行时发生,只要版本号进入日志文件。

3 个答案:

答案 0 :(得分:4)

获取该信息的标准方法是SomeClass. class . getPackage() . getImplementationVersion()

您无需自行解析。

答案 1 :(得分:0)

您可以使用以下类

在运行时加载清单
public class ManifestFinder {

    private final Class<?> _theClass;


    public ManifestFinder(Class<?> theClass) {

        _theClass = theClass;
    }


    public Manifest findManifest() throws MalformedURLException, IOException {

        String className = _theClass.getSimpleName();
        String classFileName = className + ".class";
        String pathToThisClass = _theClass.getResource(classFileName).toString();

        int mark = pathToThisClass.indexOf("!");
        String pathToManifest = pathToThisClass.toString().substring(0, mark + 1);
        pathToManifest += "/META-INF/MANIFEST.MF";
        return new Manifest(new URL(pathToManifest).openStream());

    }

}

解析清单中的数据(未经测试)

 String specificationVersion = manifest.getMainAttributes().getValue("Implementation-Version");

然后在日志语句中包含已解析的版本

logger.info("Version " + specificationVersion + " of the application is currently running");

有关详细信息,请参阅the Jar file specification

答案 2 :(得分:-1)

因此您可以使用ClassLoader在运行时加载/ META-INF / MANIFEST。然后加载并解析Implementation-Version

String welcome = String.format("Version %s of the application is currently running",
                          implementationVersion);
logger.info(welcome);