2009-11-30 14 views
57

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

निर्माण के दौरान, मैं एक बंडल जार बनाता हूं, जिसमें निर्देशिका में प्रत्येक जार के लिए बंडल जार फ़ाइल को zipfileset में जोड़कर निर्भरता के साथ प्रोजेक्ट का कोड होता है।

समस्या यह है कि हर बार जब मैं एक जार जोड़ता हूं, या नाम बदलता हूं, तो मुझे build.xml फ़ाइल को अपडेट करना याद रखना चाहिए, क्योंकि मुझे उन zipfilesets को स्वचालित तरीके से जोड़ने का कोई तरीका नहीं मिला है जिसमें सभी शामिल होंगे एक निश्चित पैटर्न में जार (जैसे lib/*.jar)।

क्या ऐसा करने का कोई बेहतर तरीका है?

मैंने इस के लिए अपना स्वयं का चींटी कार्य लिखने पर विचार किया है, या प्रोग्रामिंग के लिए ग्रोवी की चींटी एपीआई का उपयोग करने पर विचार किया है, लेकिन यह सोच रहा था कि "वेनिला" चींटी का उपयोग करके ऐसा करने का कोई तरीका है या नहीं।

उत्तर

50

मेरे लक्ष्य में, मैं कुछ इस तरह है ऊपर। इस भाग को मैंने कहीं और से कॉपी किया है, इसलिए मैं इससे परिचित नहीं हूं।

त्वरित संपादन। जावैक को उन जारों के बारे में भी जानना आवश्यक है।

<path id="jars"> 
    <fileset dir="${lib.dir}" includes="**/*.jar"/> 
</path> 

<target name="compile"> 
    <mkdir dir="${build.dir}"/> 
    <javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="jars" debug="on"/> 
</target> 
+1

जोन्सकब के लिए एक समान विधि है जिसमें अंतिम 'build.xml' (बड़ी तस्वीर) है जो इस उत्तर में अनुपलब्ध है: http://www.mkyong.com/ant/ant-create-a-fat-jar -फाइल/ – Stephan

0

यहां एक चींटी लक्ष्य का एक सरल उदाहरण है जो एक जार (नाम test.jar) बनाएगा जिसमें lib निर्देशिका के तहत सभी जार फ़ाइलें शामिल होंगी। शायद यह आपकी समस्या का समाधान करेगा? यहाँ कैसे मैं अपने classpath निर्माण है

<jar destfile="${store.dir}/temp_final.jar" filesetmanifest="skip"> 
    <zipgroupfileset dir="dist" includes="*.jar"/> 
    <zipgroupfileset dir="dist/lib" includes="*.jar" excludes=""/> 

    <manifest> 
     <attribute name="Main-Class" value="${main.class}"/> 
     <attribute name="Class-Path" value="${mf.classpath}"/> 
    </manifest> 
</jar> 

और::

<path id="build.classpath"> 
    <fileset dir="${basedir}/"> 
     <include name="${lib.dir}/*.jar"/> 
    </fileset> 
</path> 

<pathconvert property="mf.classpath" pathsep=" "> 
    <path refid="build.classpath"/> 
    <mapper> 
     <chainedmapper> 
      <flattenmapper/> 
      <globmapper from="*.jar" to="lib/*.jar"/> 
     </chainedmapper> 
    </mapper> 
</pathconvert> 

mf.classpath पैकेज लक्ष्य पोस्ट से प्रयोग किया जाता है

<target name="jar"> 
    <jar destfile="test.jar"> 
     <fileset dir="lib/" includes="**/*.jar" /> 
    </jar> 
</target> 
+1

क्या जार फ़ाइलों को आसानी से घोंसला बनाया जा सकता है? क्या आप वाकई काम करेंगे? – abyx

+0

हमम, मुझे नहीं लगता, मैं जार की बजाय युद्ध और वेबपैप्स सोच रहा था, माफ करना '। – Upgradingdave

29

एक zipgroupfileset का प्रयोग करें। उदाहरण के लिए:

<target name="jar"> 
    <jar destfile="foo.jar" basedir="${dir.classes}"> 
     <zipgroupfileset dir="lib" includes="*.jar"/> 
    </jar> 
</target> 

zipgroupfilesetZip कार्य के साथ दर्ज है।

<target name="-post-jar"> 

    <property name="store.jar.name" value="MyJarName"/> 

    <property name="store.dir" value="dist"/> 
    <property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/> 

    <echo message="Packaging ${application.title} into a single JAR at ${store.jar}"/> 

    <jar destfile="${store.dir}/temp_final.jar" filesetmanifest="skip"> 
     <zipgroupfileset dir="dist" includes="*.jar"/> 
     <zipgroupfileset dir="dist/lib" includes="*.jar"/> 

     <manifest> 
      <attribute name="Main-Class" value="${main.class}"/> 
     </manifest> 
    </jar> 

    <zip destfile="${store.jar}"> 
     <zipfileset src="${store.dir}/temp_final.jar" 
     excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/> 
    </zip> 

    <delete file="${store.dir}/temp_final.jar"/> 
    <delete dir="${store.dir}/lib"/> 
    <delete file="${store.dir}/README.TXT"/> 
</target> 

मैं build.xml फ़ाइल के अंत करने के लिए इस लक्ष्य परिभाषा जोड़ दिया है:

+0

जोन्सकैब ने उत्तर दिया, वास्तव में यह समाधान है। इसे कभी नहीं देखा, क्योंकि यह ज़िप कार्य – abyx

+0

में छिपा हुआ है, इसके साथ बड़ी समस्या यह है कि जार फ़ाइलों में अतिरिक्त फ़ाइलें होती हैं, आमतौर पर मैनिफ़ेस्ट निर्देशिका में। उदाहरण के लिए, वसंत ढांचे के कई जार में spring.handlers, spring.schemas और spring.tooling फ़ाइलें शामिल हैं .. ठीक है, मुझे नहीं पता है कि इन्हें कैसे संभालना है .. विलय? – ticktock

+1

@ जॉर्जबैक्सटर एक ही चीज़ की तलाश में थे और [यह] (http://stackoverflow.com/a/24083318/2208271) कर रहे थे। अगर आपको बेहतर समाधान मिल जाए तो मुझे बताएं। – Sithsu

6

आप यहाँ NetBeans का उपयोग कर के उन लोगों के लिए है कि कैसे आप zipgroupfileset का उपयोग कर बंडल पुस्तकालयों के साथ जार संग्रह बना सकते है। लक्ष्य नाम -पोस्ट-जार है।