現在、J2MEポーランド語アプリケーションに取り組んでおり、それを強化しています。 jarファイルの正確なバージョンを取得するのが難しいと感じています。クラスで行われたインポートのjarファイルのバージョンを見つける方法はありますか?もし何かあるなら、x.y.zをインポートしてください。 jar x.yパッケージが属するバージョンを知ることができますか?
JARファイルを解凍し、マニフェストファイル(META-INF\MANIFEST.MF
)を探します。 JARファイルのマニフェストファイルにはバージョン番号が含まれている場合があります(ただし、常にバージョンが指定されているとは限りません)。
解凍して、そのMETA-INF/MANIFEST.MF
ファイルを確認する必要があります。
unzip -p file.jar | head
より具体的に:
unzip -p file.jar META-INF/MANIFEST.MF
上記の回答を展開すると、JARのMETA-INF/MANIFEST.MFファイル内に次の行が表示される可能性があります。Manifest-Version: 1.0
←これはではなくjarバージョン番号!
Implementation-Version
を探す必要があります。これは、存在する場合は、JARの作成者が完全に自由に使える文字列です。 Oracle docs および Package Version specificaion も参照してください
上記の答えを完了するためだけです。
マニフェストファイルは、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();
Logbackは、この機能を使用して、生成されたスタックトレースの各クラスの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-core jarを使用します
私はこれに遅れていますが、次の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'
Linuxの場合、次のことを試してください。
見つける 。 -name "YOUR_JAR_FILE.jar" -exec zipgrep "Implementation-Version:" '{}' \; | awk -F ':' '{print $ 2}'