2012-02-27 8 views
8

मैं अपने विंडोज़ एप्लिकेशन में निष्पादन योग्य जार फ़ाइल को लपेटने के लिए launch4j का उपयोग कर रहा हूं, लेकिन मुझे JVM तर्कों के माध्यम से इसके कुछ पुस्तकालयों के संदर्भों को पारित करने की आवश्यकता है। प्रश्न में पुस्तकालय अनुप्रयोग स्थापित निर्देशिका में रहते हैं, और निष्पादन योग्य के सापेक्ष, हमेशा एक ही स्थान पर स्थित होते हैं।launch4j का उपयोग करते समय निष्पादन योग्य मार्ग कैसे प्राप्त करें?

मैं JVM विकल्पों में निष्पादन-संबंधित पथ का उपयोग करने के launch4j बताना चाहूँगा। मुझे पता है कि यह जानकारी विंडोज बैच स्क्रिप्ट स्तर पर उपलब्ध है, लेकिन आप इसे लाने के लिए launch4j को कैसे कॉन्फ़िगर करते हैं? स्पष्टीकरण के लिए

संपादित करें: मैं विशेष रूप से कैसे रास्तों द्विआधारी खुद के सापेक्ष, बनाने के लिए की तलाश में हूँ नहीं उन्हें कैसे वर्तमान कार्यशील निर्देशिका के सापेक्ष बनाने के लिए। दोनों जरूरी नहीं हैं।

/launch.exe 
/bin/lib.dll 
/lib/app.jar 

अब आप उत्पन्न लांचर के साथ app.jar शुरू करना चाहते हैं (launch.exe):

+1

मुझे नहीं पता कि आप लॉन्च 4 जे लॉन्चर से वीएम तर्कों के माध्यम से जार क्यों कॉल करना चाहते हैं। Launch4J निष्पादन योग्य में उन्हें एम्बेड कर सकते हैं। लॉन्च 4 जे जीयूआई के * क्लासपाथ * टैब के नीचे * क्लासपाथ * सूची में जार के नाम जोड़ें। यदि जार एप्लिकेशन के इंस्टॉलेशन पथ से संबंधित फ़ोल्डर के नीचे हैं, तो प्रत्येक जार को फ़ोल्डर पथ के साथ उपसर्ग करें। उदाहरण के लिए: '।/Lib' फ़ोल्डर में सभी बाहरी जार होते हैं और मुख्य वर्ग'।/'पर होता है; इसलिए, क्लासपाथ सूची में '।/lib/myexternal-1.0.jar' टाइप करें। – ecle

+1

क्योंकि वे जार नहीं हैं, वे देशी पुस्तकालय हैं। वास्तव में मुझे इस तरह से लोड करने की आवश्यकता है, सबसे पहले मैं एसडब्ल्यूटी ब्राउज़र का उपयोग कर रहा हूं, और मैं इसे एक विशिष्ट XULRunner स्थापना (बंडल) लोड करना चाहता हूं। ऐसा करने के लिए, आपको org.eclipse.swt.browser.XULRunnerPath सेट करना होगा। दूसरा, मेरे मूल कोड द्वारा उपयोग किया जाने वाला मूल डीएल है जिसे मुझे लोड करने की आवश्यकता है। मैं ऐसा करने के लिए java.library.path सेट करना चाहता हूं। –

+0

आप 'System.getProperties()। सूची (System.out)' ("user.dir") और 'System.env' की कोशिश की? –

उत्तर

11

आप अपने launch4j विन्यास

... 
<jre> 
... 
<opt>-Djna.library.path="%EXEDIR%\\path\\to\\lib"</opt> 
<opt>-Djava.library.path="%EXEDIR%\\path\\to\\lib"</opt> 
... 
</jre> 
... 

में जोड़ सकते हैं आप अधिक एक तो की जरूरत है आप हमेशा की तरह एक semikolon से कई रास्ते अलग हो सकता है। अभिकथन विकल्प, प्रणाली के गुण और एक्स विकल्प:

< ऑप्ट> वैकल्पिक, सब कुछ आप सामान्य रूप से जावा/javaw लांचर के पास चला जाएगा स्वीकार करता है। यहाँ आप पर्यावरण और विशेष चरों EXEDIR (exe के क्रम निर्देशिका) मैप कर सकते हैं, EXEFILE (exe के क्रम पूर्ण फ़ाइल पथ) प्रणाली संपत्तियों के लिए।सभी परिवर्तनीय संदर्भों को प्रतिशत संकेतों और उद्धृत से घिरा होना चाहिए।

स्रोत: http://launch4j.sourceforge.net/docs.html

1

अगर मैं आपके सवाल का सही समझते हैं, आप एक launch4j निष्पादन और एक देशी पुस्तकालय अपने स्थापना निर्देशिका के भीतर है । आप ऐप lib.dll लोड करता है।

आप अपने app.jar (marker.txt) में एक फ़ाइल एम्बेड कर सकते हैं। अब आप classloader

http://docs.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html#getResource(java.lang.String)

getResource("marker.txt); 

उपयोग कर सकते हैं यह आप की तरह कुछ दे देंगे:

file://c://installdir/lib/app.jar!marker.txt 

इस स्ट्रिंग पार्स किया जा सकता। लेकिन वास्तव में, मुझे लगता है कि इस समस्या के लिए एक बेहतर समाधान होना चाहिए।

+0

यह वर्तमान कार्यशील निर्देशिका प्राप्त करता है, जो आवश्यक नहीं है जहां निष्पादन योग्य है। –

+0

क्षमा करें, आप सही हैं। एक और विचार है। –

+0

हम्म, चालाक। मैंने पथ प्राप्त करने के लिए क्लासलोडर का उपयोग नहीं किया था। यह काम कर सकता है, हालांकि मैं थोड़ा चिंतित हूं कि जावा शुरू होने के बाद चीजें सिस्टम प्रॉपर्टी सेट को स्वीकार नहीं करेंगे। मुझे जांच करनी होगी। –

3

सेट -Djna.library.path=<relative path of native libraries> (JNA का उपयोग कर रहे हैं) और -Djava.library.path=<relative path of native libraries>

वैकल्पिक रूप से, यह जावा कोड में किया जा सकता है: System.setProperty("jna.library.path","<relative path of native libraries>") और System.setProperty("java.library.path","<relative path of native libraries>")। आप संदर्भ के लिए कई पथ जोड़ सकते हैं। विंडोज़ में, पथ को अलग करने के लिए ; का उपयोग करें।

इस सेटअप केवल आप JRE टैब के अंतर्गत सूची Launch4J JVM विकल्पों में इस डाल सकते हैं कि जावा आवेदन की JVM क्रम पर इसके प्रभाव पड़ता है (लिनक्स में नहीं LD_LIBRARY_PATH विश्व स्तर पर की तरह।)

या,। मैं अपनी परियोजनाओं में यही करता हूं।

+0

मुझे बाइनरी कैसे मिल सकती है हालांकि -संबंधित पथ? –

+0

मेरे मामले में, आलसी जा रहा है, मैं सिर्फ देशी पुस्तकालयों और निर्भर जार ही फ़ोल्डर में निष्पादन योग्य के रूप में डाल दिया और सेट '-Djava.library.path =। \\' मैं भी एक ही फ़ोल्डर में JVM बंडल और तदनुसार उल्लेख मेरी Launch4J स्क्रिप्ट फ़ाइल में ' jre6 ' – ecle

+0

यदि बाइनरी को किसी भिन्न निर्देशिका से बुलाया जाता है तो यह काम नहीं करता है। यही कारण है कि मैं बाइनरी-रिश्तेदार पथ चाहता हूं। –

1

आप बस निर्देशिका (जैसे .. \ lib) जहां पुस्तकालयों Launch4j में classpath टैब में स्थित हैं शामिल कर सकते हैं। कम से कम मेरे लिए काम किया।

2

configuration में से एक विकल्प chdir निष्पादन योग्य निर्देशिका को अनुमति देने के लिए है। यह user.dir को exe के समान निर्देशिका में ser करेगा, जिसे आप अन्य एप्लिकेशन पथ खोजने के लिए उपयोग कर सकते हैं।

<chdir> 

वैकल्पिक। निष्पादन योग्य के सापेक्ष एक मनमानी पथ में वर्तमान निर्देशिका बदलें। यदि आप इस संपत्ति को छोड़ देते हैं या इसे खाली छोड़ देते हैं तो इसका कोई प्रभाव नहीं पड़ेगा।

के लिए यह निर्धारित करना। वर्तमान डीआईआर को निष्पादन योग्य के रूप में एक ही निर्देशिका में बदल देगा। .. इसे मूल निर्देशिका में बदल देगा, और इसी तरह।

<chdir>.</chdir> 
<chdir>../somedir</chdir> 

कोड जो एक्ज़िक्यूटेबल में (readlink, GetModuleFileName आदि) ओएस पर आधारित होगी वास्तविक पथ पाते हैं। सुनिश्चित करें कि आप वास्तव में लक्ष्य ओएस पर परीक्षण करते हैं ..

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