2012-03-29 11 views
5

मैं चलने योग्य जेएआर फ़ाइल का संकलन समय प्राप्त करने की कोशिश कर रहा हूं जिसे मैं ग्रहण से निर्यात कर रहा हूं। ऐसा करने का एक तरीका शायद मेटा-आईएनएफ/MANIFEST.MF फ़ाइल का संशोधन समय प्राप्त करना होगा। दुर्भाग्यवश मुझे यह जानकारी प्राप्त करने का कोई तरीका नहीं मिल रहा है (मुझे पता है कि getResourceAsStream("/META-INF/MANIFEST.MF") का उपयोग करके स्वयं को प्रकट कैसे करें, लेकिन मैं इसके संशोधन समय को पढ़ने में सक्षम नहीं हूं)।जेएआर संकलन समय प्राप्त करें

क्या किसी को यह करने के बारे में कुछ अंतर्दृष्टि है?

उत्तर

3

अंत में, Aleks जी का जवाब और दूसरों कहीं भी पाई के आधार पर, मैं एक और अधिक मजबूत समाधान के साथ आया था (है कि जैसे नेटवर्क शेयरों पर भी काम करता है):

public static Long getTime(Class<?> cl) { 
    try { 
     String rn = cl.getName().replace('.', '/') + ".class"; 
     JarURLConnection j = (JarURLConnection) ClassLoader.getSystemResource(rn).openConnection(); 
     return j.getJarFile().getEntry("META-INF/MANIFEST.MF").getTime(); 
    } catch (Exception e) { 
     return null; 
    } 
} 

मैं एक बेहतर तरीका के लिए उम्मीद की गई थी क्लास ऑब्जेक्ट से संसाधन नाम पर जाने के लिए, लेकिन मुझे लगता है कि इसे करना होगा।

7

आप जार फ़ाइल स्वयं के लिए उपयोग किया है, तो आप, java.util.jar पैकेज का उपयोग जार फ़ाइल को पढ़ने तो मालसूची फ़ाइल के लिए ZipEntry हो और उस पर getTime() का उपयोग अपने अंतिम अद्यतन समय प्राप्त करने के लिए सक्षम होना चाहिए।

JarFile jf = new JarFile("myfile.jar"); 
ZipEntry manifest = jf.getEntry("META-INF/MANIFEST.MF"); 
long manifestTime = manifest.getTime(); //in standard millis 

यदि आपको विशिष्ट कक्षा से निपटने की आवश्यकता है, तो आपको यह कोड भी उपयोगी हो सकता है;

String rn = this.getClass().getName().replace('.', '/') + ".class"; 
String path = getClass().getClassLoader().getResource(rn).getPath(); 
String jarFile = path.substring(0, path.indexOf("!")); 

फिर jarFile अपने जार के पथ नाम शामिल होंगे। ध्यान दें कि यदि कक्षा जार फ़ाइल से लोड नहीं होती है, तो तीसरी पंक्ति विफल हो जाएगी, क्योंकि path.indexOf वापस आ जाएगा -1।

+0

निश्चित रूप से, लेकिन जब जार का नाम बदल दिया जाता है तो यह बहुत ही टूट जाता है। क्या मुझे वास्तविक जारफाइल का संदर्भ मिल सकता है, मेरी मुख्य कक्षा से लोड किया जा रहा है? – CAFxX

+0

हां, आपको क्लासलोडर ऑब्जेक्ट के माध्यम से इसे प्राप्त करने में सक्षम होना चाहिए। –

+0

@CAFxX मैंने यह दिखाने के लिए अपना जवाब अपडेट किया कि कक्षा वाले जार फ़ाइल का नाम कैसे प्राप्त करें। –