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


91

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

回答:


78

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


アプリケーションの拡張に取り組んでいると言ったので、jarファイルをダウンロードし、jarファイルのバージョンを知っています。しかし、パッケージが属するjarのバージョンを知りたかったので、入手していただければ幸いです。
Ritesh Mengji 2011

詳細を説明すると、xyzをインポートし、xyがa-4.1.jarに属していることを知っていますが、私が作業しているアプリケーションはずっと前に開発されており、どのバージョンのa.jarファイルを使用しているかわかりません。一部のクラスが古いバージョンのjarから減価償却されているため(そう感じます)、バージョンについて心配しています。ライブラリにjarがありますが、インポートを解決できないことがわかったためです
Ritesh Mengji

それで、アプリケーションのビルド中に使用したjarのバージョンがわかっている場合は、同じバージョンのjarを使用してアプリケーションを実行することになるのでしょうか。
Vivek 2011

1
それが要件である場合は、非推奨のjarを除外してアプリケーションを再構築する必要があるのではないかと心配しています。特定のjarに関連付けられたバージョン番号を見つけることは、1対1の関数のようなものだからです。1つのjarファイルに対して1つのバージョン番号のみ。しかし、アプリケーションの開発時に使用されたjarのバージョンを見つけることは、開発者が必要なjarをアプリケーションに添付しない限り、私には非常に不可能に思えます。
Vivek 2011

1
MANIFEST.MFの記録バージョンはオプションのようです。sqljdbc42.jarCognosで使用したさまざまなファイルに記録されているバージョンはありませんが、Cognosはバージョン(4.2.6420.100)を報告できます。マニフェストに記録されていない場合、このバージョンはどこから入手できますか?
Nick.McDermaid

52

あなたはそれを解凍してそのMETA-INF/MANIFEST.MFファイルをチェックする必要があります、例えば

unzip -p file.jar | head

またはより具体的に:

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

26

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

あなたは探すために必要があるImplementation-Versionので、完全にアップJARの作者にあなたがそこに見つけるものに、フリーテキスト文字列で存在する場合、これは。Oracleのドキュメントパッケージバージョンの仕様も参照してください。


この回答(およびその他)は現在、Meta
Thomas Weller 2015

17

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

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

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


2
この回答(およびその他)は現在、Meta
Thomas Weller 2015

11

各jarバージョンには、固有のチェックサムがあります。jar(バージョン情報がない)のチェックサムを計算し、それをjarのさまざまなバージョンと比較できます。チェックサムを使用してjarを検索することもできます。

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


5
jar md5を計算して、googleに貼り付けました。うまくいきました、どうもありがとう!
mik01aj 2014年

7

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

例:

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

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

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


3

この単純なプログラムは、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-corejarを使用します。


javaxtを参照していただきありがとうございます。ここでは、javaxt.com / Tutorials / Jar
David

1
FYI、むしろJARをダウンロードするよりも、プルjavaxt-コアにMavenを好む人のために、あなたはこれらのアプローチのいずれかを行うことができます:gist.github.com/daluu/dda7b29cb5b6e0fbfbaec664eb759739gist.github.com/daluu/52af7eef52563ddf78fe
デヴィッド・

2

私はこれに遅れていますが、あなたは次の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の詳細が必要な場合にうまく機能します。お役に立てれば。


1

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

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


1

winrarを使用している場合は、winrarでjarを開き、ダブルクリックしてフォルダを開きますMETA-INF。任意の場所(デスクトップなど)に抽出MANIFEST.MFしてCHANGESファイルします。

抽出したファイルをテキストエディタで開きます。実装バージョンまたはリリースバージョンが表示されます。


0

を使用して、MANIFESTファイルからバージョンをフィルタリングできます。

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


これは、この古い答え(stackoverflow.com/a/38313502/272387)とほとんど重複しているようで、マニフェストにが保証されているわけではありませんBundle-Version
Richlv

0

この質問はまだ検索でかなり高いので、私はもっと最近の答えを与えると思いました。

CLi JARバージョンの確認:

CLijarファイルで以下を実行します。

unzip -p jenkins-cli.jar META-INF/MANIFEST.MF

出力例:

Manifest-Version: 1.0
Built-By: kohsuke
Jenkins-CLI-Version: 2.210  <--- Jenkins CLI Version
Created-By: Apache Maven 3.6.1
Build-Jdk: 1.8.0_144
Main-Class: hudson.cli.CLI

CLiバージョンは上記のとおりです。

サーバーバージョンを取得するには、以下を実行します。

java -jar ./jenkins-cli.jar -s https://<Server_URL> -auth <email>@<domain>.com:<API Token> version

(上記は認証の実装によって異なります。それに応じて変更してください)

出力例:

Dec 23, 2019 4:42:55 PM org.apache.sshd.common.util.security.AbstractSecurityProviderRegistrar getOrCreateProvider
INFO: getOrCreateProvider(EdDSA) created instance of net.i2p.crypto.eddsa.EdDSASecurityProvider
2.210  <-- Jenkins Server Version

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.