2013-01-16 15 views
8

मैंने इस पर बहुत से लेख/स्पष्टीकरण पढ़े हैं और बहुत सारे घंटे बिताए हैं, लेकिन सब कुछ या तो व्यापक या विशिष्ट है।एकाधिक जारों को एक में कैसे मिलाएं?

यह प्रश्न वास्तव में केवल मेरे द्वारा किए गए ऐप्पल पर लागू होता है। इसमें एक कक्षा है, और 2 अन्य जार पुस्तकालयों की आवश्यकता है। मैंने इन परियोजनाओं में शामिल किया है (कई परियोजनाएं, क्योंकि मैंने नेटबीन्स और एक्लिप्स में यह कोशिश की है ... एक कक्षा प्रोजेक्ट को फिर से बनाना आसान है)। इन सब का मुद्दा यह है कि मेरे एचटीएमएल/वेब प्रोजेक्ट को एक से अधिक जार से निपटना या उन्हें संदर्भित नहीं करना चाहिए। यह बिल्कुल जटिल एप्लेट/प्रोजेक्ट नहीं है।

मूल रूप से, मैंने इसे नेटबीन में बनाया। इसमें मुख्य पैकेज है, और 2 जार जोड़ने के बाद, उन्हें "पुस्तकालय" क्षेत्र ("संसाधन" फ़ोल्डर) में रखा जाता है। इसे बनाने के बाद, नेटबीन्स मेरे एक पैकेज/कक्षा के लिए एक जार बनाता है, और उसके बाद 2 अन्य पुस्तकालयों को इसके आगे "lib" निर्देशिका में रखता है। मैं उन्हें एक, वितरित जार में होना चाहता हूं। मैंने देखा है कि कई चीजों से, मैंने build.xml में निम्नलिखित डालने का प्रयास किया है:

<target name="YourBigJar" depends="-post-jar"> 
    <jar destfile="dist/BigJar.jar"> 
    <zipfileset src="dist/cxapplet.jar"/> 
    <zipfileset src="resources/dpotapi.jar"/> 
    <zipfileset src="resources/dpotjni.jar"/> 
    </jar> 
</target> 

लेकिन यह कुछ भी नहीं पैदा करता है। मुझे यह NetBeans - deploying all in one jar से मिला है। मैं build.xml का उपयोग करने के बारे में नहीं जानता/समझता हूं, इसलिए अगर कुछ गलत हो रहा है तो मुझे आश्चर्य नहीं होगा (स्पष्ट रूप से), लेकिन मुझे कोई त्रुटि/चेतावनी संदेश नहीं मिला है।

जब मैंने इसे ग्रहण में बनाया, तो यह प्रभावी रूप से उन्हें जोड़ता है, लेकिन जब मैं अपने वास्तविक वेब प्रोजेक्ट में जार का उपयोग करता हूं, तो यह कहता है कि यह अन्य 2 जारों से कक्षाएं नहीं ढूंढ सकता है। मैं समझ नहीं पा रहा हूं कि इसे कैसे ठीक किया जाए, लेकिन क्या यह क्लासपाथ समस्या है? ग्रहण में, मैं "lib" नामक एक नई निर्देशिका बनाता हूं और इसमें जार डालता हूं। फिर, मैं प्रोजेक्ट पर राइट-क्लिक करता हूं, "जावा बिल्ड पथ" पर जाता हूं, और जार जोड़ता हूं, उन्हें "ऑर्डर एंड एक्सपोर्ट" टैब के अंतर्गत भी चेक करता हूं। मैंने जो चीजें पढ़ी हैं, मैंने प्रोजेक्ट पर राइट-क्लिक करें, "एक्सपोर्ट" चुनें, "जार" चुनें, ".classpath" और ".project" फ़ाइलों को अनचेक करें, केवल "जेनरेट की गई क्लास फाइलों और संसाधनों को निर्यात करें" की जांच करें, और उसके बाद इसे मैनिफेस्ट फ़ाइल उत्पन्न करने की अनुमति दें। जैसे मैंने कहा, यह एक जार उत्पन्न करता है, लेकिन इसकी सामग्री मेरा पैकेज है और फिर एक "lib" निर्देशिका है जिसमें 2 अन्य जार हैं। घोषणापत्र वहां है, लेकिन यह बहुत खाली है और किसी भी फाइल का संदर्भ नहीं देता है (सुनिश्चित नहीं है कि यह महत्वपूर्ण है)। जब मैं इसे अपने वेब ऐप में डालता हूं, तो यह कहता है कि एप्लेट अन्य वर्गों को नहीं ढूंढ सकता है।

यह इतना आसान लगता है - एक पैकेज/कक्षा, दो बाहरी जार ... एक एप्लेट के रूप में वितरण के लिए बनाया गया जब एक जार में गठबंधन। कोई विचार?

अद्यतन:

जब से हम Maven का उपयोग शुरू किया, किसी को एक Maven प्लगइन का उपयोग करते हुए देखा। इसलिए हम एप्लेट घर (क्योंकि यह कई परियोजनाओं भर में प्रयोग किया जाता है) एक नई परियोजना बना दी, और अंत में हमारे pom.xml में यह प्रयोग किया जाता है,:

<build> 
    <resources> 
    <resource> 
     <directory>${basedir}/applet</directory> 
     <excludes> 
     <exclude>codesignstore</exclude> 
     </excludes> 
    </resource> 
    <resource> 
     <directory>${basedir}/src/main/resources</directory> 
     <filtering>true</filtering> 
    </resource> 
    </resources> 
    <plugins> 
    <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.2-beta-5</version> 
     <configuration> 
     <descriptorRefs> 
      <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
     <finalName>cxapplet</finalName> 
     <archive> 
      <index>true</index> 
      <manifest> 
      <addDefaultImplementationEntries>true</addDefaultImplementationEntries> 
      </manifest> 
     </archive> 
     <appendAssemblyId>false</appendAssemblyId> 
     </configuration> 
     <executions> 
     <execution> 
      <id>make-my-applet-jar</id> 
      <phase>package</phase> 
      <goals> 
      <goal>single</goal> 
      </goals> 
     </execution> 
     </executions> 
    </plugin> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jarsigner-plugin</artifactId> 
     <version>1.2</version> 
     <executions> 
     <execution> 
      <id>sign</id> 
      <goals> 
      <goal>sign</goal> 
      </goals> 
     </execution> 
     </executions> 
     <configuration> 
     <keystore>${basedir}/applet/codesignstore</keystore> 
     <alias>codesigncert</alias> 
     <storepass>HIDDEN</storepass> 
     <keypass>HIDDEN</keypass> 
     </configuration> 
    </plugin> 
    </plugins> 
</build> 

और यह अच्छा था क्योंकि यह उपयोग करने के लिए हमें की अनुमति हमारे कोड हस्ताक्षर प्रमाणपत्र स्वचालित रूप से इसे भी हस्ताक्षर करने के लिए।

+1

* "यह सब बात यह है कि मेरे एचटीएमएल/वेब प्रोजेक्ट को एक से अधिक जार से निपटना नहीं चाहिए" * ऐसा करने के लिए यह छोटा है ताकि ब्राउजर इसे संभाल सके। * "कोई विचार?" * जार को सामान्य तरीके से तैनात करें (जिसमें आपकी वर्तमान रणनीति के फायदे हैं) और स्वयं को समय बचाएं। –

+0

एक जार की निर्भरता को दूसरे में बेहतर बनाना बेहतर है। कई जार बनाने के उपकरण आपके काम को आसान बनाते हैं। –

+0

@joeyrohan मुझे यकीन नहीं है कि आपका क्या मतलब है, लेकिन यही कारण है कि मैं नेटबीन्स और ग्रहण के निर्माण उपकरण का उपयोग करने की कोशिश कर रहा हूं, जिसे मैंने सोचा था, इसे पूरा करने के लिए। – Ian

उत्तर

4

सबसे पहले, मुझे कहना है कि जारों को गठबंधन करने का कोई कारण नहीं है - आप अपनी कक्षा फ़ाइल (जार में नहीं) और इसके अलग-अलग आश्रित जार का उपयोग करके एक एप्लेट तैनात कर सकते हैं।

हालांकि, अगर आपको लगता है कि आपको अपनी कक्षा और इसकी सभी निर्भरताओं से एक बड़ा जार बनाना होगा, तो आप ऐसा कर सकते हैं।

आप जार फ़ाइलों को किसी अन्य जार फ़ाइल में नहीं डाल सकते हैं, हालांकि - जार फाइलें इस तरह से काम नहीं करती हैं। आपको जार फ़ाइलों को निकालने के लिए सभी चीजों की आवश्यकता है, और उसके बाद फिर से एक जार में ज़िप किया जाता है।

यदि आप ऐसा करने जा रहे हैं, तो मैं इसे करने के लिए Maven बिल्ड टूल का उपयोग करने का सुझाव दूंगा। एक बार जब आप मेवेन के साथ अपना निर्माण सेट अप करते हैं, तो आप अपने लिए एक बड़ा जार बनाने के लिए Maven Assembly Plugin कॉन्फ़िगर कर सकते हैं।

मुझे पता है कि ग्रहण मेवेन का समर्थन करता है, और मुझे लगता है कि नेटबीन भी करता है।

+0

क्षमा करें, मुझे पता था कि आपके द्वारा प्रदान किए गए कारणों से जार संयोजन केवल काम नहीं करेगा। तो मुझे लगता है कि मेरा मुद्दा उम्मीद है कि कोड/कार्य/तर्क का एक सरल उदाहरण प्राप्त करें जो बताता है कि मैं अपनी पसंद के परिदृश्य में क्या चाहता हूं - ग्रहण, नेटबीन्स, मेवेन, जो भी हो। तो जैसा कि आपने मेवेन का उपयोग करने का सुझाव दिया था, मुझे नहीं पता था कि आप ऐसा करने के लिए कुछ कदम प्रदान कर सकते हैं या नहीं। मैं दूसरे लिंक को देखूंगा (जैसा कि मैंने मैवेन स्थापित किया है और इसे एक अलग परियोजना में उपयोग कर रहा हूं, हालांकि मैं इसे प्रबंधित करने वाला नहीं हूं)। तो धन्यवाद :) – Ian

-1

अपने बिन निर्देशिका के आधार से, कोशिश क्यों नहीं:

jar.exe -cvf cxapplet.jar * 

प्लेस अपने बाहरी जार फ़ाइलों आप अपने bin निर्देशिका में उचित स्थान में, और मैन्युअल रूप से बाहरी जार फ़ाइलों के साथ अपने वर्ग फ़ाइलों जार।

वैकल्पिक रूप से, this thread देखें जो आपके लिए अधिक जानकारी प्रदान कर सकता है।

+0

"क्यों कोशिश नहीं करें" - क्योंकि मैंने नहीं किया इसके बारे में मत सोचो :) यह मेरे दिमाग को कभी पार नहीं कर पाया, और मुझे नहीं पता था कि जार उपकरण का प्रभावी ढंग से उपयोग कैसे करें, या बिन पर इसका उपयोग करने के बारे में सोचें। साथ ही, 'बिन' निर्देशिका में एकमात्र चीज मेरी मुख्य कक्षा का संकलित कोड है (इसके पैकेज के माध्यम से), तो मैं' lib' निर्देशिका ('bin' के बगल में) में चीज़ें कैसे शामिल करूं, जो दो बाहरी जार हैं , और 'bin' निर्देशिका की सामग्री के साथ उन्हें निकालें/गठबंधन करें? – Ian

+0

(मैं इसे 4 महीने पहले की कोशिश की गई स्मृति की याद से कर रहा हूं)। परियोजना के निर्माण के बाद बस अपने lib dir को अपने निर्माण डीआईआर में कॉपी करें। इसके अलावा, मेरे संपादित जवाब देखें। – AerusDar

+0

जीज़, मुझे नहीं पता कि मैंने ऐसा क्यों नहीं किया। तो जब मैंने कोशिश की, तो यह उन्हें गठबंधन करता है, लेकिन यह केवल दो बाहरी जार को नए जार की जड़ में डाल देता है ... लेकिन ऐसा लगता है कि मुझे वास्तव में जो चाहिए वह बाहरी जार से सबकुछ निकालना है और फिर उन सभी को ज़िप करना है पुनः साथ। क्या इसका कोई मतलब है? नेटबीन्स प्रभावी रूप से वही काम कर रहा है जो आपने प्रदान किया है, सिवाय इसके कि उन्हें मेनिफेस्ट फ़ाइल में क्लासपाथ में भी जोड़ा गया है ताकि वे पहचानने योग्य हों (या फिर भी काम करता है)। – Ian

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