ग्रहण के लॉन्च के साथ "java.library.path" में मूल पुस्तकालय कैसे जोड़ें (इसके बजाय इसे ओवरराइड करने के बजाय)


90

मुझे एक देशी पुस्तकालय मिला जिसे java.library.path में जोड़ना होगा । JVM तर्क के साथ -Djava.library.path = path ... मैं जैसा चाहूँ वैसे पथ सेट कर सकता हूँ।

मेरी समस्या यह है कि मेरी अन्य लाइब्रेरी (पेंटाहो रिपोर्टिंग) डिफ़ॉल्ट java.library.path (सिस्टम निर्देशिका आदि सहित) के आधार पर फोंट खोजती है और मैन्युअल सेटिंग डिफ़ॉल्ट पथ को ओवरराइड करती है।

तो: मैं डिफ़ॉल्ट java.library.path में पथ प्रविष्टि कैसे जोड़ सकता हूं बजाय इसे ओवरराइड करने के (जिसे -Djava.library.path के साथ किया जाता है)? (मैं डिफ़ॉल्ट पथ को हाथ से नहीं जोड़ना चाहूंगा, जो तैनाती के लिए अच्छा नहीं होगा)

संपादित करें: लापता विवरण के लिए क्षमा करें; मैं ग्रहण के साथ काम कर रहा हूं। (तैनाती JNLP के साथ की गई है और वहां मैं संसाधनों के तहत नेटलीब का उपयोग कर सकता हूं )


1
pls इस प्रश्न के बदले स्वीकृत उत्तर देखें - मेरे लिए यह बहुत बेहतर है: stackoverflow.com/questions/957700/…
laher

सवाल "कैसे देशी पुस्तकालय जोड़ने के लिए .." भ्रामक है। यह संभवतः एक और "पुस्तकालय पथ" जोड़ने (जोड़ने या पूर्व-निर्धारित करने) के बारे में है, अर्थात यह मानते हुए कि ग्रहण कुछ जावा जैसे दिखाता है। .path = my / lib / फ़ोल्डर: path1: path2: path3
whaefelinger

जवाबों:


46

इस मुद्दे को भूल गया था ... मैं वास्तव में एक्लिप्स से पूछ रहा था, मूल रूप से यह नहीं बताने के लिए खेद है। और जवाब बहुत आसान लगता है (कम से कम 3.5 के साथ; शायद पुराने संस्करणों के साथ भी):

जावा रन कॉन्फ़िगरेशन के तर्क: VM तर्क:

-Djava.library.path="${workspace_loc:project}\lib;${env_var:PATH}"

उद्धरण चिह्नों को नहीं भूलना चाहिए, अन्यथा PATH में रिक्त स्थान के साथ समस्याएं हैं।


7
यदि दो साझा पुस्तकालय हैं, तो एक दूसरे पर निर्भर है, यह काम नहीं करेगा। पहला जावा रनटाइम द्वारा पाया जाता है, लेकिन दूसरा सिस्टम डायनेमिक लोडर द्वारा हल किया जाता है। एकमात्र उपाय जो मैंने पाया है वह LD_LIBRARY_PATH को सेट करना है।
केविन क्लाइन

4
@Touko द्वारा दिया गया उत्तर मूल प्रश्न के अनुकूल नहीं है, जो कि मूल लाइब्रेरी फ़ोल्डर को जोड़ने या बनाने के बारे में है। कम से कम Mac OS 10.8 पर, न तो $ PATH और न ही $ LD_LIBRARY_PATH और न ही $ {वर्कस्पेस_लोक: प्रोजेक्ट} \ lib का डिफ़ॉल्ट मान के साथ कुछ करना है। उदाहरण के लिए, मेरे मैक पर डिफ़ॉल्ट मान $ HOME / लाइब्रेरी / जावा / एक्सटेंशन है: / लाइब्रेरी / जावा / एक्सटेंशन: / नेटवर्क / लाइब्रेरी / जावा / एक्सटेंशन: / सिस्टम / लाइब्रेरी / जावा / एक्सटेंशन: / usr / lib / जावा :।
13

यदि आप ग्रहण में TestNG का उपयोग कर रहे हैं, तो आपको TestNG रन कॉन्फ़िगरेशन को संपादित करने की आवश्यकता होगी: - रन कॉन्फ़िगरेशन विंडो में, अपना लक्ष्य TestNG कॉन्फ़िगरेशन चुनें। - पर्यावरण टैब का चयन करें - एक पाथ चर जोड़ें और इसके मूल्य को अपने लक्ष्य पर सेट करें - डिफ़ॉल्ट रूप से "मूल वातावरण में पर्यावरण जोड़ें" टॉगल करें।
फिलिप

क्या मुझे एक उदाहरण मिल सकता है।
बसिकर्ल

@kevincline क्या आप इस बारे में विस्तार से विचार करना चाहेंगे कि वास्तव में यह उस मामले में काम क्यों नहीं करेगा? मैं अभी उस समस्या में भाग गया हूं और मैं यह समझने की कोशिश कर रहा हूं कि इस समाधान में क्या गलत है।
अनुला

14

यदि आप java.library.pathएक्लिप्स में विकास के समय में हस्तक्षेप किए बिना एक देशी पुस्तकालय जोड़ना चाहते हैं (निरपेक्ष पथों से बचने और अपने लॉन्च कॉन्फ़िगरेशन में पैरामीटर जोड़ने के लिए), तो आप जावा में प्रत्येक जार के लिए मूल पुस्तकालयों के स्थान पर पथ की आपूर्ति कर सकते हैं मूल पुस्तकालय स्थान के तहत पथ संवाद । ध्यान दें कि मूल लाइब्रेरी फ़ाइल नाम को जार फ़ाइल नाम के अनुरूप होना चाहिए। इसका विस्तृत विवरण भी देखें ।


3
-1। आप मान रहे हैं कि एंड-यूज़र एक IDE से एप्लिकेशन चला रहा है, जिसकी संभावना नहीं है।
फिन जने 24'10

@finnw मैं आपकी बात देख रहा हूं। मुझे सवाल मिला कि विकास के दौरान आईडीई में एक देशी पुस्तकालय को कैसे जोड़ा जाए, बिना ओवरराइड किए java.library.pathऔर समाधान कहीं और खोजने के बाद वापस आया। उस उत्तर को स्पष्ट करने के लिए मेरे उत्तर को संपादित करेंगे।
फेबियन स्टील

वास्तव में मैं एक्लिप्स के साथ काम कर रहा हूं, हालांकि मैंने इस प्रश्न पर इसका उल्लेख नहीं किया।
ताओको

यह वास्तव में एक्लिप्स (लूना) के वर्तमान संस्करण में काम नहीं करता है क्योंकि संपत्ति सेट करना java.library.path को ओवरराइड करता है जैसे उपयोगकर्ता प्रश्न में समस्या होने के रूप में वर्णन करता है।
एलेक्स एन

9

SWT एक JAR में आवश्यक मूल DLL डालता है। एक उदाहरण के लिए "org.eclipse.swt.win32.win32.x86_3.4.1.v3449c.jar" खोजें।

DLL को JAR की जड़ में होना चाहिए, JAR पर हस्ताक्षर होने चाहिए और DLL को VMA-MANIFEST.MF में चेकसम के साथ दिखना चाहिए ताकि VM उन्हें उठा सके।


2
मैं इसे नेटबीन्स के साथ कैसे कर सकता हूं?
मैकीक सविक्की

AFAIK, NetBeans प्रोजेक्ट बनाने के लिए चींटी का उपयोग करता है। चींटी के लिए प्रलेखन पढ़ें कि हस्ताक्षरित जेएआर कैसे बनाएं और डीएलएल जैसी चीजों को कैसे प्रकट किया जाए।
एरोन दिगुल्ला

मैं ग्रहण में, .dll को जोड़ने के लिए इसे कैसे सेट करूं?
NoBugs

@NoBugs: ग्रहण में, इस पोस्ट में मदद करनी चाहिए: eclipsezone.com/eclipse/forums/t49342.html
हारून डिगुल्ला

@AaronDigulla क्या आप सुझाव देते हैं कि DLL को हमेशा इस तरह से संलग्न किया जा सकता है? मैंने सोचा कि यह केवल कुछ खोजता है java.library.path। क्या आप सुझाव देते हैं कि यह केवल रूट की खोज करता है jar?

4

विंडोज में, इस तरह:

-Djava.library.path = "C: / MyLibPath;% पथ%"

% PATH% आपका पुराना -Djava.library.path है


इस विचार की कोशिश की, लेकिन यह java.library.path के रूप में हुआ: D: \ Workspace \ myProject \ lib;% PATH%
Touko

आप $ {system_property: java.library.path} का भी उपयोग कर सकते हैं
रोब

2
UNIX / Mac / GNU लिनक्स पर डिफ़ॉल्ट LD_LIBRARY_PATH है। पथ एक विंडोज चीज है।
व्हिफेलिंगर

2

क्या आप अपने मूल पुस्तकालय को लोड करने के लिए System.load () प्रोग्रामिक रूप से कॉल करके इसे गोल कर सकते हैं ? यह विधि ( System.loadLibrary () के विपरीत ) आपको एक पूर्ण पथ निर्दिष्ट करने की अनुमति देती है।


1
कृपया विस्तृत करें कि ग्रहण शुरू करने के दौरान आप System.load () को प्रोग्रामेटिक रूप से कैसे कॉल करेंगे?
whaefelinger

2

https://bugs.eclipse.org/bugs/show_bug.cgi?id=102239 कहा गया है कोई प्रतिस्थापन ग्रहण के लॉन्चर में लागू यांत्रिकी है कि, कम से कम में कोई अप जूनो जारी करने के लिए।

इस प्रकार डिफ़ॉल्ट सेटिंग के पूर्व ज्ञान के बिना ग्रहण शुरू करते समय java.library.path में किसी अन्य लाइब्रेरी फ़ोल्डर को जोड़ना या प्रीपेन्ड करना असंभव (लगभग) असंभव है।

मैंने लगभग लिखा है, क्योंकि यह संभव हो सकता है कि ग्रहण स्टार्टअप को छोड़ दें, java.library.path की सामग्री को डंप करें और ग्रहण को एक कमांड में रोक दें। डंप को पार्स किया जाएगा और फिर ग्रहण, यानी लॉन्च करने के लिए इनपुट के रूप में लिया जाएगा

#!/bin/bash
# get default value of java.library.path (somehow)
default_lib_path=$( start_dump_stop_eclipse_somehow )  

# now launch Eclipse
eclipse --launcher.appendVmargs \
         -vmargs \
         -Djava.library.path="/my/native/lib/folder:${default_lib_path}"

1

UNIX प्रणालियों में, आप LD_LIBRARY_PATH पर्यावरण चर में संलग्न कर सकते हैं। विंडोज पर, जेवीएम स्वचालित रूप से सिस्टम प्रॉपर्टी, java.library.path, को PATH पर सेट करता है; इसलिए यदि dll आपके PATH पर है, तो आप सेट हैं।


थ्रेड स्टार्टर बहुत विशिष्ट था कि कैसे एक दूसरे मूल लाइब्रेरी फ़ोल्डर को "अपेंड" किया जाए, क्या आप सहमत नहीं हैं?
whaefelinger

@ user667073 मैं एक ही बात कह रहा हूं ... APPENDING सवाल है, थ्रेड-स्टार्टर को पहले से ही पता है कि किसी साझा
परिवाद

STS 3.4.0 और Mac OS 10.8: LD_LIBRARY_PATH की सेटिंग का java.library.path पर कोई प्रभाव नहीं पड़ता है। मैंने इसे Subclipse / JavaHL के साथ टेस्ट किया। यह काम किया: STS --launcher.appendVmargs -vmargs -Djava.library.path = / opt / local / lib निर्यात करते समय LD_LIBRARY_PATH = / opt / local / lib; STS नकारात्मक था।
वफ़ेलिंगर

1

विंडो-> प्राथमिकताएं -> जावा-> स्थापित JREs। फिर अपना वर्तमान JRE (JDK) चुनें और Edit पर क्लिक करें। डिफ़ॉल्ट VM तर्क भरें: -java.library.path = / usr / स्थानीय / xuggler / lib। किया हुआ!


1
यह उत्तर बेकार है क्योंकि थ्रेड स्टार्टर विशेष रूप से "ओवरराइडिंग के बजाय एक देशी पुस्तकालय [..] कैसे जोड़ें" के बारे में पूछता है। यह उत्तर केवल डिफ़ॉल्ट सेटिंग को ओवरराइड करता है।
whaefelinger

1

उपरोक्त टिप्पणियों में से एक में रॉब एल्सनर द्वारा प्रस्तुत समाधान पूरी तरह से काम करता है (OSX 10.9, एक्लिप्स केपलर)। एक को ":" द्वारा अलग किए गए उनके अतिरिक्त रास्तों को जोड़ना होगा।

आप $ {system_property: java.library.path} का भी उपयोग कर सकते हैं - Rob Elsner Nov 22 '01 at 0101


0

मूल लाइब्रेरी फ़ाइल नाम को जार फ़ाइल नाम के अनुरूप होना चाहिए। यह बहुत महत्वपूर्ण है। कृपया सुनिश्चित करें कि जार नाम और dll नाम समान हैं। इसके अलावा, कृपया देखें कि फेबियन स्टील की पोस्ट जौन के लिए मेरा डाउनलोड dll और jar के अलग-अलग नामों से युक्त थी। यह jawin.jar और jawin d । Dll था, dll फ़ाइल नाम में अतिरिक्त 'd' नोट करें। मैंने बस इसका नाम बदलकर jawin.dll कर दिया है और इसे ग्रहण में एक मूल पुस्तकालय के रूप में सेट किया है जैसा कि " http://www.eclipsezone.com/eclipse/forums/t49342.html " पोस्ट में बताया गया है


प्रश्न ग्रहण शुरू करने पर एक देशी पुस्तकालय (फ़ोल्डर) जोड़ने के बारे में है।
whaefelinger

0

किसी कारण से मुझे काम करने के लिए कई फ़ोल्डर नहीं मिल सके (वैसे यह थोड़ी देर के लिए था लेकिन जैसे ही मुझे अधिक dll की आवश्यकता थी और अधिक फ़ोल्डर्स जोड़े, मार्ग में कोई भी सफेद स्थान नहीं था)। फिर मैंने सभी आवश्यक dlls को एक फ़ोल्डर में कॉपी किया और मेरे java.library.path के रूप में काम किया और यह काम किया। मेरे पास कोई स्पष्टीकरण नहीं है - अगर कोई भी करता है, तो यह बहुत अच्छा होगा।


ठीक है, अगर एक मूल पुस्तकालय java.library.path के माध्यम से पाया जाता है और आप उस फ़ोल्डर में एक दूसरे को कॉपी करते हैं, तो यह स्वाभाविक प्रतीत होता है कि दूसरा भी पाया जाता है, है ना?
व्हिफेलिंगर

बेशक, यही कारण है कि मैं इस्तेमाल किया था, duh! मैं क्या सोच रहा था कि क्या एक के बिना एक से अधिक फ़ोल्डर जोड़ सकता है या बिना सामान के सहारे चल सकता है।
उस्तामान संगत

0

मौजूदा जवाबों में से कई यह मानते हैं कि आप इसे किसी विशेष परियोजना के लिए सेट करना चाहते हैं, लेकिन मुझे इसे स्वयं ग्रहण करने की आवश्यकता है SQL सर्वर JDBC ड्राइवर के लिए एकीकृत प्रमाणीकरण का समर्थन करने के लिए ।

ऐसा करने के लिए, मैंने अपने सामान्य लांचर के बजाय जावा कमांडलाइन से एक्लिप्स लॉन्च करने के इन निर्देशों का पालन ​​किया । तब मैंने उस स्क्रिप्ट को मेरे -Djava.library.path तर्क को जावा कमांडलाइन में जोड़ने के लिए संशोधित किया।


0
  1. विंडोज पर: लाइब्रेरी के पथ को पाथ पर्यावरण चर में जोड़ें।
  2. Linux पर: लाइब्रेरी में LD_LIBRARY_PATH परिवेश चर में पथ जोड़ें।
  3. Mac पर: लाइब्रेरी में DYLD_LIBRARY_PATH पर्यावरण चर में पथ जोड़ें।

java.library.path इसके संबंधित प्लेटफॉर्म पर ऊपर चर के मूल्यों के साथ initilized है।

यह किसी भी आईडीई पर काम करना चाहिए।

यदि आप कॉल करके मान की अपेक्षा करते हैं तो आप परीक्षण कर सकते हैं java -XshowSettings:properties


-2

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


अगर मैं गलत हूं तो मुझे सुधारें, लेकिन मेरा मानना ​​है कि DLL (या निष्पादन योग्य बायनेरिज़) की खोज करते समय विंडोज पर वर्तमान कामकाजी निर्देशिका स्वचालित रूप से शामिल है। इस प्रकार जब आप उस फ़ोल्डर में बदल जाते हैं जहाँ DLL होते हैं और फिर ग्रहण शुरू होते हैं, तो हाँ, जिस DLL को आप खोज रहे हैं, वह मिल जाता है। इसके अलावा, यह उत्तर थ्रेड स्टार्टर्स से कैसे संबंधित है?
व्हेलफिंगर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.