2013-10-13 10 views
5

इसलिए मैं यह देखने की कोशिश कर रहा हूं कि कोई .jar मान्य है या नहीं, मुख्यफ़ास्ट फ़ाइल में कुछ मानों की जांच करके। जावा का उपयोग कर फ़ाइल को पढ़ने और विश्लेषण करने का सबसे अच्छा तरीका क्या है? मैं फ़ाइलएक .jar मेनिफेस्ट फ़ाइल पढ़ने के लिए जावा का उपयोग

jar -xvf anyjar.jar META-INF/MANIFEST.MF 

निकालने के लिए इस आदेश का उपयोग कर के बारे में सोचा लेकिन मैं की तरह कुछ कर सकते हैं:

File manifest = Command.exec("jar -xvf anyjar.jar META-INF/MAINFEST.MF"); 

फिर फ़ाइल की तर्ज पार्स करने के लिए कुछ बफ़र पाठक या कुछ का उपयोग करें?

किसी भी मदद के लिए धन्यवाद ...

+0

की संभावित डुप्लिकेट http://stackoverflow.com/questions/2198525/can-values-defined-in-manifest-mf-be-accessed-programmatically/2198542 –

उत्तर

8

jar उपकरण का उपयोग कर के साथ समस्या यह है कि यह पूरी JDK स्थापित करने की आवश्यकता है। जावा के कई उपयोगकर्ताओं के पास केवल जेआरई स्थापित होगा, जिसमें jar शामिल नहीं है।

इसके अलावा, jar उपयोगकर्ता के पथ पर होना होगा।

बजाय मैं उचित एपीआई का उपयोग कर, इस तरह की सिफारिश करेंगे:

Manifest m = new JarFile("anyjar.jar").getManifest(); 

वास्तव में आसान होना चाहिए कि!

+0

ओह वाह जो अधिक समझ में आता है। रुको, इसलिए मैं एक कमांड.एक्सईक ("कोड जो जार निकालता है") का उपयोग कर रहा हूं। क्या ऐसा करने का एक आसान तरीका भी है। – Kyle

+0

हां। लेकिन स्टैक ओवरफ्लो पर उस पर पहले से ही एक प्रश्न होना चाहिए। –

+0

अब तक मैं कमांड प्रॉम्प्ट का उपयोग कर पा रहा हूं लेकिन यह लिंक ऐसा लगता है जैसे यह काम करेगा लेकिन यह थोड़े जटिल लॉल दिखता है। यह jarfile.run() या कुछ की तरह आसान क्यों नहीं हो सकता है। http://www.programcreek.com/2012/08/unzip-a-jar-file-in-java-program/ – Kyle

4

पैकेज श्रेणी java.lang.Package में आप जो चाहते हैं उसे करने के तरीके हैं।

String t = this.getClass().getPackage().getImplementationTitle(); 
String v = this.getClass().getPackage().getImplementationVersion(); 

मैं एक साझा उपयोगिता class.The विधि में एक स्थिर विधि में डाल एक पैरामीटर के रूप में एक वर्ग संभाल वस्तु स्वीकार: यहाँ एक आसान तरीका अपने जावा कोड का उपयोग कर प्रकट सामग्री प्राप्त करने के लिए है। इस तरह, जब हमें इसकी आवश्यकता होती है तो हमारे सिस्टम में किसी भी वर्ग की अपनी प्रकट जानकारी प्राप्त हो सकती है। स्पष्ट रूप से विधि को सरणी या मूल्यों के हैशैप को वापस करने के लिए आसानी से संशोधित किया जा सकता है।

कॉल विधि:

String ver = GeneralUtils.checkImplVersion(this); 

GeneralUtils.java नामक एक फ़ाइल में विधि:

public static String checkImplVersion(Object classHandle) 
{ 
    String v = classHandle.getClass().getPackage().getImplementationVersion(); 
    return v; 
} 

और उन आप पैकेज के माध्यम से प्राप्त कर सकते हैं के अलावा अन्य प्रकट क्षेत्रों-मूल्यों को प्राप्त करने के लिए कक्षा (उदाहरण के लिए अपनी खुद की बिल्ड-डेट), आपको मुख्य अटैचमेंट मिलते हैं और उन लोगों के माध्यम से काम करते हैं, जिन्हें आप चाहते हैं। यह निम्नलिखित कोड मुझे मिले एक समान प्रश्न से थोड़ा सा मामला है, शायद यहां SO पर। (मैं इसे क्रेडिट करना चाहता हूं लेकिन मैंने इसे खो दिया - क्षमा करें।)

इसे क्लास हैंडल ("यह" या MyClass.class) में विधि में गुजरने के लिए एक कोशिश-पकड़ ब्लॉक में डाल दें। "ClassHandle" प्रकार कक्षा की है:

String buildDateToReturn = null; 
    try 
    { 
    String path = classHandle.getProtectionDomain().getCodeSource().getLocation().getPath(); 
    JarFile jar = new JarFile(path); // or can give a File handle 
    Manifest mf = jar.getManifest(); 
    final Attributes mattr = mf.getMainAttributes(); 
    LOGGER.trace(" --- getBuildDate: " 
      +"\n\t path:  "+ path 
      +"\n\t jar:  "+ jar.getName() 
      +"\n\t manifest: "+ mf.getClass().getSimpleName() 
      ); 

    for (Object key : mattr.keySet()) 
    { 
     String val = mattr.getValue((Name)key); 
     if (key != null && (key.toString()).contains("Build-Date")) 
     { 
      buildDateToReturn = val; 
     } 
    } 
    } 
    catch (IOException e) 
    { ... } 

    return buildDateToReturn; 
+0

पैकेज विधियों के संबंध में, इन्हें सही नाम (.e.g। "कार्यान्वयन-संस्करण") का उपयोग करके मैनिफेस्ट में परिभाषित किया जाना चाहिए, जो क्लास java.util.jar.Attributes.Name में पाए जाते हैं। यह विशेष रूप से अच्छी तरह से प्रलेखित नहीं है। –

0

सबसे आसान तरीका है JarURLConnection वर्ग का उपयोग करने के लिए है:

String className = getClass().getSimpleName() + ".class"; 
String classPath = getClass().getResource(className).toString(); 
if (!classPath.startsWith("jar")) { 
    return DEFAULT_PROPERTY_VALUE; 
} 

URL url = new URL(classPath); 
JarURLConnection jarConnection = (JarURLConnection) url.openConnection(); 
Manifest manifest = jarConnection.getManifest(); 
Attributes attributes = manifest.getMainAttributes(); 
return attributes.getValue(PROPERTY_NAME); 

क्योंकि कुछ मामलों में ...class.getProtectionDomain().getCodeSource().getLocation();vfs:/ साथ पथ देता है, तो इस अतिरिक्त संभाला जाना चाहिए।

या, ProtectionDomain साथ:

File file = new File(getClass().getProtectionDomain().getCodeSource().getLocation().toURI()); 
if (file.isFile()) { 
    JarFile jarFile = new JarFile(file); 
    Manifest manifest = jarFile.getManifest(); 
    Attributes attributes = manifest.getMainAttributes(); 
    return attributes.getValue(PROPERTY_NAME); 
} 
संबंधित मुद्दे