2009-08-01 28 views
21

Tôi đang trong quá trình đóng gói ứng dụng java của mình vào tệp jar. Tôi đang sử dụng kiến ​​và nhật thực. Tôi cần phải thực sự bao gồm trong jar một vài tập tin riêng biệt, không mã (tập tin xml và txt) trực tiếp dưới thư mục gốc, không phải trong cùng một vị trí như mã.thêm tài nguyên không mã vào tệp jar bằng cách sử dụng Ant

Tôi cố gắng để sử dụng includesfile, nhưng điều đó dường như không làm việc, đây là mục tiêu kiến ​​của tôi:

<target name="distribute" depends="compile" includesfile="readthis.txt"> 
    <jar destfile="${distributionDir}/myjar.jar" > 
     <fileset dir="${outputDir}"/> 
    <fileset dir="${sourceDir}"/>   
    </jar> 
</target> 

Trên đây hoạt động tốt khi tôi bỏ qua đối số includesfile. Ngoài ra, tôi cần thêm nhiều tệp không phải mã. Các tệp này được đặt trực tiếp trong thư mục gốc của dự án trong Eclipse, và không nằm trong bất kỳ gói java nào.

Ngoài ra, như bạn có thể thấy ở trên, về cơ bản tôi cũng bao gồm cả mã nguồn của mình nữa. Có cách nào để nói cho các nhiệm vụ jar để đặt mã nguồn trong một thư mục riêng biệt từ mã biên dịch?

Là một nhiệm vụ biên dịch hoặc xây dựng, Ant dễ dàng có thể tách mã nguồn khỏi các lớp được biên dịch. Nhưng có cách nào để làm điều đó trong một tệp jar không?

Rất cám ơn vì đã dành thời gian của bạn!

Trả lời

34

Bạn không cần phải có một includesfile thuộc tính trong một mục tiêu để bắt đầu, và tôi nghi ngờ bạn đã hiểu sai điểm của nó anyway - ý tưởng là tập tin bạn chỉ định với includesfile chứa mô hình các tập tin để bao gồm, nếu bạn không muốn đặt chúng vào tệp Ant của bạn.

Nó làm tôi ngạc nhiên rằng tất cả những gì bạn cần là một tệp phụ có chứa các tệp thích hợp mà bạn cần. Ví dụ, đối readthis.txt:

<target name="distribute" depends="compile"> 
    <jar destfile="${distributionDir}/myjar.jar" > 
    <fileset dir="${outputDir}"/> 
    <fileset dir="${sourceDir}"/> 
    <fileset file="readthis.txt" /> 
    </jar> 
</target> 

Tôi cũng xin đề nghị bạn nên tạo một thư mục mới cho các nguồn lực, vì vậy bạn có thể làm:

<target name="distribute" depends="compile"> 
    <jar destfile="${distributionDir}/myjar.jar" > 
    <fileset dir="${outputDir}"/> 
    <fileset dir="${sourceDir}"/> 
    <fileset dir="${resourcesDir}" /> 
    </jar> 
</target> 

không có rắc rối. Điều này cũng sẽ giữ cấu trúc thư mục của bạn sạch hơn, giúp bạn dễ dàng tìm kiếm mọi thứ từ trên xuống dưới.

+0

Cảm ơn! Điều đó chắc chắn đã giúp. Tôi đã tự hỏi nếu tôi cũng có thể nói với nhiệm vụ jar để tách nguồn từ các lớp biên dịch? Tại thời điểm này, cả nguồn và các lớp đều nằm trong cùng một cấu trúc gói, nên tác vụ jar có bảo toàn thư mục đầu ra và thư mục src không? Có nghĩa là khi tôi mở rộng bình, tôi thấy trong myjar/code/my/package/file.java và file.class Tôi nghĩ rằng tác vụ jar có thể bảo toàn các thư mục như: myjar/code/my/package /source/file.java - và riêng biệt myjar/code/my/package/build/file.class Tôi có thiếu thứ gì đó trong việc sử dụng tác vụ jar của tôi không? – denchr

+0

Không, bạn không chính xác. Họ nên được side-by-side. Nếu jar chứa một cấu trúc thư mục như code/my/package/build/file.class, thì điều đó có nghĩa là tên gói phải là code.my.package.build. Bạn cũng có thể chỉ cần đưa các nguồn vào một tệp JAR thứ hai. –

+0

Tôi hiểu ý của bạn là gì. Vì vậy, nói chung, Nếu tôi muốn bao gồm nguồn trong tệp jar của tôi, nó * có * ở trong cùng thư mục với bản dựng được biên dịch. – denchr

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