jar dosyasının sürümü nasıl kontrol edilir?


91

Şu anda bir J2ME lehçe uygulaması üzerinde çalışıyorum, sadece onu geliştiriyorum. Jar dosyasının tam sürümünü almakta zorluk çekiyorum. Sınıfta yapılan içe aktarmalar için jar dosyasının sürümünü bulmanın bir yolu var mı? Demek istediğim, eğer bir şeyiniz varsa, xyz'i içe aktarın; jar xy paketinin sürümünün ait olduğunu bilebilir miyiz?

Yanıtlar:


78

JAR dosyasını açın ve manifest dosyasını ( META-INF\MANIFEST.MF) arayın . JAR dosyasının manifest dosyası bir sürüm numarası içerebilir (ancak her zaman bir sürüm belirtilmez).


Uygulamayı geliştirmek için çalıştığımı söylediğim gibi, jar dosyalarını indirdim ve jar dosyalarının sürümünü biliyorum. Ama paketin ait olduğu kavanozun versiyonunu bilmek istedim, umarım alırsınız.
Ritesh Mengji

Size daha fazla açıklamak gerekirse, xyz ithal ettim, xy'nin a-4.1.jar'a ait olduğunu biliyorum, ancak çalıştığım uygulama uzun süredir geliştirildi ve a.jar dosyasının hangi sürümünü kullandıklarını bilmiyorum, ben sürüm konusunda endişeliyim çünkü bazı sınıflar eski sürümün kavanozundan amortismana tabi
tutuldu

Öyleyse, uygulamayı oluştururken kullandıkları jar sürümünü biliyorsanız, uygulamayı çalıştırmak için aynı jar sürümünü de kullanırdınız mı?
Vivek

1
Gereksiniminiz buysa, korkarım kullanımdan kaldırılan kavanozları hariç tutarak uygulamayı yeniden oluşturmanız gerekecek. Çünkü belirli bir jar ile ilişkili sürüm numarasını bulmak bire bir işlev gibidir. Bir jar dosyası için yalnızca bir sürüm numarası. Ancak, uygulama geliştirilirken hangi jar sürümünün kullanıldığını bulmak, geliştirici gerekli kavanozları uygulamaya eklemediği sürece bana oldukça imkansız geliyor.
Vivek

1
MANIFEST.MF'de kayıt sürümü isteğe bağlı gibi görünüyor. sqljdbc42.jarCognos ile kullandığım çeşitli dosyalarda kaydedilmiş bir sürüm yok , ancak Cognos bir sürümü (4.2.6420.100) bildirebiliyor. Bildiride kayıtlı değilse bu sürümü nereden alıyor?
Nick.McDermaid

52

Dosyayı açmanız ve META-INF/MANIFEST.MFdosyasını kontrol etmeniz gerekir , örn.

unzip -p file.jar | head

veya daha spesifik:

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

26

Yukarıdaki yanıtları genişletmek için JAR'daki META-INF / MANIFEST.MF dosyasında büyük olasılıkla bir satır göreceksiniz: Manifest-Version: 1.0 ← Bu DEĞİL jar sürüm numarası !

Implementation-VersionVarsa, orada ne bulacağınız konusunda tamamen JAR'ın yazarına bağlı bir serbest metin dizesi olup olmadığına bakmanız gerekir . Oracle belgeleri ve Paket Sürümü belirtimine de bakın


Bu cevap (ve diğerleri) şu anda Meta
Thomas Weller 9'15

17

Sadece yukarıdaki cevabı tamamlamak için.

Manifest dosyası, META-INF\MANIFEST.MFyolda kavanozun içinde bulunur .

Zip'i destekleyen herhangi bir arşivleyicide kavanozun içeriğini inceleyebilirsiniz.


2
Bu cevap (ve diğerleri) şu anda Meta
Thomas Weller 9'15

11

Her bir jar sürümünün benzersiz bir sağlama toplamı vardır. Sağlama toplamını (sürüm bilgisi olmayan) kavanozunuz için hesaplayabilir ve kavanozun farklı sürümleriyle karşılaştırabilirsiniz. Sağlama toplamını kullanarak bir kavanoz da arayabiliriz.

Sağlama toplamını hesaplamak için bu Soruya bakın: Makinemdeki bir dosya için sağlama toplamını hesaplamanın en iyi yolu nedir?


5
Jar md5'i hesapladım ve google'a yapıştırdım. Harika çalıştı, çok teşekkürler!
mik01aj

7

Temel olarak java.lang.Package, sınıflarınız hakkında size bilgi vermek için sınıf yükleyiciyi kullanan sınıfı kullanmalısınız.

misal:

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

Logback'in, üretilen yığın izlerinde her bir sınıfın JAR adını / sürümünü izlemek için bu özelliği kullandığı bilindiğini düşünüyorum.

ayrıca bkz. http://docs.oracle.com/javase/8/docs/technotes/guides/versioning/spec/versioning2.html#wp90779


3

Bu basit program, jar sürümünün tüm durumlarını yani

  • Manifest dosyasında bulunan sürüm
  • Manifest'te ve hatta jar adında sürüm bulunamadı
  • Manifest dosyası bulunamadı

    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/ adresinden indirilebilen javaxt çekirdekli kavanozu kullanır.


Javaxt referansınız için teşekkürler, javaxt.com/Tutorials/Jar/… adresinden daha basit kod örneğini kullandım
David,

1
Bilginize, JAR'ı indirmek yerine javaxt-core'u çekmeyi tercih edenler için, şu yaklaşımlardan birini uygulayabilirsiniz : gist.github.com/daluu/dda7b29cb5b6e0fbfbaec664eb759739 , gist.github.com/daluu/52af7eef52563ddf78fe
David

2

Geç kaldım ama aşağıdaki iki yöntemi deneyebilirsiniz

bu gerekli sınıfları kullanarak

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

Bu yöntemler jar niteliklerine erişmeme izin veriyor. Geriye dönük uyumlu olmayı ve en yenisini kullanmayı seviyorum. Bu yüzden bunu kullandım

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

Bu, maven kullanırken ve bilinen sınıflar için pom ayrıntılarına ihtiyaç duyduğunuzda iyi çalışır. Bu yardımcı olur umarım.


1

Linux için şunları deneyin:

bul. -name "YOUR_JAR_FILE.jar" -exec zipgrep "Uygulama Sürümü:" '{}' \; | awk -F ':' '{print $ 2}'


1

Winrar'ınız varsa, kavanozu winrar ile açın, klasörü açmak için çift tıklayın META-INF. Herhangi bir konuma çıkartın MANIFEST.MFve CHANGESdosyalar (örneğin masaüstü).

Çıkarılan dosyaları bir metin düzenleyicide açın: Uygulama Sürümü veya yayın sürümünü göreceksiniz.


0

MANIFEST dosyasından sürümü şu şekilde filtreleyebilirsiniz:

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


Bu, çoğunlukla bu eski yanıtı ( stackoverflow.com/a/38313502/272387) yineliyor gibi görünüyor ve bildirimlerin sahip olacağı garanti edilmiyor Bundle-Version.
Richlv

0

Bu soru hala aramalarda oldukça yüksek çıktığı için daha yeni bir cevap vereceğimi düşündüm.

CLi JAR Sürümü kontrol ediliyor:

CLi jar dosyasında aşağıdakileri çalıştırın:

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

Örnek Çıktı:

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 sürümü yukarıda listelenmiştir.

Sunucu Sürümünü almak için aşağıdakileri çalıştırın:

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

(yukarıdakiler, kimlik doğrulama uygulamanıza göre değişiklik gösterir, lütfen buna göre değiştirin)

Örnek Çıktı:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.