2009-09-22 10 views
13

मुझे लगता है कि एक जार में इस तरह दिखेगा फ़ाइलों का सेट रखना चाहता हूँ:चींटी के जार कार्य द्वारा जार में शामिल होने पर मैं फ़ाइलों का नाम कैसे बदलूं?

yay/my.jar 
boo/my.jar 
foo/my.jar 
bar/my.jar 

प्रक्रिया में, मैं उन्हें नाम दिया गया के सभी के रूप में निम्नानुसार हैं:

yay_my.jar 
boo_my.jar 
foo_my.jar 
bar_my.jar 

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

एक जार बनाने के दौरान मैपर कैसे लागू करूं, या फिर मैं इस तरह एक रूपांतरण कैसे कर सकता हूं? मैं सभी फाइलों को निर्देशिका संरचना में कॉपी करना और इच्छित जगह पर डुप्लीकेट बनाना चाहता हूं, इस प्रकार हमारी बिल्ड सिस्टम अब काम करती है।

उत्तर

2

अपडेट: आप शायद वास्तव में copy task को स्थानांतरित करने के बजाय चाहते हैं, लेकिन regexp mapper दोनों प्रतिलिपि और स्थानांतरित करने के लिए समान कार्य करता है।

निम्नलिखित regexp jars_out में jars_out में सभी जार की प्रतिलिपि बनायेगा, [फ़ोल्डर]/[file] .jar [फ़ोल्डर] _ [file] .jar पर मैप करें।

<copy todir="./jars_out"> 
    <fileset dir="jars"/> 
    <mapper type="regexp" from="([^/\\]*)[/\\](.*)\.jar$$" to="\1_\2.jar"/> 
</copy> 

regexp नक्शाकार classpath काम करने के लिए पर एक उपयुक्त regexp कार्यान्वयन जार की जरूरत है। विभिन्न कार्यान्वयन उपलब्ध हैं:

<jar destfile="newjar.jar"> 
    <zipfileset dir="yay" includes="my.jar" fullpath="yay_my.jar"/> 
    <zipfileset dir="boo" includes="my.jar" fullpath="boo_my.jar"/> 
    <!-- etc. --> 
</jar> 

:

+0

मैं यह दिखाने के लिए एक उदाहरण जोड़ूंगा कि –

+0

यह बहुत अच्छा है लेकिन फाइलों की अतिरिक्त प्रतियां किए बिना जार बनाने का मेरा लक्ष्य पूरा नहीं करता है। चाल प्रतियों से बचेंगी, लेकिन फिर जब भी मैं अपनी स्रोत फ़ाइलों को बदल देता हूं तो जारों को पुनर्निर्मित किया जाएगा। – skiphoppy

+0

हालांकि, आपके द्वारा निर्मित मैपर टैग अद्भुत है, और मैं उधार लेगा कि मेरे अपने एक के साथ आने के बजाय। :) मुझे वास्तव में मैपर बनाने के लिए काफी कुछ नहीं मिला था, मुझे अभी भी जरूरी था क्योंकि मुझे फाइलसेट और जार के साथ काम करने के लिए कोई नक्शा नहीं मिला था। – skiphoppy

17

आप जार में फ़ाइल नाम का नाम बदलने का एक fullpath विशेषता के साथ एक zipfileset उपयोग कर सकते हैं आप उपयोग नहीं कर सकते हालांकि इस तकनीक के साथ एक मैपर, आपको प्रत्येक जार फ़ाइल को स्पष्ट रूप से सूचीबद्ध करना होगा। आप मान सकते हैं कि हर फ़ाइल my.jar नाम पर है, और वे एक तत्काल बच्चे निर्देशिका में सभी कर रहे हैं, तो आप उन्हें सब glob के लिए subant लक्ष्य का उपयोग कर सकते हैं:

<target name="glom"> 
    <subant genericantfile="${ant.file}" target="update-jar"> 
     <dirset dir="." includes="*"/> 
    </subant> 
</target> 

<target name="update-jar"> 
    <basename file="${basedir}" property="dirname"/> 
    <property name="path" value="${dirname}_my.jar"/> 
    <jar destfile="../newjar.jar" update="yes"> 
     <zipfileset dir="." includes="my.jar" fullpath="${path}"/> 
    </jar> 
</target> 
+0

+1 जार कार्य के दौरान फ़ाइल का नाम बदलने का अच्छा आसान तरीका। धन्यवाद। – Damo

2

आप के लिए नहीं करना चाहते हैं (या कर सकते हैं आसानी से नहीं) प्रत्येक फ़ाइल को व्यक्तिगत रूप से सूचीबद्ध करें, एक समाधान ज़िप कार्य का उपयोग करना है, जो एक नेस्टेड <mappedresources> (चींटी 1.8.0+) की अनुमति देता है। एक बार ज़िप कार्य पूरा होने के बाद, आप मैनिफेस्ट को जोड़ने/अपडेट करने और/या एक इंडेक्स जोड़ने के लिए जार कार्य का उपयोग कर सकते हैं।

मान लीजिए, उदाहरण के लिए, कि उत्पादन जार में

 
yay_my.jar 
boo_my.jar 
foo_my.jar 
bar_my.jar 

चाहने के अलावा, आप भी एक निर्देशिका stuff/ कुछ फाइलों और उपनिर्देशिकाओं युक्त है,। आप stuff/ जार में शामिल की सामग्री चाहते हैं, लेकिन आप stuff/subdir/*other_subdir/* रूप में जोड़ा जा चाहते हैं, निम्नलिखित पर विचार:

<zip destfile="newjar.jar"> 
    <zipfileset dir="yay" includes="my.jar" fullpath="yay_my.jar"/> 
    <zipfileset dir="boo" includes="my.jar" fullpath="boo_my.jar"/> 
    <!-- etc. --> 

    <mappedresources> 
     <fileset dir="stuff"/> 
     <compositemapper> 
      <globmapper from="subdir/*" to="other_subdir/*"/> 
      <identitymapper/> 
     </compositemapper> 
    </mappedresources> 
</zip> 
<!-- Update the newly-created ZIP in-place to add a basic manifest --> 
<jar destfile="newjar.jar" update="true"/> 

मैं इस बिल्ड फ़ाइल का परीक्षण किया और यह चींटी 1.8.2 के साथ काम करता है। हालांकि, अगर इसे बदलने के बाद चींटी NullPointerException फेंकना शुरू कर देती है, तो Bug 54026 देखें।

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