大多數標準屬性可以直接從Package類閱讀:
String version = MyApplication.class.getPackage().getSpecificationVersion();
要閱讀定製atttributes,不使用java。 io.File類。您絕對不應該假設某個網址是file:
網址。
相反,你可以使用一個JarInputStream:
Manifest manifest;
try (JarInputStream jar = new JarInputStream(ljarLocationUrl.openStream())) {
manifest = jar.getManifest();
}
Attribute.Name name = new Attribute.Name("Revision-Number");
String revisionNumber = (String) manifest.getMainAttributes().get(name);
或者,你可以直接通過構建JarURLConnection複合網址閱讀清單:
URL manifestURL = new URL("jar:" + jarLocationUrl + "!/META-INF/MANIFEST.MF");
Manifest manifest;
try (InputStream manifestSource = manifestURL.openStream()) {
manifest = new Manifest(manifestSource);
}
Attribute.Name name = new Attribute.Name("Revision-Number");
String revisionNumber = (String) manifest.getMainAttributes().get(name);
注意ProtectionDomain.getCodeSource() can return null。在應用程序中指定版本號的更好方法是將其放入清單的Specification-Version或Implementation-Version屬性中,以便從Package方法中讀取它。請記住,雖然Implementation-Version是一個自由格式的字符串,a Specification-Version value must consist of groups of ASCII digits separated by periods。
另一種方法是簡單地創建一個數據文件,並將其包含在你的.jar,然後你就可以讀取使用Class.getResource或Class.getResourceAsStream:
Properties props = new Properties();
try (InputStream stream = MyApplication.class.getResourceAsStream("application.properties")) {
props.load(stream);
}
String revisionNumber = props.getProperty("version");
來源
2017-05-26 14:08:12
VGR
https://docs.oracle.com/javase/8 /docs/api/java/util/jar/JarFile.html#JarFile-java.io.File-,https://docs.oracle.com/javase/8/docs/api/java/util/jar/JarFile。 HTML#getManifest-- –