2010-02-13 35 views
6

Tôi đã xem xét một loạt các ví dụ khác nhau và đã thử một số biến thể, nhưng dường như không thể làm việc này một cách chính xác. Nó cũng xuất hiện mà bạn không thể loại trừ toàn bộ thư mục với javac, nhưng chỉ các tệp, mà tôi cho rằng có nghĩa là bạn không thể chỉ định một gói? Dưới đây là những gì tôi có:Làm cách nào để loại trừ gói nguồn bằng cách sử dụng javac trong Ant?

<javac srcdir="src" destdir="WEB-INF/classes" excludes="path/to/excluded/package/*.java"> 
    <classpath refid="compile.classpath"/> <!-- reference defined earlier --> 
</javac> 

Trả lời

11

Bạn có thể loại trừ toàn bộ thư mục hoặc cây thư mục bằng "**" và loại trừ. Ví dụ

<dirset dir="aDirectory"> 
    <include name="a/package/**"/> 
    <exclude name="**/package/to/exclude**"/> 
</dirset> 
+0

Bộ đệm lồng nhau không hoạt động với tác vụ javac. –

+0

Phải, nhưng như là một phần của một classpath là tài liệu tham khảo trong nhiệm vụ javac họ nên làm việc. – akr

5

Xin lưu ý rằng không bao gồm không hoạt động nếu bất kỳ của các tập tin trong "src" (hoặc trong "bao gồm" nếu được chỉ định) có phụ thuộc vào hồ sơ quy định tại không bao gồm. Vì vậy, trước tiên hãy đảm bảo rằng các tệp bị loại trừ không được giới thiệu trong bất kỳ tệp nào bao gồm.

1

Các javac nhiệm vụ implicity bao gồm tất cả các file trong srcdir và bạn chỉ có thể thêm một loại trừ yếu tố để các nhiệm vụ, ví dụ:

<javac destdir="build" srcdir="src" > 
    <exclude name="**/my/package/test/*.java" /> 
</javac> 

này sẽ không biên dịch bất kỳ của các lớp trong gói my.package.test.

+2

Vấn đề là khi một lớp khác nhập khẩu từ gói đó, trình biên dịch sẽ kéo vào tệp đó, mặc dù nó nêu ở đây để loại trừ nó. Toàn bộ bao gồm/loại trừ điều chỉ là tập hợp ban đầu được đưa vào javac. Javac sau đó được miễn phí để kéo các tập tin khác, dựa trên src dir (s). Có một nhu cầu để nói với javac một cách rõ ràng không truy cập các tập tin nhất định. Tôi nghĩ rằng điều này chỉ có thể được thực hiện bằng cách sao chép chỉ các tập tin bạn sẵn sàng cung cấp cho javac, và sau đó biên dịch tập hợp con đó. – Mike

+2

Điều này rất hữu ích khi bạn có một gói mà không có mã nào khác phụ thuộc vào - chẳng hạn như các lớp kiểm tra - không nên triển khai. –

0

Mike, một cách khác để báo cho javac rõ ràng là không truy cập một số tệp nhất định là không đặt đường dẫn nguồn. Tôi chỉ figured này ra ...

Từ hướng dẫn Ant:

Lưu ý: Nếu bạn muốn biên dịch chỉ file nguồn nằm trong một số gói dưới một gốc thông thường, sử dụng bao gồm/loại trừ thuộc tính hoặc /yếu tố lồng nhau để lọc cho các gói này. Do không bao gồm một phần cấu trúc gói của bạn trong thuộc tính srcdir (hoặc các phần tử lồng nhau) hoặc Ant sẽ biên dịch lại các tệp nguồn của bạn sau mỗi lần khi bạn chạy đích biên dịch của mình. Xem Câu hỏi thường gặp về Ant để biết thêm thông tin .

Nếu bạn muốn biên dịch các tập tin chỉ định một cách rõ ràng và vô hiệu hóa cơ chế tìm kiếm mặc định javac của thì bạn có thể bỏ đặt SourcePath thuộc tính:

<javac sourcepath="" srcdir="${src}" destdir="${build}" > 
    <include name="**/*.java"/> 
    <exclude name="**/Example.java"/> 
</javac> 

Bằng cách đó các javac sẽ biên dịch tất cả các file nguồn java trong thư mục "$ {src}" nhưng bỏ qua các ví dụ. Trình biên dịch thậm chí sẽ tạo ra lỗi nếu một số tệp không phải là ví dụ đề cập đến chúng.

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