我有一个用于群集的应用程序,以便在一个或多个失败时保持可用,并且我想实现一种方法来检查java中jar文件的版本。
我有这段代码(例如:在MyClass类中):
URLClassLoader cl = (URLClassLoader) (new MyClass ())
.getClass().getClassLoader();
URL url = cl.findResource("META-INF/MANIFEST.MF");
Manifest manifest = new Manifest(url.openStream());
attributes = manifest.getMainAttributes();
String version = attributes.getValue("Implementation-Version");
当我将jar作为应用程序运行时它工作正常但是当我在其他应用程序中使用jar文件作为librairie时,我得到了另一个应用程序的版本号。
所以我的问题是,如何获得包含MyClass的jar的清单?
注意:我对使用静态约束的解决方案不感兴趣 'classLoader.getRessource(“MyJar.jar”)'或File(“MyJar.jar”)
答案 0 :(得分:4)
获取实施版本的正确方法是使用Package.getImplementationVersion() method:
String version = MyClass.class.getPackage().getImplementationVersion();
答案 1 :(得分:3)
您可以编写如下代码:
java.io.File file = new java.io.File("/packages/file.jar"); //give path and file name
java.util.jar.JarFile jar = new java.util.jar.JarFile(file);
java.util.jar.Manifest manifest = jar.getManifest();
String versionNumber = "";
java.util.jar.Attributes attributes = manifest.getMainAttributes();
if (attributes!=null){
java.util.Iterator it = attributes.keySet().iterator();
while (it.hasNext()){
java.util.jar.Attributes.Name key = (java.util.jar.Attributes.Name) it.next();
String keyword = key.toString();
if (keyword.equals("Implementation-Version") || keyword.equals("Bundle-Version")){
versionNumber = (String) attributes.get(key);
break;
}
}
}
jar.close();
System.out.println("Version: " + versionNumber); //"here it will print the version"
请参阅this教程,谢谢。我也从这里学到新东西。
答案 2 :(得分:0)
如果你知道jar中的一个类,你可以从ProtectionDomain的CodeSource获取jar的位置。
http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getProtectionDomain%28%29
http://docs.oracle.com/javase/7/docs/api/java/security/ProtectionDomain.html#getCodeSource%28%29
http://docs.oracle.com/javase/7/docs/api/java/security/CodeSource.html#getLocation%28%29
答案 3 :(得分:0)
最后我从朋友那里得到了解决方案:
// Get jarfile url
String jarUrl = JarVersion.class
.getProtectionDomain().getCodeSource()
.getLocation().getFile();
JarFile jar = new JarFile(new File(jarUrl));
Manifest manifest = jar.getManifest();
Attributes attributes = manifest.getMainAttributes();
String version = attributes.getValue(IMPLEMENTATION_VERSION)