2010-02-06 16 views
14

संभव डुप्लिकेट एक जार में सभी की तैनाती:
Put external library to the JAR?NetBeans -

मैं NetBeans 6.8 है और मैं एक वर्ग है जो दो पुस्तकालयों (जार-फ़ाइलें) है लिखा था। इसे बिल्ड करना, मुझे अपने प्रोजेक्ट.जर और "lib" फ़ोल्डर के साथ "dist" फ़ोल्डर मिलता है जिसमें दो lib jar फ़ाइलें होती हैं।

मैं इसे एक जार फ़ाइल में कैसे प्राप्त कर सकता हूं? (मैं मैवेन/चींटी या इस तरह कुछ नहीं उपयोग करता हूं।)

+0

इस ब्लॉगपोस्ट को आजमाएं ... http://arunasujith.blogspot.com/2011/08/how-to-build-fat-jar-using-netbeans.html –

उत्तर

13

मूल समस्या यह है कि जावा का वर्तमान संस्करण बॉक्स के बाहर जार के अंदर जार का समर्थन नहीं करता है।

अनुशंसित समाधान आवश्यक पुस्तकालयों (सापेक्ष पथों की अनुमति है) को इंगित करने के लिए अपने जार के अंदर MANIFEST.MF फ़ाइल में क्लास-पथ लाइन का उपयोग करना है और फिर सभी फ़ाइलों को एक साथ तैनात करना और इसे "जावा- .jar "

यदि आप वास्तव में" जार-इन-जार "समाधान चाहते हैं, तो हमने कई वर्षों तक एक-जार का उपयोग किया है, लेकिन इससे ऊपर चले गए हैं क्योंकि हमारे लक्ष्य JVM ने ऊपर वर्णित समाधान के साथ बेहतर काम किया है।

http://one-jar.sourceforge.net/

मैं ग्रहण में fatjar प्लगइन के साथ इस्तेमाल किया। मुझे नेटबीन्स में इसे बनाने के साथ कोई अनुभव नहीं है, लेकिन एक चींटी लिपि में निर्माण करना आसान है, जो मुझे विश्वास है कि नेबबीन का उपयोग वैसे भी किया जाता है।

12

आप build.xml फ़ाइल में एक अतिरिक्त निर्माण लक्ष्य बना सकते हैं। और zipfileset और zipgroupfileset का उपयोग करें ताकि एक बड़ा जार उदा।

<target name="YourBigJar" depends="-post-jar"> 
    <jar destfile="BigJar.jar"> 
    <zipfileset src="dist/Project1.jar"/> 
    <zipfileset src="../OtherProject/dist/project2.jar"/> 
    <zipgroupfileset dir="../libs/."/> 
    </jar> 
</target> 
+0

चींटी का उपयोग कर +1 शायद सबसे अच्छा तरीका – stacker

+3

नोटिस है कि यह हस्ताक्षरित जार इत्यादि तोड़ देगा –

11

मैं वेवरिक से सहमत हूं। NetBeans के साथ ऐसा करने का सबसे आसान तरीका है अपने build.xml पर एक कस्टम लक्ष्य जोड़ना। (वैसे, नेटबीन का उपयोग करने के आधार पर, आप एंटी का उपयोग कर रहे हैं, क्योंकि नेटबीन आपकी जार फ़ाइल बनाने के लिए चींटी का उपयोग करता है।)

वेवरिक का एंटी लक्ष्य एक अलग नेटबीन प्रोजेक्ट से संकलित कोड को मर्ज करने के लिए डिज़ाइन किया गया प्रतीत होता है वर्तमान परियोजना की जार फ़ाइल। मेरे लक्ष्य नीचे वही करते हैं जो आप खोज रहे हैं।

<target name="-unjar-and-copy-lib-jars"> 
    <unjar dest="${build.classes.dir}"> 
     <fileset dir="lib"> 
      <include name="**/*.jar"/> 
     </fileset> 
     <patternset> 
      <exclude name="META-INF/**"/> 
      <exclude name="/*"/> 
     </patternset> 
    </unjar> 
</target> 

<target depends="init,compile,-pre-pre-jar,-pre-jar,-unjar-and-copy-lib-jars" name="fat-jar"> 
    <property location="${build.classes.dir}" name="build.classes.dir.resolved"/> 
    <jar destfile="${dist.jar}"> 
     <fileset dir="${build.classes.dir}"/> 
     <manifest> 
      <attribute name="Main-Class" value="${main.class}"/> 
     </manifest> 
    </jar> 
    <echo>To run this application from the command line without Ant, try:</echo> 
    <property location="${dist.jar}" name="dist.jar.resolved"/> 
    <echo>java -jar "${dist.jar.resolved}"</echo> 
</target> 

<target depends="clean,fat-jar" name="clean-and-fat-jar"/> 
+1

जब तक आप में बदलते हैं, यह खूबसूरती से काम करता है, धन्यवाद :) – Macmee

+0

अपने ब्लॉग के लिए एक नया लिंक है पद ? – kevingreen

+1

कोई बात नहीं, मैंने पाया: [नेटबीन से फैट जार] (http://joshuaborn.name/blog/cb49/) – kevingreen

1

आप बाहरी पुस्तकालयों प्रोग्राम के रूप में Class.getResourceAsStream() और एक FileOutputStream का उपयोग कर स्थापित करने के लिए जावा का उपयोग कर सकते हैं। पुस्तकालय आमतौर पर Java\lib\ext\ में जाएंगे।

यहाँ कैसे मैं इसे से संपर्क किया गया है:

मैं की एक प्रति रखे गए सभी जार के मैं एक .res सबपैकेज में इस्तेमाल किया। वहां से, मैं उन्हें कहीं भी कॉपी कर सकता हूं।

private void installLibraries() { 
    new Thread() { 

     @Override 
     public void run() { 
      System.out.println("Checking for libraries"); 

      File jre = new File(System.getProperty("java.home")); 
      File jar = new File(jre, "lib/ext/JAR_NAME.jar"); 
      //Create more File objects that wrap your JAR's 
      try { 
       boolean added = false; 

       if (!jar.exists()) { 
        copyResource(jar, "JAR_NAME.jar"); 
        added = true; 
       } 
       //Repeat for more JAR's 

       if (added) { 
        System.out.println("Libraries installed."); 
       } else { 
        System.out.println("Library check complete"); 

      } catch (IOException ex) { 
       System.out.println("Library installation failed."); 
       ex.printStackTrace(System.out); 
      } 
     } 

     private void copyResource(File dest, String src) throws IOException { 
      System.out.println("Copying resource " + src + " to " + dest); 
      InputStream in = THIS_CLASS_NAME.class.getResourceAsStream("/YOUR_PACKAGE/res/" + src); 
      dest.getParentFile().mkdirs(); 
      FileOutputStream out = new FileOutputStream(dest); 
      byte[] buffer = new byte[1024]; 
      int i = 0; 
      while ((i = in.read(buffer)) > 0) { 
       out.write(buffer, 0, i); 
      } 
      out.close(); 
      in.close(); 
     } 
    }.start(); 
} 

भागो इस विधि से पहले आप कुछ और करते हैं, और आप पूरी तरह से बाहरी जार फ़ाइलों को Netbeans आप देता है अनदेखा कर सकते हैं, और सिर्फ एक वितरित करते हैं। एक अतिरिक्त नोट के रूप में, मैंने javax.comm को स्थापित करने के लिए इस विधि का उपयोग किया, जिसे बाहरी रूप से वितरित करना पसंद नहीं था। यह एक .dll फ़ाइल और एक गुण फ़ाइल के साथ आया था। इन फ़ाइलों को सटीक उसी विधि का उपयोग करके स्थापित किया जा सकता है, लेकिन यह ध्यान देने योग्य है कि।डीएलएल फ़ाइल को Java\lib\ निर्देशिका में रखा जाना चाहिए और गुण फ़ाइलें Java\lib\ निर्देशिका में जाएं (\ext फ़ोल्डर में नहीं)।

3

मुझे एक अच्छा लेख here मिला है। लेकिन ऐसा लगता है कि यह उल्लेखनीय है कि यह बाहरी पुस्तकालयों को dest/lib फ़ोल्डर में पूछता है। आप इसे इस तरह से बना सकते हैं लेकिन आम तौर पर हमारे पास मूल फ़ोल्डर में lib फ़ोल्डर है (या मेरे पास क्या है)। यह सिर्फ

<zipgroupfileset dir="dist/lib" includes="*.jar"/> बदल गया है, तो

<zipgroupfileset dir="/lib" includes="*.jar"/>. 

को सब है कि।