web-dev-qa-db-ja.com

jarファイルのバージョンを確認する方法は?

現在、J2MEポーランド語アプリケーションに取り組んでおり、それを強化しています。 jarファイルの正確なバージョンを取得するのが難しいと感じています。クラスで行われたインポートのjarファイルのバージョンを見つける方法はありますか?もし何かあるなら、x.y.zをインポートしてください。 jar x.yパッケージが属するバージョンを知ることができますか?

74
Ritesh

JARファイルを解凍し、マニフェストファイル(META-INF\MANIFEST.MF)を探します。 JARファイルのマニフェストファイルにはバージョン番号が含まれている場合があります(ただし、常にバージョンが指定されているとは限りません)。

64
Vivek

解凍して、そのMETA-INF/MANIFEST.MFファイルを確認する必要があります。

unzip -p file.jar | head

より具体的に:

unzip -p file.jar META-INF/MANIFEST.MF
42
kenorb

上記の回答を展開すると、JARのMETA-INF/MANIFEST.MFファイル内に次の行が表示される可能性があります。Manifest-Version: 1.0←これはではなくjarバージョン番号!

Implementation-Versionを探す必要があります。これは、存在する場合は、JARの作成者が完全に自由に使える文字列です。 Oracle docs および Package Version specificaion も参照してください

24
joth

上記の答えを完了するためだけです。

マニフェストファイルは、jar内のMETA-INF\MANIFEST.MFパスにあります。

Zipをサポートする任意のアーカイバでjarの内容を調べることができます。

17
Vadzim

各jarバージョンには一意のチェックサムがあります。 jar(バージョン情報がなかった)のチェックサムを計算し、jarの異なるバージョンと比較できます。チェックサムを使用してjarを検索することもできます。

チェックサムを計算するには、この質問を参照してください: 私のマシン上にあるファイルのチェックサムを計算する最良の方法は何ですか?

11
vijay

基本的に、クラスローダーを使用するJava.lang.Packageクラスを使用して、クラスに関する情報を提供する必要があります。

例:

String.class.getPackage().getImplementationVersion();
Package.getPackage(this).getImplementationVersion();
Package.getPackage("Java.lang.String").getImplementationVersion();

Logbackは、この機能を使用して、生成されたスタックトレースの各クラスのJAR名/バージョンをトレースすることが知られていると思います。

http://docs.Oracle.com/javase/8/docs/technotes/guides/versioning/spec/versioning2.html#wp90779 も参照してください

5
Donatello

この簡単なプログラムは、jarのバージョンのすべてのケースをリストします。

  • マニフェストファイルで見つかったバージョン
  • マニフェスト内およびjar名からもバージョンが見つかりません
  • マニフェストファイルが見つかりません

    Map<String, String> jarsWithVersionFound   = new LinkedHashMap<String, String>();
    List<String> jarsWithNoManifest     = new LinkedList<String>();
    List<String> jarsWithNoVersionFound = new LinkedList<String>();
    
    //loop through the files in lib folder
    //pick a jar one by one and getVersion()
    //print in console..save to file(?)..maybe later
    
    File[] files = new File("path_to_jar_folder").listFiles();
    
    for(File file : files)
    {
        String fileName = file.getName();
    
    
        try
        {
            String jarVersion = new Jar(file).getVersion();
    
            if(jarVersion == null)
                jarsWithNoVersionFound.add(fileName);
            else
                jarsWithVersionFound.put(fileName, jarVersion);
    
        }
        catch(Exception ex)
        {
            jarsWithNoManifest.add(fileName);
        }
    }
    
    System.out.println("******* JARs with versions found *******");
    for(Entry<String, String> jarName : jarsWithVersionFound.entrySet())
        System.out.println(jarName.getKey() + " : " + jarName.getValue());
    
    System.out.println("\n \n ******* JARs with no versions found *******");
    for(String jarName : jarsWithNoVersionFound)
        System.out.println(jarName);
    
    System.out.println("\n \n ******* JARs with no manifest found *******");
    for(String jarName : jarsWithNoManifest)
        System.out.println(jarName);
    

http://www.javaxt.com/downloads/ からダウンロードできるjavaxt-core jarを使用します

3
Shanky_Gupta

私はこれに遅れていますが、次の2つの方法を試すことができます

これらの必要なクラスを使用する

import Java.util.jar.Attributes;
import Java.util.jar.Manifest;

これらのメソッドにより、jar属性にアクセスできます。後方互換性があり、最新のものを使用しています。だから私はこれを使用しました

public Attributes detectClassBuildInfoAttributes(Class sourceClass) throws MalformedURLException, IOException {
    String className = sourceClass.getSimpleName() + ".class";
    String classPath = sourceClass.getResource(className).toString();
    if (!classPath.startsWith("jar")) {
      // Class not from JAR
      return null;
    }
    String manifestPath = classPath.substring(0, classPath.lastIndexOf("!") + 1) + 
        "/META-INF/MANIFEST.MF";
    Manifest manifest = new Manifest(new URL(manifestPath).openStream());
    return manifest.getEntries().get("Build-Info");
}

public String retrieveClassInfoAttribute(Class sourceClass, String attributeName) throws MalformedURLException, IOException {
    Attributes version_attr = detectClassBuildInfoAttributes(sourceClass);

    String attribute = version_attr.getValue(attributeName);

    return attribute;
}

これは、Mavenを使用していて、既知のクラスのPOMの詳細が必要な場合にうまく機能します。お役に立てれば。

2
GetBackerZ

MANIFESTファイルからバージョンをフィルタリングするには、次を使用します

unzip -p my.jar META-INF/MANIFEST.MF | grep 'Bundle-Version'

0
Sudheer Avula

Linuxの場合、次のことを試してください。

見つける 。 -name "YOUR_JAR_FILE.jar" -exec zipgrep "Implementation-Version:" '{}' \; | awk -F ':' '{print $ 2}'

0
Bae Cheol Shin