2010-01-16 19 views
6

मेरा लक्ष्य है कि मेरी चींटी बिल्ड स्क्रिप्ट एक युद्ध फ़ाइल बनाएं और जार शामिल करें जो इस परियोजना पर निर्भर करता है। सबसे अच्छा कोड मैं इस समय के साथ आ सकता है निम्नलिखितएक lib निर्देशिका में प्रतिलिपि जार के साथ युद्ध बनाने के लिए आईवी का उपयोग कैसे करें

<mkdir dir="dist/lib"/> 
<ivy:retrieve pattern="dist/lib/[artifact].[ext]" sync="true"/> 
<war destfile="dist/${ivy.module}.war" basedir="build" includes="**/*.class" 
    webxml="${war.webxml}"> 
    <fileset dir="${war.web}"/> 
    <lib dir="dist/lib"/> 
</war> 

इस कोड के साथ समस्या यह प्रतियां जार में दो बार है। एक बार मेरी dist/lib निर्देशिका में और फिर जब इसे बनाया गया है तो युद्ध में। यह काम करता है लेकिन मैं महसूस नहीं कर सकता कि एक बेहतर तरीका है।

मैं करना चाहते हैं और क्या की तरह निम्नलिखित

<ivy:cachepath pathid="locpathref.classpath"/> 
<war destfile="dist/${ivy.module}.war" basedir="build" includes="**/*.class" 
    webxml="${war.webxml}"> 
    <fileset dir="${war.web}"/> 
    <lib refid="locpathref.classpath"/> 
</war> 

समस्या यह है कि lib टैग किसी भी प्रकार की refid में नहीं ले करता है कुछ है। कोई विचार या मैं फ़ाइल प्रतियों के एक अतिरिक्त सेट के साथ अटक गया हूँ?

+0

उपयोग करें <आइवी लता: cachefileset setid = "locpathref.classpath" conf = "क्रम "/> तब lib टैग अपेक्षित –

उत्तर

4

समस्या है कि यहाँ lib टैग एक कस्टम फ़ाइलसेट है कि यह युद्ध संग्रह का lib उप निर्देशिका में फ़ाइलों है लक्षित करता है। कस्टम युद्ध कार्य लिखना संभव हो सकता है लेकिन मुझे नहीं लगता कि यह प्रयास के लायक है।

यदि आईवी आपके युद्ध की निर्भरताओं का प्रबंधन करने के तरीके को बेहतर बनाना चाहते हैं तो क्या मैं कॉन्फ़िगरेशन का उपयोग करने का सुझाव दे सकता हूं?

रन-टाइम निर्भरता का वर्णन एक विन्यास बनाएँ:

<ivy-module version="2.0"> 
    <info organisation="apache" module="hello-ivy"/> 
    <configurations> 
     <conf name="build" description="Libraries needed to for compilation"/> 
     <conf name="war" extends="build" description="Libraries that should be included in the war file" /> 
    </configurations> 
    <dependencies> 
     <dependency org="commons-lang" name="commons-lang" rev="2.0" conf="build->*,!sources,!javadoc"/> 
     <dependency org="commons-cli" name="commons-cli" rev="1.0" conf="build->*,!sources,!javadoc"/> 
    </dependencies> 
</ivy-module> 

बाद में आप जो केवल युद्ध कार्य के lib टैग का उपयोग कर शामिल किया जा सकता (एक पैटर्न का उपयोग करके) एक समर्पित निर्देशिका में उन्हें पुनः प्राप्त:

<ivy:retrieve pattern="${lib.dir}/[conf]/[artifact].[ext]"/> 

    <war destfile="${war.file}" webxml="${resources.dir}/web.xml"> 
     <fileset dir="${resources.dir}" excludes="web.xml"/> 
     <lib dir="${lib.dir}/war"/> 
    </war> 

इस दृष्टिकोण का लाभ यह है कि आप आइवी लता का उपयोग प्रत्येक के conf विशेषता है अंततः यह तय करने के लिए परियोजना निर्भरता कि जार युद्ध फ़ाइल में शामिल हो या नहीं। बिल्ड फ़ाइल अब परवाह नहीं करता है।

निष्कर्ष में मैं समझता हूं कि आपकी पोस्ट का बिंदु आपकी जार फ़ाइलों की कई प्रतियों के लिए चिंता का विषय था ... मेरे सुझाए गए दृष्टिकोण का उपयोग करके आपकी प्रतियां और अधिक हो जाएंगी, लेकिन मैं प्रस्तुत करूंगा कि यह कोई मुद्दा नहीं है बशर्ते आपके पास कोई समस्या न हो साफ बाद में उन्हें हटाने का लक्ष्य।

+0

के रूप में काम करेगा, मैं सहमत हूं कि यह एक बेहतर समाधान है, तो मैं क्या कर रहा हूं लेकिन यह अभी भी अतिरिक्त फ़ाइल प्रति को हटा नहीं देगा जैसा मैं चाहूंगा। जितना अधिक मैं इसे और अधिक देखता हूं, जैसा कि आपने कहा था, ठीक करने का एकमात्र असली तरीका युद्ध कार्य के लिए एक कस्टम युद्ध कार्य या यहां तक ​​कि एक नया कस्टम lib कार्य बनाकर है। एक परिपूर्ण दुनिया में यह नया कार्य दिन आइवी या चींटी का हिस्सा बन सकता है। – AmaDaden

+2

आप जिस समाधान को चाहते हैं वह कैशपैथ के बजाय ivy cachefileset कार्य का उपयोग करना है। फिर warfile के lib टैग के लिए refid पैरामीटर अपेक्षित –

4

आप चींटी 1.8 का उपयोग कर रहे हैं, तो आप तकनीक यहाँ वर्णित का उपयोग कर सकते हैं: http://www.beilers.com/2010/06/ivy-dependency-management-lessons-learned-and-ant-1-8-mapped-resources/

उदाहरण:

<war destfile="${war.full.path}" webxml="WebContent/WEB-INF/web.xml" manifest="${manifest.path}"> 
    <fileset dir="WebContent"> 
    </fileset> 
    <classes dir="${build.dir}"/> 

    <mappedresources> 
     <restrict> 
     <path refid="classpath.CORE"/> 
     <type type="file"/> 
     </restrict> 
     <chainedmapper> 
     <flattenmapper/> 
     <globmapper from="*" to="WEB-INF/lib/*"/> 
     </chainedmapper> 
    </mappedresources> 

    <zipfileset dir="src" prefix="WEB-INF/classes"> 
     <include name="**/resources/**/*.properties" /> 
     <include name="**/resources/**/*.xml" /> 
    </zipfileset> 
</war> 
+0

के रूप में काम करेगा बहुत रोचक ... मैं इसे आजमाउंगा और रिपोर्ट करूंगा! –