2012-05-03 11 views
11

को अनदेखा करता है मैंने Class-Path विशेषता में मनमानी प्रविष्टि जोड़ने के लिए https://stackoverflow.com/a/5893391/14731 पर दिए गए निर्देशों का उपयोग किया।निष्पादन योग्य JAR अपने स्वयं के क्लास-पथ विशेषता

Manifest-Version: 1.0 
Class-Path: jace-runtime.jar 
Main-Class: org.jace.examples.Test 

मैं org.jace.examples.Test परिभाषित इस प्रकार है::

public class Test 
{ 
    public static void main(String[] args) 
    { 
     System.out.println("classpath: " + System.getProperty("java.class.path")); 
     System.out.println("PeerExample: " + Class.forName("org.jace.util.ShutdownHook")); 
    } 
} 

जहां org.jace.util.ShutdownHookjace-runtime.jar में परिभाषित किया गया है यहाँ मेरी MANIFEST.MF फ़ाइल है।

classpath: peer_example1.jar धागा "मुख्य" java.lang.ClassNotFoundException में अपवाद:: जब मैं java -jar peer_example1.jar आह्वान मैं निम्नलिखित आउटपुट प्राप्त org.jace.util.ShutdownHook

दूसरे शब्दों में, जावा निष्पादन योग्य JAR फ़ाइल जोड़ रहा है कक्षा के लिए लेकिन Class-Path को अनदेखा कर रहा है।

classpath: jace-runtime.jar;peer_example1.jar

कोई भी विचार: यदि मैं java -cp jace-runtime.jar;peer_example1.jar org.jace.examples.Test आह्वान मैं उम्मीद आउटपुट प्राप्त?

+0

यदि आपको जार रूट को वर्तमान कार्यशील निर्देशिका के रूप में माना जाता है तो आपको ../jace-runtime.jar की आवश्यकता हो सकती है। –

+0

@ मार्कोटोपॉलिक: मैंने अभी कोशिश की है। यह काम नहीं किया। – Gili

+2

लेकिन क्या आपने उस अन्य जार में एक कक्षा तक पहुंचने का प्रयास किया है?ऐसा लगता है कि java.class.path मेनिफेस्ट से पढ़ने वाले वर्गपैथ को प्रतिबिंबित नहीं करता है। –

उत्तर

12

मेरे अपने प्रश्न का उत्तर देना:

  1. Class-Path को मनमाना प्रविष्टियों जोड़ा जा रहा है अपने आप ही ठीक है। समस्या पैदा होती है जब आप जार अनुक्रमण का उपयोग कर सक्षम:

    <configuration> 
        <archive> 
        <index>true</index> 
        </archive> 
    </configuration> 
    

    Maven META-INF/INDEX.LIST से अपनी प्रविष्टियों को छोड़ देगा।

  2. जब आप रनटाइम पर जेएआर का उपयोग करते हैं, तो जावा INDEX.LIST को कक्षाओं को खोजने के लिए देखेगा, MANIFEST.MF नहीं।

  3. क्योंकि आपकी प्रविष्टियां INDEX.LIST से अनुपलब्ध हैं, इसलिए वे क्लासलोडर द्वारा नहीं पाए जाएंगे, इससे कोई फर्क नहीं पड़ता कि मैनिफेस्ट क्या कहता है।

जेएआर इंडेक्सिंग को अक्षम करना एक सरल कामकाज है। मुझे यकीन नहीं है कि इंडेक्सिंग सक्षम के साथ मनमाना Class-Path इंजेक्ट कैसे करें।

-3
जार विकल्प के लिए प्रति tooldocs पेज

- Link to docs

आप इस विकल्प का उपयोग करते हैं, जार फ़ाइल सभी उपयोगकर्ता कक्षाओं का स्रोत है, और अन्य उपयोगकर्ता वर्ग पथ सेटिंग्स अनदेखी कर रहे हैं।

+1

-1: प्रलेखन इस तथ्य को संदर्भित करता है कि '-cp/-classpath' कमांड लाइन विकल्प 'क्लास-पथ' के पक्ष में अनदेखा हो जाता है, इसलिए यह समस्या नहीं है। – Gili

0

उन लोगों के लिए जो अन्यथा अनजान हो सकते हैं, निष्पादन योग्य संग्रह तंत्र मेनिफेस्ट क्लासपाथ लेता है और संग्रह में बाहरी कक्षाओं को लोड करने के लिए इसका उपयोग करता है।

तो अगर आप वेब-INF/कक्षाओं का एक प्रकट classpath के साथ एक युद्ध उम्मीद कर रहे हैं वेब-INF/कक्षाएं प्रविष्टि संग्रह के अंदर में कक्षाएं लगाने के लिए तो आप निराश हो जाएगा।

संबंधित मुद्दे