জার ফাইলের সংস্করণটি কীভাবে পরীক্ষা করবেন?


91

আমি বর্তমানে J2ME পলিশ অ্যাপ্লিকেশনটিতে কাজ করছি, কেবল এটি বাড়িয়েছি। জার ফাইলটির সঠিক সংস্করণ পেতে আমি অসুবিধা খুঁজে পাচ্ছি। ক্লাসে করা আমদানির জন্য জার ফাইলের সংস্করণটি খুঁজে পাওয়ার কোনও উপায় আছে কি? মানে যদি আপনার কাছে কিছু থাকে তবে এক্সজি এক্সপোর্ট করুন; জার এক্স প্যাকেজের সংস্করণটি কি আমরা জানতে পারি?

উত্তর:


78

JAR ফাইলটি সংক্ষেপিত করুন এবং ম্যানিফেস্ট ফাইলটি ( META-INF\MANIFEST.MF) সন্ধান করুন। জেআর ফাইলের ম্যানিফেস্ট ফাইলটিতে একটি সংস্করণ নম্বর থাকতে পারে (তবে সবসময় কোনও সংস্করণ নির্দিষ্ট করা হয় না)।


যেমন আমি বলেছি যে আমি অ্যাপ্লিকেশনটি বাড়ানোর জন্য কাজ করছি, আমি জার ফাইলগুলি ডাউনলোড করেছি এবং আমি জার ফাইলগুলির সংস্করণ জানি। তবে আমি যে পাত্রটি প্যাকেজের অন্তর্ভুক্ত তার জারটির সংস্করণটি জানতে চেয়েছিলাম, আমি আশা করি আপনি এটি পেয়ে গেছেন।
রিতেশ মেঙ্গজি

আপনাকে আরও ব্যাখ্যা করতে, আমার কাছে জাইজি আমদানি করা আছে, আমি জানি যে xy a-4.1.jar এর সাথে সম্পর্কিত, তবে আমি যে অ্যাপ্লিকেশনটিতে কাজ করছি তা অনেক আগে থেকেই বিকাশ করা হয়েছে, এবং তারা a.jar ফাইলের কোন সংস্করণ ব্যবহার করেছে, আমি তা করি না সংস্করণটি সম্পর্কে উদ্বিগ্ন কারণ, কিছু কিছু ক্লাস পুরানো সংস্করণের জার থেকে অবহেলিত হয়েছে (আমার মনে হয়েছে) কারণ, আমার লাইব্রেরিতে জার থাকা সত্ত্বেও আমি আমদানিটি সমাধান করতে পারছি না
রীতেশ মেঙ্গজি

সুতরাং এটি কি, আপনি যদি অ্যাপ্লিকেশনটি তৈরি করার সময় তারা যে জারের সংস্করণটি ব্যবহার করেছিলেন তা জানেন তবে আপনিও অ্যাপ্লিকেশনটি কার্যকর করতে জারের একই সংস্করণটি ব্যবহার করবেন?
বিবেক

4
যদি আপনার প্রয়োজনীয়তা এটিই হয় তবে শঙ্কিত যে আপনাকে হতাশার জারগুলি বাদ দিয়ে অ্যাপ্লিকেশনটি পুনরায় তৈরি করতে হবে। কারণ প্রদত্ত জারের সাথে যুক্ত সংস্করণ নম্বরটি সন্ধান করা এক থেকে এক ফাংশনের মতো। একটি জার ফাইলের জন্য কেবল একটি সংস্করণ নম্বর। কিন্তু বিকাশকারী অ্যাপ্লিকেশনটির সাথে প্রয়োজনীয় জারগুলি সংযুক্ত না করলে অ্যাপ্লিকেশন বিকাশের সময় জারের কোন সংস্করণ ব্যবহার করা আমার পক্ষে অত্যন্ত অসম্ভব মনে হয়।
বিবেক

4
MANIFEST.MF- এ রেকর্ডিং সংস্করণটি alচ্ছিক বলে মনে হয়। sqljdbc42.jarআমি ক্যাগোনাসের সাথে ব্যবহার করেছি এমন বিভিন্ন ফাইলে এমন কোনও সংস্করণ রেকর্ড করা হয়নি, তবুও কোগনোস একটি সংস্করণ (4.2.6420.100) রিপোর্ট করতে সক্ষম হয়েছে। ম্যানিফেস্টে এটি রেকর্ড না করা থাকলে এই সংস্করণটি কোথা থেকে পাবে?
নিক.এমসিডার্মেইড

52

আপনাকে এটিকে আনজিপ করতে হবে এবং এর META-INF/MANIFEST.MFফাইলটি পরীক্ষা করতে হবে, যেমন

unzip -p file.jar | head

বা আরও নির্দিষ্ট:

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

26

শুধুমাত্র উপরের উত্তরের উপর প্রসারিত করতে, ঘড়া মধ্যে মেটা-INF / MANIFEST.MF ফাইল ভিতরে, আপনি সম্ভবত একটি লাইন দেখতে পাবেন: Manifest-Version: 1.0 ← এই নয় বয়াম সংস্করণ সংখ্যা!

আপনাকে দেখতে হবে Implementation-Versionযে, যদি উপস্থিত থাকে তবে এটি একটি মুক্ত-পাঠ্য স্ট্রিং যা পুরোপুরি জেআর এর লেখকের উপর নির্ভর করে আপনি সেখানে কী খুঁজে পাবেন। এছাড়াও ওরাকল ডক্স এবং প্যাকেজ সংস্করণ নির্দিষ্টকরণ দেখুন


এই উত্তরটি (এবং অন্যান্য) বর্তমানে মেটাতে আলোচনা করা হয়েছে
টমাস ওয়েলারের

17

কেবল উপরের উত্তরটি সম্পূর্ণ করতে।

ম্যানিফেস্ট ফাইলটি META-INF\MANIFEST.MFপথে জারের ভিতরে অবস্থিত ।

আপনি জিপ সমর্থন করে এমন কোনও আর্কিভারে জারের সামগ্রীগুলি পরীক্ষা করতে পারেন।


4
এই উত্তরটি (এবং অন্যান্য) বর্তমানে মেটাতে আলোচনা করা হয়েছে
টমাস ওয়েলারের

11

প্রতিটি জার সংস্করণে একটি অনন্য চেকসাম রয়েছে। আপনি আপনার জারের জন্য চেকসাম গণনা করতে পারেন (যার কোনও সংস্করণ তথ্য ছিল না) এবং এটি জারের বিভিন্ন সংস্করণের সাথে তুলনা করতে পারেন। আমরা চেকসাম ব্যবহার করে একটি পাত্রও অনুসন্ধান করতে পারি।

চেকসাম গণনা করতে এই প্রশ্নটি দেখুন: আমার মেশিনে থাকা কোনও ফাইলের জন্য চেকসাম গণনা করার সর্বোত্তম উপায় কী?


4
আমি কেবল জার এমডি 5 গণনা করেছি এবং এটি গুগলে পেস্ট করেছি। দুর্দান্ত কাজ করেছেন, অনেক অনেক ধন্যবাদ!
mik01aj

7

সাধারণত java.lang.Packageআপনার ক্লাস সম্পর্কে তথ্য দেওয়ার জন্য ক্লাসলোডার ব্যবহার করে এমন ক্লাসটি ব্যবহার করা উচিত ।

উদাহরণ:

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

আমি মনে করি লগব্যাকটি প্রতিটি শ্রেণীর জেআর নাম / সংস্করণটির উত্পাদিত স্ট্যাকট্রেসগুলির সন্ধান করতে এই বৈশিষ্ট্যটি ব্যবহার করে বলে জানা যায়।

আরো দেখুন 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);
    

এটি জাভােক্সট-কোর জার ব্যবহার করে যা http://www.javaxt.com/downloads/ থেকে ডাউনলোড করা যায়


জাভাক্স্টের রেফারেন্সের জন্য ধন্যবাদ, আমি কেবল javaxt.com/ টিউটোরিয়ালস
ডেভিড

4
অবগতির জন্য, যারা বরং JAR- র ডাউনলোড করার চেয়ে টান javaxt কোর থেকে ম্যাভেন পছন্দ জন্য, হয় আপনি এই অ্যাপ্রোচগুলির করতে পারে: 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

লিনাক্সের জন্য, নিম্নলিখিত চেষ্টা করুন:

অনুসন্ধান . -নাম "YOUR_JAR_FILE.jar" -Eexec zipgrep "বাস্তবায়ন-সংস্করণ:" '{}' \; | awk -F ':' '{মুদ্রণ $ 2}'


1

আপনার যদি উইনার থাকে তবে উইনার সাথে জারটি খুলুন, ফোল্ডারটি খোলার জন্য ডাবল ক্লিক করুন META-INF। নিষ্ক্রিয় করুন MANIFEST.MFএবং CHANGESযে কোনও স্থানে ফাইল (ডেস্কটপ বলুন)।

টেক্সট এডিটরে এক্সট্রাক্ট করা ফাইলগুলি খুলুন: আপনি বাস্তবায়ন-সংস্করণ বা প্রকাশের সংস্করণ দেখতে পাবেন।


0

আপনি ব্যবহার করে MANIFEST ফাইল থেকে সংস্করণ ফিল্টার করতে পারেন

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


এটি বেশিরভাগ ক্ষেত্রে এই পুরানো উত্তরটির সদৃশ বলে মনে হচ্ছে - stackoverflow.com/a/38313502/272387 - এবং ম্যানিফাইস্টগুলি গ্যারান্টিযুক্ত নয় Bundle-Version
রিচলভ

0

আমি ভেবেছিলাম যে আমি আরও সাম্প্রতিক উত্তর দেব কারণ অনুসন্ধানে এখনও এই প্রশ্নটি উঠে আসে।

সিএলই জেআর সংস্করণ পরীক্ষা করা হচ্ছে:

সিএলআই জার ফাইলটিতে নিম্নলিখিতটি চালান:

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.