2009-07-27 29 views
20

Tôi đang cố gắng tìm kiếm kỹ thuật xây dựng của tôi để tạo tệp jar Java phụ thuộc vào tệp jar bên thứ ba phổ biến. (GlazedLists, Apache Commons, vv)kiến, tệp jar và Class-Path oh

Tôi đã nhét tất cả chúng vào {Java JRE dir}/lib/ext để chúng tự động được JRE xem, nhưng điều đó dẫn đến các vấn đề như không nhớ rằng tôi cần để phân phối các tệp jar nhất định, vì vậy tôi muốn tìm hiểu rõ ràng hơn.

Vì vậy, tôi chuyển tất cả chúng vào c: \ Appl \ java \ \ chung, thêm chúng vào Eclipse xây dựng con đường, aand định nghĩa này trong tập tin kiến ​​của tôi:

<path id="javac_classpath"> 
    <fileset dir="${libDir}"> 
     <include name="*.jar"/> 
    </fileset> 
    <fileset dir="c:/appl/java/common"> 
     <include name="*.jar"/> 
    </fileset> 
</path> 

Tôi có tôi Tiêu đề tệp kê khai lớp-đường dẫn được đặt thành "." trong nhiệm vụ jar của tôi nhưng điều đó dường như không hoạt động ngay cả khi tôi đặt các tệp jar có liên quan vào cùng thư mục với tệp jar ứng dụng của tôi. Tôi có thể thêm tất cả chúng theo cách thủ công một-by-một để tiêu đề Class-Path, nhưng tôi tự hỏi, là có một cách dễ dàng hơn để có được thiết lập tiêu đề Class-Path đúng cách?

Trả lời

36

Đây là tất cả các bạn cần:

<path id="build-classpath"> 
    <fileset dir="${dist}/lib"> 
     <include name="*.jar"/> 
    </fileset> 
</path> 
<manifestclasspath property="lib.list" jarfile="${dist}/lib/myprog.jar"> 
    <classpath refid="build-classpath"/> 
</manifestclasspath> 
<jar jarfile="${dist}/lib/myprog.jar" 
    basedir="${build}" 
    includes="com/my/prog/**" > 
    <manifest> 
     <attribute name="Main-Class" value="com.my.prog.MyProg"/> 
     <attribute name="Class-Path" value="${lib.list}"/> 
    </manifest> 
</jar> 

Như bạn có thể thấy, nó giả sử bạn đã biên soạn các lớp Java của bạn và xuất chúng để ${build}. Nó cũng giả định bạn đã sao chép các jarfiles của bạn thành ${dist}/lib.

Điều đó nói rằng, sẽ rất đáng để xem xét các hệ thống xây dựng khác có hỗ trợ sẵn cho các phụ thuộc, chẳng hạn như Maven và Gradle. Những hệ thống xây dựng khác đã nghĩ qua nhiều cấu trúc dự án chung và xây dựng các hoạt động, vì vậy bạn không phải viết mọi thứ xuống chi tiết cuối cùng.

+1

ahhhh ... đó là những gì tôi đang tìm kiếm. Xuất sắc! –

+0

Hmmm. Sửa chữa: nó không hoạt động cho một bản dựng mới, bởi vì thư mục $ {dist}/lib có thể chưa tồn tại. Có cách nào trì hoãn việc thực hiện tác vụ không? –

+0

DOH! không bao giờ nhớ, tôi đã đặt trong phần gốc của tệp kiến ​​của tôi, chỉ cần sửa nó bằng cách đặt nó vào tác vụ jar. cảm ơn một lần nữa !!!!! –

0

Các thư mục đường dẫn không theo mặc định, bao gồm các tệp Jar vì lý do bảo mật. Ai đó có thể đặt một tập tin jar trong đó, và nó có thể được tải lên, ghi đè mã của bạn, mà bạn không biết. Tôi biết rằng đã có cuộc thảo luận về việc thêm một lá cờ hoặc mã thông báo kết thúc khác để cho phép tệp Jar được thêm vào đường dẫn lớp, nhưng, nếu bộ nhớ của tôi phục vụ, được dự kiến ​​cho phiên bản 7. Tuy nhiên, tôi có thể sai ở phần cuối.

0

Tiêu đề tệp kê khai lớp-đường dẫn cho tệp jar yêu cầu bạn liệt kê rõ ràng các tệp jar bạn muốn đưa vào. Liệt kê một thư mục trong classpath có nghĩa là java sẽ tìm kiếm các tệp .class trong thư mục đó chứ không phải các jarfiles.

4

Điều bạn muốn là mapper. Flattenmapper có lẽ là dễ nhất, nhưng về cơ bản bạn cần tạo một phần tử đường dẫn chỉ rõ classpath của bạn, sau đó sử dụng một pathconvert trên nó để biến nó thành một chuỗi có thể được đưa vào tệp kê khai của bạn.

Edit: bạn có thể sử dụng bao gồm quy tắc để xây dựng các yếu tố con đường, vì vậy tất cả mọi thứ trong một thư mục có đuôi jar sẽ **/*.jar

-1

Kể từ khi bạn đang ở trong Ant, có thể bạn không muốn chuyển sang, nhưng Maven là khá tốt trong việc xác định tất cả các phụ thuộc của bạn, và có một số cơ sở để sao chép hoặc kết hợp các lọ lib của bạn với nhau cho mục đích phân phối. Đối với mục đích của tôi, tôi có một plugin Maven tạo ra một kịch bản chạy trong khi xây dựng, do đó thiết lập classpath cho tôi vì vậy tôi không cần phải lo lắng về nó.

+0

Ivy là một cách ant-tương thích khá để làm quản lý phụ thuộc. –

3

Với ant 1.7 và sau đó, tác vụ manifestclasspath là con đường phía trước. Nếu bạn đang sử dụng phiên bản kiến ​​trước 1.7, tác vụ manifestclasspath không tồn tại.

Sau đây cho kết quả tương tự: -

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

<pathconvert property="lib.list" pathsep=" "> 
    <path refid="build.classpath" /> 
    <mapper> 
     <chainedmapper> 
      <flattenmapper /> 
     </chainedmapper> 
    </mapper> 
</pathconvert> 

<target name="generate.jar"> 
    <jar destfile="${dist}/lib/myprog.jar"> 
     <manifest> 
      <attribute name="Main-Class" 
       value="com.mypackage.MyClass" /> 
      <attribute name="Class-Path" value="${manifest.classpath}" /> 
     </manifest> 
    </jar> 
</target> 
Các vấn đề liên quan