जार फ़ाइल के संस्करण की जांच कैसे करें?


91

मैं वर्तमान में एक J2ME पॉलिश एप्लिकेशन पर काम कर रहा हूं, बस इसे बढ़ा रहा हूं। मैं जार फ़ाइल का सटीक संस्करण प्राप्त करने के लिए कठिनाइयों का पता लगा रहा हूं। क्या कक्षा में किए गए आयात के लिए जार फ़ाइल का संस्करण खोजने का कोई तरीका है? मेरा मतलब है कि अगर आपके पास कुछ चीज है, तो xyz आयात करें; क्या हम जान सकते हैं कि जार xy पैकेज का संस्करण किससे संबंधित है?

जवाबों:


78

JAR फ़ाइल को डिकम्प्रेस करें और प्रकट फ़ाइल ( META-INF\MANIFEST.MF) के लिए देखें। JAR फ़ाइल की मैनिफ़ेस्ट फ़ाइल में संस्करण संख्या हो सकती है (लेकिन हमेशा एक संस्करण निर्दिष्ट नहीं होता है)।


जैसा कि मैंने बताया कि मैं एप्लिकेशन को बढ़ाने पर काम कर रहा हूं, मैंने जार फाइलें डाउनलोड कर ली हैं और मैं जार फाइलों के संस्करण को जानता हूं। लेकिन मैं जार के संस्करण को जानना चाहता था जो पैकेज का है, मुझे आशा है कि आप इसे प्राप्त करेंगे।
रितेश मेंगजी

आपको अधिक समझाने के लिए, मेरे पास xyz आयात है, मुझे पता है कि xy a-4.1.jar का है, लेकिन मैं जिस एप्लिकेशन पर काम कर रहा हूं, वह बहुत पहले विकसित हो चुका है, और मैं a.jar फ़ाइल के किस संस्करण का उपयोग कर चुका हूं, मैंने उन्हें , क्योंकि मैं पुस्तकालय में जार है, भले ही संस्करण के बारे में, क्योंकि वर्ग के कुछ पुराने संस्करण (मुझे ऐसा लग रहा है) के जार से मूल्यह्रास दिया है चिंतित हूँ, मैं आयात हल नहीं किया जा सकता है लगता है
रितेश Mengji

तो क्या यह है कि, यदि आप जार के उस संस्करण को जानते हैं जो उन्होंने एप्लिकेशन को बनाते समय इस्तेमाल किया था, तो आप एप्लिकेशन को निष्पादित करने के लिए जार के उसी संस्करण का उपयोग करेंगे?
विवेक

1
यदि आपकी आवश्यकता क्या है, तो आपको डर है कि आपको पदावनत जार के बहिष्कार के साथ आवेदन का पुनर्निर्माण करना होगा। क्योंकि दिए गए जार के साथ जुड़े संस्करण संख्या को खोजना एक से एक फ़ंक्शन की तरह है। एक जार फ़ाइल के लिए केवल एक संस्करण संख्या। लेकिन एप्लिकेशन के विकास के समय जार के किस संस्करण का उपयोग किया गया था, यह जानना मेरे लिए बहुत असंभव है जब तक कि डेवलपर आवेदन के साथ आवश्यक जार संलग्न नहीं करता है।
विवेक

1
MANIFEST.MF में रिकॉर्डिंग संस्करण वैकल्पिक प्रतीत होता है। sqljdbc42.jarमेरे द्वारा कॉग्नोस के साथ उपयोग की गई विभिन्न फ़ाइलों में कोई संस्करण दर्ज नहीं किया गया है , फिर भी कॉग्नोस एक संस्करण (4.2.6420.19) की रिपोर्ट करने में सक्षम है। यदि यह इस संस्करण से प्रकट हो रहा है तो इसे कहां से प्राप्त किया जा रहा है?
Nick.McD मत्स्य

51

आपको इसे अनज़िप करने और इसकी META-INF/MANIFEST.MFफ़ाइल, उदाहरण के लिए जांचने की आवश्यकता है

unzip -p file.jar | head

या अधिक विशिष्ट:

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

26

बस ऊपर जवाब पर विस्तार करने के लिए, जार में META-INF / MANIFEST.MF फाइल के अंदर, आप की संभावना एक लाइन देखेंगे: Manifest-Version: 1.0 ← यह वह जगह है नहीं जार संस्करणों संख्या!

आपको यह देखने की आवश्यकता है कि Implementation-Versionयदि मौजूद है, तो एक मुफ्त-पाठ स्ट्रिंग है जो पूरी तरह से जार के लेखक तक है जो आपको वहां मिलेगा। Oracle डॉक्स और पैकेज संस्करण विशिष्ट भी देखें



17

बस उपरोक्त उत्तर को पूरा करने के लिए।

मेनिफेस्ट फ़ाइल जार के अंदर META-INF\MANIFEST.MFपथ पर स्थित है ।

आप ज़िप की सहायता करने वाले किसी भी संग्रह में जार की सामग्री की जांच कर सकते हैं।


2
यह उत्तर (और अन्य) वर्तमान में मेटा पर चर्चा
रहा है

11

प्रत्येक जार संस्करण में एक अनूठा चेकसम होता है। आप जार के लिए चेकसम की गणना कर सकते हैं (जिसमें कोई संस्करण जानकारी नहीं थी) और जार के विभिन्न संस्करणों के साथ इसकी तुलना करें। हम चेकसम का उपयोग करके एक जार भी खोज सकते हैं।

चेकसम की गणना करने के लिए इस प्रश्न को देखें: मेरी मशीन पर मौजूद फ़ाइल के लिए चेकसम की गणना करने का सबसे अच्छा तरीका क्या है?


5
मैंने सिर्फ jd md5 की गणना की और इसे Google पर पेस्ट किया। महान काम किया, बहुत बहुत धन्यवाद!
mik01aj 12

7

मूल रूप से आपको 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


3

यह सरल कार्यक्रम जार के संस्करण के लिए सभी मामलों को सूचीबद्ध करेगा

  • संस्करण मैनिफ़ेस्ट फ़ाइल में पाया गया
  • मैनिफेस्ट में और जार नाम से भी कोई संस्करण नहीं मिला
  • प्रकट फ़ाइल नहीं मिली

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

यह javaxt-core जार का उपयोग करता है जिसे http://www.javaxt.com/downloads/ से डाउनलोड किया जा सकता है


Javaxt के संदर्भ के लिए धन्यवाद, मैं सिर्फ सरल कोड नमूना वहां से इस्तेमाल किया javaxt.com/Tutorials/Jar/...
डेविड

1
FYI करें, जो उन लोगों के बजाय JAR डाउनलोड करने की बजाय पुल javaxt कोर करने के लिए पसंद करते हैं maven के लिए, आप या तो इन तरीकों का कर सकता है: gist.github.com/daluu/dda7b29cb5b6e0fbfbaec664eb759739 , gist.github.com/daluu/52af7eef52563ddf78fe
डेविड

2

मुझे यह देर हो गई है लेकिन आप निम्नलिखित दो तरीकों की कोशिश कर सकते हैं

इन आवश्यक वर्गों का उपयोग करना

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

इन विधियों ने मुझे जार विशेषताओं तक पहुंचने दिया। मैं पीछे की ओर संगत होना पसंद करता हूं और नवीनतम का उपयोग करता हूं। इसलिए मैंने इसका इस्तेमाल किया

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

यह तब अच्छी तरह से काम करता है जब आप मावेन का उपयोग कर रहे हैं और ज्ञात वर्गों के लिए पोम विवरण की आवश्यकता है। उम्मीद है की यह मदद करेगा।


1

लिनक्स के लिए, निम्नलिखित प्रयास करें:

खोजो। -name "your_JAR_FILE.jar" -exec zipgrep "कार्यान्वयन-संस्करण:" '{}'!! awk -F ':' '{प्रिंट $ 2}'


1

यदि आपके पास विनर है, तो वाइनर के साथ जार खोलें, ओपन फोल्डर पर डबल-क्लिक करें META-INF। निकालें MANIFEST.MFऔर CHANGESकिसी भी स्थान (जैसे कि डेस्कटॉप) करने के लिए फ़ाइलों।

एक टेक्स्ट एडिटर में निकाली गई फाइलें खोलें: आप कार्यान्वयन-संस्करण या रिलीज़ संस्करण देखेंगे।


0

आप मैनिफ़ेस्ट फ़ाइल का उपयोग करके संस्करण को फ़िल्टर कर सकते हैं

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


ऐसा लगता है कि ज्यादातर इस पुराने जवाब को डुप्लिकेट करते हैं - stackoverflow.com/a/38313502/272387 - और मैनिफ़ेस्ट की गारंटी नहीं है Bundle-Version
रिचलेव

0

सोचा था कि मैं एक और हालिया जवाब दूंगा क्योंकि यह सवाल अभी भी खोजों पर बहुत अधिक है।

CLI JAR संस्करण की जाँच:

CLi जार फ़ाइल पर निम्न चलाएँ:

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

सीएलआई संस्करण ऊपर सूचीबद्ध है।

सर्वर संस्करण प्राप्त करने के लिए, निम्नलिखित चलाएँ:

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.