2014-06-19 142 views
4

我有一個應用程序用於羣集,以保持它可用,如果一個或多個失敗,我想實現一種方法來檢查在Java中的jar文件的版本。獲取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文件作爲LIBRAIRIE在另一個應用程序中,我得到另一個應用程序的版本號。

所以我的問題是,我如何獲得包含MyClass的jar的清單?

注:我沒有興趣在溶液中使用靜態約束像 'classLoader.getRessource( 「MyJar.jar」)' 或文件( 「MyJar.jar」)

回答

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) 
2

您可以編寫這樣的:

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教程,謝謝。我也從這裏學到新東西。

+0

是的,我也發現這個解決方案,但它不能解決我的問題,因爲我必須知道我的jar文件的限定名稱。我想要一個動態的解決方案,可以在不受限制的情況下工作,如文件名:/ .. – Kraiss

+0

好的,讓我在某個時間後再次發佈。 –

+0

好吧,我有一個解決方案!謝謝你!!只是讓時間來發布它;) – Kraiss