2009-09-22 20 views
13

Tôi muốn đặt một bộ các tập tin mà trông như thế này vào một cái lọ:Làm cách nào để đổi tên tệp khi được đưa vào trong một cái bình bằng tác vụ jar của kiến?

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

Trong quá trình này, tôi muốn tất cả trong số họ đổi tên như sau:

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

Tôi đã hy vọng để sử dụng một người lập bản đồ để thực hiện việc này, nhưng các phần tử tập tin tôi đang sử dụng và tác vụ jar dường như không hỗ trợ nó ở bất cứ đâu.

Làm cách nào để áp dụng công cụ lập bản đồ khi xây dựng một bình, hoặc cách khác tôi có thể thực hiện chuyển đổi như thế này? Tôi muốn tránh sao chép tất cả các tệp vào cấu trúc thư mục mà tôi muốn và tạo bản sao trên toàn bộ địa điểm, đó là cách hệ thống xây dựng của chúng tôi hoạt động ngay bây giờ.

Trả lời

2

Cập nhật: có thể bạn thực sự muốn copy task thay vì di chuyển, nhưng regexp mapper hoạt động tương tự cho cả bản sao và di chuyển.

Regexp sau sẽ sao chép tất cả các lọ trong thư mục jar vào jars_out, ánh xạ [thư mục]/[tệp] .jar tới [thư mục] _ [tệp] .jar.

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

Trình vẽ regexp cần một bình thực hiện regexp phù hợp trên đường dẫn lớp để hoạt động. triển khai khác nhau có sẵn:

+0

Tôi sẽ thêm ví dụ để hiển thị cách –

+0

Điều đó thật tuyệt vời nhưng không hoàn thành mục tiêu xây dựng bình mà không tạo thêm bản sao của tệp. Di chuyển sẽ tránh các bản sao, nhưng sau đó các lọ sẽ được xây dựng lại mỗi lần tôi xây dựng thay vì chỉ khi các tệp nguồn của họ đã thay đổi. – skiphoppy

+0

Tuy nhiên, thẻ trình ánh xạ mà bạn đã tạo là tuyệt vời và tôi sẽ vay mượn thay vì đến với một thẻ của riêng tôi. :) Tôi đã không có đủ xa để thực sự xây dựng bản vẽ tôi cần thiết vì tôi không thể có được bất kỳ mapper ở tất cả để làm việc với fileset và jar. – skiphoppy

17

Bạn có thể sử dụng một zipfileset với một thuộc tính fullpath để đổi tên filename trong jar:

<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> 

Bạn không thể sử dụng một người lập bản đồ với kỹ thuật này, bạn sẽ phải liệt kê từng tệp jar một cách rõ ràng. Nếu bạn có thể giả định rằng tất cả các tập tin được đặt tên my.jar, và họ là tất cả trong một thư mục con ngay lập tức, bạn có thể sử dụng các mục tiêu subant để glob tất cả chúng lên:

<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 Cách đơn giản dễ dàng để đổi tên một tệp trong tác vụ jar. Cảm ơn. – Damo

2

Nếu bạn không muốn (hoặc có thể không dễ dàng) liệt kê từng tệp riêng lẻ, một giải pháp là sử dụng tác vụ Zip, cho phép lồng nhau <mappedresources> (Ant 1.8.0+). Khi tác vụ Zip hoàn tất, bạn có thể sử dụng tác vụ Jar để thêm/cập nhật tệp kê khai và/hoặc thêm chỉ mục.

Giả sử, ví dụ, rằng ngoài việc muốn

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

trong JAR đầu ra, bạn cũng có một thư mục stuff/, có chứa một số tập tin và thư mục con. Nếu bạn muốn các nội dung của stuff/ bao gồm trong JAR, nhưng bạn muốn stuff/subdir/* được thêm vào như là other_subdir/*, hãy xem xét những điều sau đây:

<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"/> 

Tôi đã thử nghiệm xây dựng tập tin này và nó hoạt động với Ant 1.8.2. Tuy nhiên, nếu sau khi thay đổi, Ant sẽ bắt đầu ném NullPointerException, xem Bug 54026.

Các vấn đề liên quan