2009-05-13 16 views
35

में से मेनिफेस्ट क्लास-पथ जेनरेट करें, नीचे दी गई बिल्ड फ़ाइल में, जार लक्ष्य मैनिफेस्ट क्लास-पथ के लिए jar.class.path प्रॉपर्टी को संदर्भित करता है। संकलन लक्ष्य project.class.path एंट

यहां पर अनावश्यकता है, क्योंकि jar.class.path और project.class.path बहुत समान हैं। लाइब्रेरी जोड़े जाने पर उन्हें अपडेट किया जाना चाहिए, यदि पुस्तकालयों की सूची बहुत लंबी हो जाती है तो दर्द हो सकता है। क्या कोई बेहतर तरीका है? कोई समाधान क्रॉस-प्लेटफॉर्म होना चाहिए और हमेशा सापेक्ष पथ का उपयोग करना चाहिए।

संपादित करें:
इसे एक फाइलसेट से जेएआर क्लासपाथ उत्पन्न करना चाहिए, न कि अन्य तरीकों से, इसलिए मैं वाइल्डकार्ड का उपयोग उदाहरण के लिए कर सकता हूं निर्देशिका में सभी जेएआर फाइलों को शामिल करें।

<?xml version="1.0"?> 
<project name="Higgins" default="jar" basedir="."> 

    <property name="jar.class.path" value="lib/forms-1.2.0.jar lib/BrowserLauncher.jar"/> 

    <path id="project.class.path"> 
     <pathelement location="build"/> 
     <fileset dir="lib"> 
     <include name="forms-1.2.0.jar"/> 
     <include name="BrowserLauncher.jar"/> 
     </fileset> 
    </path> 

    <target name="prepare"> 
     <mkdir dir="build"/> 
    </target> 

    <target name="compile" depends="prepare" description="Compile core sources"> 
     <javac srcdir="src" 
       includes="**" 
       destdir="build" 
       debug="true" 
       source="1.5"> 
      <classpath refid="project.class.path"/> 
     </javac> 
    </target> 

    <target name="jar" depends="compile" description="Generates executable jar file"> 
     <jar jarfile="higgins.jar"> 
      <manifest> 
       <attribute name="Main-Class" value="nl.helixsoft.higgins.Main"/> 
       <attribute name="Class-Path" value="${jar.class.path}"/> 
      </manifest> 
      <fileset dir="build" includes="**/*.class"/>    
      <fileset dir="src" includes="**/*.properties"/>   
     </jar> 
    </target> 

</project> 

उत्तर

41

एंट 1.7 या उससे ऊपर मानते हुए, आप manifestclasspath कार्य का उपयोग कर सकते हैं।

<path id="dep.runtime"> 
    <fileset dir="./lib"> 
     <include name="**/*.jar" /> 
    </fileset> 
</path> 
<property name="dep_cp" value="${toString:dep.runtime}" /> 

<target name="default"> 
    <manifestclasspath property="manifest_cp" jarfile="myjar.jar"> 
     <classpath refid="dep.runtime" /> 
    </manifestclasspath> 
    <echo message="Build Classpath: ${dep_cp}" /> 
    <echo message="Manifest Classpath: ${manifest_cp}" /> 
</target> 
+1

यह काम करता है, लेकिन केवल तभी जब आपके क्लासपाथ में पूर्ण पथ नहीं हैं। उदाहरण के लिए, यदि आप डेबियन पैकेज 'libhibernate3-java' का उपयोग कर रहे हैं जो '/ usr/share/java/hibernate3.jar' में स्थापित होता है और आप इसे अपने क्लासपाथ में शामिल करते हैं, तो manifestclasspath चींटी कार्य एक त्रुटि फेंक देगा। Qianjigui का समाधान अभी भी काम करता है। – joscarsson

2

तुम सिर्फ एक आम सब-पाथ दो (या अधिक) पथ के बीच साझा किया चाहते हैं, ऐसा करने के लिए आसान है:

<path id="lib.path> 
    <fileset dir="lib"> 
     <include name="forms-1.2.0.jar"/> 
     <include name="BrowserLauncher.jar"/> 
    </fileset> 
</path> 

<path id="project.class.path"> 
    <pathelement location="build"/> 
    <path refid="lib.path"/> 
</path> 

<property name="jar.class.path" refid="lib.path"/> 

संपादित क्षमा करें, मैं सवाल गलत समझा। इस प्रयास करें:

<property name="jar.class.path" value="lib/forms-1.2.0.jar lib/BrowserLauncher.jar"/> 

<path id="project.class.path"> 
    <pathelement location="build"/> 
    <fileset dir="." includes="${jar.class.path}"/> 
</path> 
+0

नहीं, यह गलत है। इस मामले में, jar.class.path का मान रिक्त स्थान के बजाय कोलन द्वारा अलग किया जाता है, और इससे भी बदतर, यह जार मैनिफेस्ट के लिए इसे बेकार बनाने के लिए पूर्ण पथ का उपयोग करेगा। टिप्पणी के जवाब में – amarillion

+0

संपादित उत्तर। –

+0

हाँ, यह मैंने जो उदाहरण दिया है उसमें काम करता है। लेकिन मैं वास्तव में एक फाइलसेट से जार क्लासपाथ बनाना चाहता हूं, न कि दूसरी तरफ, इसलिए मैं वाइल्डकार्ड का उपयोग कर सकता हूं। – amarillion

1

आप <pathconvert> उपयोग कर सकते हैं (जो एक फ़ाइलसेट शामिल कर सकते हैं) एक सादे स्ट्रिंग में एक पथ परिवर्तित करने के लिए। आप की संभावना < करने की आवश्यकता होगी एक फाइल करने के लिए कि स्ट्रिंग > गूंज, का उपयोग करें, या तो < की जगह > या <replaceregexp> अग्रणी पथ बिट्स काटना तो अंत में अंतिम संपत्ति में चालाकी से स्ट्रिंग लोड करने के लिए <loadfile> का उपयोग करें।

पाठक को एक अभ्यास के रूप में कार्यान्वयन छोड़ दिया गया।

+0

यह काम करता है। मैंने कुछ बिंदु पर अपनी चींटी स्क्रिप्ट में इस समाधान का उपयोग किया। लेकिन यह गंदा है। –

+0

वास्तव में मेसी। मैं वास्तव में इस का एक कामकाजी उदाहरण देखना चाहता हूं जो क्रॉस-प्लेटफ़ॉर्म तरीके से अग्रणी पथ बिट्स को चॉप करता है ... – amarillion

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

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

<target depends="compile" name="buildjar"> 
    <jar jarfile="${basedir}/${test.jar}"> 
    <fileset dir="${build}" /> 
    <manifest> 
     <attribute name="Main-Class" value="com.mycompany.TestMain"/> 
     <attribute name="Class-Path" value="${manifest.classpath}"/> 
    </manifest> 
</jar> 
</target> 

अधिक जानकारी के लिए this article की जाँच करें।

+0

धन्यवाद यह बहुत उपयोगी रहा है! –

+0

यह उत्तर क्यों स्वीकार नहीं किया जाता है? यह सही है और कई पथ कन्वर्टर्स के साथ भी काम करता है – ha9u63ar