私は現在、J2MEポリッシュアプリケーションに取り組んでおり、それを強化するだけです。jarファイルの正確なバージョンを取得するのが難しいと感じています。クラスで行われたインポート用のjarファイルのバージョンを見つける方法はありますか?つまり、何かある場合は、xyzをインポートします。jar xyパッケージのバージョンが属していることを知ることができますか?
回答:
JARファイルを解凍し、マニフェストファイルを探します(META-INF\MANIFEST.MF
)。JARファイルのマニフェストファイルにはバージョン番号が含まれている場合があります(ただし、常にバージョンが指定されているとは限りません)。
sqljdbc42.jar
Cognosで使用したさまざまなファイルに記録されているバージョンはありませんが、Cognosはバージョン(4.2.6420.100)を報告できます。マニフェストに記録されていない場合、このバージョンはどこから入手できますか?
上記の回答を拡張するために、JARのMETA-INF / MANIFEST.MFファイル内に、次の行が表示される可能性があります。Manifest-Version: 1.0
←これはjarのバージョン番号ではありません。
あなたは探すために必要があるImplementation-Version
ので、完全にアップJARの作者にあなたがそこに見つけるものに、フリーテキスト文字列で存在する場合、これは。Oracleのドキュメントとパッケージバージョンの仕様も参照してください。
上記の答えを完了するためだけに。
マニフェストファイルは、jar内のMETA-INF\MANIFEST.MF
パスにあります。
zipをサポートするアーカイバでjarの内容を調べることができます。
各jarバージョンには、固有のチェックサムがあります。jar(バージョン情報がない)のチェックサムを計算し、それをjarのさまざまなバージョンと比較できます。チェックサムを使用してjarを検索することもできます。
チェックサムを計算するには、この質問を参照してください 。自分のマシンにあるファイルのチェックサムを計算する最良の方法は何ですか?
基本的に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も参照してください。
この単純なプログラムは、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を使用します。
私はこれに遅れていますが、あなたは次の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の詳細が必要な場合にうまく機能します。お役に立てれば。
を使用して、MANIFESTファイルからバージョンをフィルタリングできます。
unzip -p my.jar META-INF/MANIFEST.MF | grep 'Bundle-Version'
Bundle-Version
。
この質問はまだ検索でかなり高いので、私はもっと最近の答えを与えると思いました。
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