从Java应用程序中,我可以使用自定义日志记录框架记录字符串,如下所示:
logger.info("Version 1.2 of the application is currently running");
因此,当用户向我发送日志文件时,我可以很容易地看到他们正在运行的应用程序版本。
上面代码的问题是版本在字符串文字中是硬编码的,有人需要记住为每个版本更新它。对于发布而言,更新此字符串是相当不可避免的。
我想要做的是根据应用程序JAR的清单文件中的一个版本号自动更新此字符串文字:
Specification-Version: 1.2
Implementation-Version: 1.2.0.0
我不介意这是在编译时还是在运行时发生,只要版本号进入日志文件。
答案 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);