2010-01-16 21 views
6

Mục tiêu của tôi là xây dựng kịch bản kiến ​​xây dựng một tập tin chiến tranh và bao gồm các lọ ivy biết dự án này phụ thuộc vào. Mã tốt nhất mà tôi có thể đưa ra vào lúc này làLàm thế nào để sử dụng ivy để xây dựng một cuộc chiến tranh với ra sao chép vào một thư mục 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> 

Vấn đề với mã này là bản sao các lọ hai lần. Khi vào thư mục dist/lib của tôi và một lần nữa vào cuộc chiến khi nó được tạo ra. Nó hoạt động nhưng tôi không thể lắc cảm giác có một cách tốt hơn.

Những gì tôi muốn làm là một cái gì đó giống như sau

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

Vấn đề là tag lib không mất trong một refid dưới mọi hình thức. Bất kỳ ý tưởng hoặc tôi bị mắc kẹt với một tập hợp thêm các bản sao tập tin?

+0

Sử dụng thì thẻ lib sẽ hoạt động như mong đợi –

Trả lời

4

Vấn đề ở đây là các lib tag là một phong tục fileset nhắm nó file vào thư mục phụ lib các kho lưu trữ của cuộc chiến tranh. Có thể viết một nhiệm vụ tùy chỉnh chiến tranh nhưng tôi không nghĩ rằng nó đáng để nỗ lực.

Nếu muốn cải thiện cách thức mà ivy quản lý phụ thuộc của chiến tranh của bạn, tôi có thể đề xuất sử dụng cấu hình không?

Tạo một cấu hình mô tả sự phụ thuộc thời gian chạy:

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

Sau đó bạn lấy chúng vào một thư mục riêng (sử dụng một mô hình) có thể được đơn giản bao gồm sử dụng thẻ lib các chiến tranh nhiệm vụ của:

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

Ưu điểm của phương pháp này là bạn sử dụng ivy conf thuộc tính của mỗi phụ thuộc dự án để quyết định cuối cùng nếu bình được đưa vào trong tệp chiến tranh hay không. Tệp xây dựng không còn quan tâm nữa.

Tóm lại, tôi hiểu rằng điểm của bài đăng của bạn quan tâm đến nhiều bản sao tệp jar ... Sử dụng cách tiếp cận được đề xuất của tôi sẽ tiếp tục nhiều bản sao của bạn, nhưng tôi sẽ cho rằng đây không phải là vấn đề xóa mục tiêu để xóa chúng sau đó.

+0

Tôi đồng ý rằng đây là một giải pháp tốt hơn sau đó những gì tôi đang làm nhưng nó vẫn không loại bỏ bản sao tệp bổ sung như tôi muốn. Tôi càng xem xét điều này thì tôi càng nghĩ rằng, như bạn đã nói, cách duy nhất để khắc phục là tạo ra một nhiệm vụ chiến tranh tùy chỉnh hoặc thậm chí là một nhiệm vụ tùy chỉnh mới cho nhiệm vụ chiến tranh. Trong một thế giới hoàn hảo, nhiệm vụ mới này có thể sẽ trở thành một phần của Ivy hoặc Ant. – AmaDaden

+2

Giải pháp bạn muốn là sử dụng tác vụ ivy cachefileset thay vì cachepath. Sau đó, tham số refid cho thẻ lib của warfile sẽ hoạt động như mong đợi –

4

Nếu bạn đang sử dụng Ant 1.8, bạn có thể sử dụng kỹ thuật mô tả ở đây: http://www.beilers.com/2010/06/ivy-dependency-management-lessons-learned-and-ant-1-8-mapped-resources/

VÍ DỤ:

<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

Rất thú vị ... Tôi sẽ thử điều này và báo cáo! –

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