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?

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


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

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


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.


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


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


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/


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.


1

Untuk Linux, coba berikut ini:

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


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.



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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.