bagaimana cara memeriksa versi file jar?

91

Saat ini saya sedang mengerjakan aplikasi polish J2ME, hanya menyempurnakannya. Saya mengalami kesulitan untuk mendapatkan versi yang tepat dari file jar. Apakah ada cara untuk menemukan versi file jar untuk impor yang dilakukan di kelas? Maksud saya, jika Anda memiliki sesuatu, impor xyz; bisakah kita mengetahui versi dari paket jar xy milik?

Ritesh Mengji
sumber

Jawaban:

78

Dekompresi file JAR dan cari file manifes ( META-INF\MANIFEST.MF). File manifes file JAR mungkin berisi nomor versi (tetapi tidak selalu versi yang ditentukan).

Vivek
sumber
Seperti yang saya katakan bahwa saya sedang bekerja untuk meningkatkan aplikasi, saya telah mengunduh file jar dan saya tahu versi file jar. Tapi saya ingin tahu versi toples tempat paket itu berada, saya harap Anda mendapatkannya.
Ritesh Mengji
Untuk menjelaskan lebih lanjut, saya telah mengimpor xyz, saya tahu bahwa xy milik a-4.1.jar, tetapi aplikasi yang saya kerjakan telah dikembangkan sejak lama, dan saya tidak tahu versi file a.jar apa yang mereka gunakan, saya Saya khawatir tentang versinya karena, beberapa kelas telah disusutkan dari toples versi yang lebih lama (saya merasa begitu), karena, meskipun saya memiliki toples di perpustakaan, saya menemukan impor tidak dapat diselesaikan
Ritesh Mengji
Jadi apakah, jika Anda mengetahui versi jar yang mereka gunakan saat membuat aplikasi, Anda juga akan menggunakan versi jar yang sama untuk menjalankan aplikasi?
Vivek
1
Jika itu yang Anda butuhkan, maka khawatir Anda harus membangun kembali aplikasi dengan pengecualian toples usang. Karena menemukan nomor versi yang terkait dengan toples tertentu seperti fungsi satu ke satu. Hanya satu nomor versi untuk satu file jar. Tetapi menemukan versi jar mana yang digunakan pada saat pengembangan aplikasi terdengar sangat mustahil bagi saya kecuali pengembang melampirkan toples yang diperlukan dengan aplikasi tersebut.
Vivek
1
Versi rekaman di MANIFEST.MF tampaknya opsional. Tidak ada versi yang tercatat dalam berbagai sqljdbc42.jarfile yang saya gunakan dengan Cognos, namun Cognos dapat melaporkan sebuah versi (4.2.6420.100). Dari mana mendapatkan versi ini jika tidak dicatat dalam manifes?
Nick.McDermaid
52

Anda perlu mengekstraknya dan memeriksa META-INF/MANIFEST.MFfile -nya , mis

unzip -p file.jar | head

atau lebih spesifik:

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

Hanya untuk memperluas jawaban di atas, di dalam file META-INF / MANIFEST.MF di JAR, Anda mungkin akan melihat baris: Manifest-Version: 1.0 ← Ini BUKAN nomor versi jar!

Anda perlu mencari Implementation-Versionyang, jika ada, merupakan string teks bebas sehingga sepenuhnya terserah penulis JAR untuk apa yang akan Anda temukan di sana. Lihat juga spesifikasi Oracle Docs dan Package Version

lelucon
sumber
Jawaban ini (dan lainnya) saat ini dibahas di Meta
Thomas Weller
17

Sekadar melengkapi jawaban di atas.

File manifes terletak di dalam jar di META-INF\MANIFEST.MFjalur.

Anda dapat memeriksa konten jar di semua pengarsip yang mendukung zip.

Vadzim
sumber
2
Jawaban ini (dan lainnya) saat ini dibahas di Meta
Thomas Weller
11

Setiap versi jar memiliki checksum unik. Anda dapat menghitung checksum untuk toples Anda (yang tidak memiliki info versi) dan membandingkannya dengan berbagai versi toples. Kami juga dapat mencari botol menggunakan checksum.

Lihat Pertanyaan ini untuk menghitung checksum: Apa cara terbaik untuk menghitung checksum untuk file yang ada di mesin saya?

vijay
sumber
5
Saya baru saja menghitung jar md5 dan menempelkannya ke google. Berhasil, terima kasih banyak!
mik01aj
7

Pada dasarnya Anda harus menggunakan java.lang.Packagekelas yang menggunakan classloader untuk memberikan informasi tentang kelas Anda.

contoh:

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

Saya pikir logback diketahui menggunakan fitur ini untuk melacak nama / versi JAR setiap kelas dalam stacktraces yang dihasilkan.

lihat juga http://docs.oracle.com/javase/8/docs/technotes/guides/versioning/spec/versioning2.html#wp90779

Donatello
sumber
3

Program sederhana ini akan mencantumkan semua kasus untuk versi jar yaitu

  • Versi ditemukan di file Manifes
  • Tidak ada versi yang ditemukan di Manifes dan bahkan dari nama jar
  • File manifes tidak ditemukan

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

Ini menggunakan jar javaxt-core yang dapat diunduh dari http://www.javaxt.com/downloads/

Shanky_Gupta
sumber
Terima kasih atas referensi ke javaxt, saya baru saja menggunakan contoh kode yang lebih sederhana dari javaxt.com/Tutorials/Jar/…
David
1
FYI, bagi mereka yang lebih memilih maven untuk menarik javaxt-core daripada mengunduh JAR, Anda dapat melakukan salah satu dari pendekatan ini: gist.github.com/daluu/dda7b29cb5b6e0fbfbaec664eb759739 , gist.github.com/daluu/52af7eef52563ddf78fe
David
2

Saya terlambat tetapi Anda dapat mencoba dua metode berikut

menggunakan kelas yang dibutuhkan ini

import java.util.jar.Attributes;
import java.util.jar.Manifest;

Metode ini memungkinkan saya mengakses atribut jar. Saya suka kompatibel ke belakang dan menggunakan yang terbaru. Jadi saya menggunakan ini

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;
}

Ini bekerja dengan baik ketika Anda menggunakan maven dan membutuhkan detail pom untuk kelas yang dikenal. Semoga ini membantu.

GetBackerZ
sumber
1

Untuk Linux, coba berikut ini:

Temukan . -name "YOUR_JAR_FILE.jar" -exec zipgrep "Implementasi-Versi:" '{}' \; | awk -F ':' '{print $ 2}'

Bae Cheol Shin
sumber
1

Jika Anda memiliki winrar, buka toples dengan winrar, klik dua kali untuk membuka folder META-INF. Ekstrak MANIFEST.MFdan CHANGESfile ke lokasi mana pun (misalnya desktop).

Buka file yang diekstrak di editor teks: Anda akan melihat Versi-Implementasi atau versi rilis.

Ganesan R
sumber
0

Anda dapat memfilter versi dari file MANIFEST menggunakan

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

Sudheer Avula
sumber
Hal ini tampaknya sebagian besar menduplikasi jawaban lama ini - stackoverflow.com/a/38313502/272387 - dan manifes tidak dijamin ada Bundle-Version.
Richlv
0

Pikir saya akan memberikan jawaban yang lebih baru karena pertanyaan ini masih muncul cukup tinggi pada pencarian.

Memeriksa Versi CLi JAR:

Jalankan perintah berikut pada file jar CLi:

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

Contoh Output:

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

Versi CLi tercantum di atas.

Untuk mendapatkan Versi Server, jalankan perintah berikut:

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

(di atas akan bervariasi berdasarkan penerapan otentikasi Anda, harap ubah sesuai)

Contoh Output:

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
DC.Skells
sumber
-14

Itu dapat diperiksa dengan perintah java -jar jarname

Akash Tolia
sumber
6
Ini akan menjalankan main()metode JAR
Thomas Weller