अंतर्निहित समस्या की पृष्ठभूमि यहां है, मैं एक परियोजना पर एक समूह के साथ सहयोग कर रहा हूं जो Swt
पुस्तकालयों का उपयोग करता है और मैं तैनाती के लिए सॉफ़्टवेयर को पैकेज करने का प्रयास कर रहा हूं। जैसा कि यह पता चला है SWT
बहुत मंच/वास्तुकला निर्भर है। मैं एक ही पैकेज में सभी छः jar
एस (लिनक्स, मैक, जीत और 32/64-बिट) को पैकेज करने में सक्षम होना चाहता हूं और सिस्टम के आधार पर उचित लाइब्रेरी का उपयोग करना चाहता हूं। मुझे एहसास है कि यह एक कठिन चुनौती है हालांकि, Swing
(या कुछ और) पर स्विच करना वास्तव में अभी एक विकल्प नहीं है।निष्पादन के दौरान संसाधन लोड करने में समस्या
मुझे कई प्रासंगिक धागे (@Aaron Digulla's thread और @mchr's thread) मिले हैं जो मुझे समस्या के बारे में मूल्यवान अंतर्दृष्टि प्रदान करते हैं। मैंने @Alexey Romanov here द्वारा प्रस्तावित समाधान को लागू करने का प्रयास किया है। एक अंतर के साथ, loadSwtJar()
विधि के रूप में वह प्रस्ताव स्थिर नहीं है, मैं ऑब्जेक्ट को तुरंत चालू करता हूं, और उसके तुरंत बाद, ऑब्जेक्ट पर कुछ भी करने से पहले विधि को चलाता हूं।
ऐसा प्रतीत होता है क्योंकि लोडिंग प्रक्रिया ठीक से काम नहीं करती है। इस बयान के लिए मेरे तर्क इस प्रकार है:
- सभी
Swt
जार निष्पादन योग्य जार फ़ाइल के classpath से हटा रहे हैं, तोException in thread "main" java.lang.NoClassDefFoundError: org/eclipse/swt/events/MouseListener
फेंक दिया जाता है जो के कारण होता है:java.lang.ClassNotFoundException: org.eclipse.swt.events.MouseListener
इस साधन कि पुस्तकालयों को कक्षा में नहीं मिला है, क्या मुझे गलती है?
- यदि
swt
कक्षाओं को कक्षाओं पर छोड़ दिया गया है तो पहली जार फ़ाइल को निष्पादन के दौरान सिस्टम द्वारा उपयोग किया जाता है। इसका अर्थ यह है कि यदि gtk-linux-x86_64 जार की सूची पर पहला स्विट जार होता है तो सिस्टम उस का उपयोग करने का प्रयास करता है, भले ही सिस्टम Win32 या Mac OSX है।
मैं कुछ उत्पादन को जोड़ने के लिए है, तो loadSwtJar()
विधि सही जार चुनने है यह देखने की कोशिश की है, और उत्पादन, सही सभी प्लेटफार्मों मैं कोशिश की है पर लगता है सही पैकेज में के रूप में चयन किया गया है (और फ़ाइलों मौजूद है चलने योग्य जार में)। लेकिन फिर भी सही लाइब्रेरी लोड नहीं की गई है इसलिए निष्पादन त्रुटियां होती हैं: Exception in thread "main" java.lang.reflect.InvocationTargetException
पूर्व के कारण: Caused by: java.lang.UnsatisfiedLinkError: Cannot load 32-bit SWT libraries on 64-bit JVM
(ध्यान दें कि यह मेरी लिनक्स मशीन पर त्रुटि है यदि मैं 64-बिट और 32 बिट स्विट की उपस्थिति का क्रम बदलता हूं build.xml
फ़ाइल पर पुस्तकालय)
तो, यहां समस्या क्या प्रतीत होती है? क्या मैं कुछ विस्तार से चूक रहा हूं, या क्या सिस्टम गुणों की जांच करना और उचित अनुसार लाइब्रेरी लोड करना संभव नहीं है?
अंत में नीचे मेरी बिल्ड फ़ाइल का एक अंश है, यह अनुमान लगाया गया है कि यह समस्या के स्रोत को खोजने में मदद कर सकता है।
अग्रिम धन्यवाद,
संपादित करें: एक सहयोगी के साथ एक लंबी डिबग सत्र के बाद, समस्या (MacOS पर धागा प्रबंधन मैं here उल्लेख किया के बारे में एक कष्टप्रद बग को छोड़कर) हल हो गई है। इसमें एएनटी बिल्ड के साथ-साथ मुख्य वर्ग के तरीके के साथ tweaking शामिल थे।(मुख्य वर्ग, जैसा कि यह निकला, & एसडब्ल्यूटी लाइब्रेरी से संदर्भों को लागू करने का विस्तार कर रहा था जिसका मतलब था कि कोड बिल्कुल संकलित नहीं होगा, मुख्य वर्ग को किसी अन्य वर्ग के साथ लपेटा जाएगा और वहां से एसडब्ल्यूटी जार लोड किया जाएगा जो पर्याप्त प्रतीत होता है समस्या से निपटने के लिए)
धन्यवाद और योगदान देने वाले हर किसी के लिए विशेष रूप से @Aaron। काबिल ए तारीफ़!
धन्यवाद हारून पर एक महान संदर्भ (http://mindprod.com/jgloss/properties.html#OSNAME) मिला है। मुझे यह कहना है कि मुझे यकीन नहीं है कि आप swtFiles को खोजने के लिए कैसे खोदते हैं, क्या आपके पास अन्य सभी निर्भरताओं या किसी अन्य तरीके से एक बड़ी जार के अंदर आपकी swt फ़ाइलें हैं? – posdef
@Aaron: एक और सवाल, क्या आपने एसडब्ल्यूटी पैकेजों को बिना हस्ताक्षर किए किसी भी समस्या का अनुभव किया है? या यह सिर्फ मुझे है ... – posdef
@posdef: मैंने सभी सामान्य जेएआर को 'lib/'और छह SWT JARs नामक निर्देशिका में' swt /' में डाल दिया है। यदि आप उन्हें सभी को एक निर्देशिका में डालते हैं, तो संभावना है कि मुख्य जेएआर के मेनिफेस्ट से क्लासपाथ गलत लोड करने का प्रयास करेगा। –