जावा पारिस्थितिकी तंत्र के एक सबसेट में, मुख्य रूप से जेएनआई से संबंधित (जिसके बिना जाने का कोई रास्ता नहीं है अगर आपको किसी प्रकार की विरासत या सी या किसी अन्य भाषा में लिखे गए दुर्लभ और विशिष्ट कोड को एकीकृत करना है), तो जावा जैसी कोई चीज नहीं है। library.path। संक्षेप में, यह कुछ हद तक क्लासपैथ के अनुरूप है, लेकिन जावा कक्षाओं और * .jar फ़ाइलों के लिए नहीं, बल्कि देशी पुस्तकालयों के लिए - एक सिस्टम प्रॉपर्टी जो जेवीएम को बताती है कि इन देशी पुस्तकालयों को कैसे देखना है (विंडोज में या यूनिक्स के साथ .so)।
यह संपत्ति एक बार सेट हो जाती है, जेवीएम शुरू करने से पहले, वैश्विक सिस्टम गुणों के माध्यम से, या जेवीएम के लिए -Dname = मान स्विच के रूप में, और उसके बाद यह केवल-पढ़ने के लिए बन जाता है। अधिक सटीक रूप से, आप इसे बदल सकते हैं, लेकिन कार्यक्रम के काम पर इसका कोई प्रभाव नहीं पड़ेगा, क्योंकि आपके द्वारा इस संपत्ति को अपडेट करने के बाद, JVM इसे फिर से चालू नहीं करेगा और नए मूल्य का उपयोग नहीं करेगा।
कटौती के तहत - इस संपत्ति को रनटाइम में कैसे बदलना है, और जावा काम में वास्तव में देशी पुस्तकालयों को कैसे लोड किया जाए, इसके बारे में थोड़ा।
हालांकि, मक्खी पर java.library.path को बदलने की क्षमता बहुत आसान होगी - फिर आपको JBoss को चलाने के लिए स्क्रिप्ट को फिर से लिखना, फिर से लिखना और फिर से लिखना नहीं पड़ेगा, उदाहरण के लिए, उनमें प्रतिबिंबित करने के लिए सभी आवश्यक पथ पहले से ही ऐप सर्वर शुरू होता है।
और इन तरीकों को बदलने का एक ऐसा मौका है जिसमें जेवीएम देशी पुस्तकालयों की खोज करता है। यहाँ पर विशिष्ट तकनीकों को दिखाया गया है -
blog.cedarsoft.com/2010/11/setting-java-library-path-programmatically और यहाँ -
niclothian.com/blog/2008/11/19/modify-javalibrary.ath-at-runtime ।
और यहां मैं लोडिंग तंत्र का वर्णन करूंगा, और किसी कारण से, लिंक के कार्यों से क्या वर्णित है। आमतौर पर, देशी पुस्तकालयों को एक स्थिर इनिशियलाइज़र के माध्यम से लोड किया जाता है:
static {
try {
System.loadLibrary(«dp-integ»);
}
}
* This source code was highlighted with Source Code Highlighter .
जो इस तरह दिखता है:
public static void loadLibrary( String libname) {
Runtime.getRuntime().loadLibrary0(getCallerClass(), libname);
}
* This source code was highlighted with Source Code Highlighter .
और आगे रनटाइम क्लास में:
synchronized void loadLibrary0(Class fromClass, String libname) {
// ,
SecurityManager security = System.getSecurityManager();
if (security != null ) {
security.checkLink(libname);
}
if (libname.indexOf(( int ) File .separatorChar) != -1) {
throw new UnsatisfiedLinkError( "Directory separator" +
"should not appear in library name: " + libname);
}
ClassLoader.loadLibrary(fromClass, libname, false );
}
* This source code was highlighted with Source Code Highlighter .
यानी अंत में, क्लासलोडर के माध्यम से, नियमित कक्षाओं की तरह, देशी पुस्तकालयों को लोड किया जाता है। ClassLoader वर्ग में दो गुण होते हैं जिसमें आरंभिक खोज पथ कैश्ड होते हैं।
// The paths searched for libraries
static private String usr_paths[];
static private String sys_paths[];
* This source code was highlighted with Source Code Highlighter .
ClassLoader.loadLibrary पद्धति का कोड (fromClass, libname, false), काफी लंबा, और कई जांचों से जुड़ा हुआ है, संक्षिप्त रूप में ऐसा दिखता है।
// Invoked in the java.lang.Runtime class to implement load and loadLibrary.
static void loadLibrary(Class fromClass, String name,
boolean isAbsolute) {
ClassLoader loader = (fromClass == null ) ? null : fromClass.getClassLoader();
if (sys_paths == null ) {
// ,
usr_paths = initializePath( "java.library.path" );
// , ,
// boot classpath.
sys_paths = initializePath( "sun.boot.library.path" );
}
// , ,
// , -
// Oops, it failed
throw new UnsatisfiedLinkError( "no " + name + " in java.library.path" );
}
* This source code was highlighted with Source Code Highlighter .
इस प्रकार, अब देशी पुस्तकालय का लोडिंग तंत्र अधिक स्पष्ट हो गया है।
आप या तो क्लास लोडर की sys_paths संपत्ति को शून्य करने के लिए सेट कर सकते हैं, या बस sys_paths / usr_paths गुणों को बदल सकते हैं, अपने मूल पुस्तकालयों में उनके लिए आवश्यक पथ जोड़ सकते हैं।