2010-09-27 17 views
6

Vì Java 1.5 hoặc hơn, javac đã xem xét biểu hiện của các lọ bên thứ ba để tìm các lọ khác. Điều này gây ra một số không mong muốn tác dụng phụ:Tôi có thể ngăn javac truy cập Class-Path từ các biểu hiện của các lọ bên thứ ba của chúng tôi không?

  1. Như file jar đã được đổi tên, bây giờ chúng ta có được một lũ cảnh báo bất cứ khi nào chúng tôi biên dịch (có thể được diabled với -Xlint:-path)
  2. tập tin chúng tôi không muốn về các classpath đang được đưa trở lại vào nó, ngay cả khi họ đã rời khỏi nó vì một lý do.
  3. Thời gian bổ sung đang được thực hiện trong bản dựng để tra cứu tất cả các lọ bổ sung này, do độ phân giải của công cụ này mà chúng tôi thực sự không muốn.

Vì vậy, tôi đã tự hỏi liệu có ai biết lời kêu gọi ma thuật để vô hiệu hóa điều này không. Giả sử rằng Sun đã không đánh lừa chúng tôi với một tính năng khác mà chúng tôi không muốn và không thể tắt khi chúng tôi có nó.

+0

+1 Tôi không biết javac nào đó. Bất kỳ ý tưởng tại sao một người nào đó muốn điều đó? Tôi có thể (bằng cách nào đó) hiểu được mong muốn cho một số phép thuật cho classpath thời gian chạy, nhưng rối tung với đường dẫn xây dựng? – Thilo

+0

Trình biên dịch eclipse cũng có làm điều đó không? Bạn có thể sử dụng cái đó thay thế. – Thilo

+1

Đây là lỗi (có thảo luận) khiến tính năng này (IMHO ngu ngốc) được thêm vào: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4212732 – Archie

Trả lời

1

Sử dụng bnd hoặc bóng râm để loại bỏ mục nhập MANIFEST.MF vi phạm khỏi các lọ, thay vì chỉ đổi tên. Hoặc tận dụng lợi thế của khuôn mặt mà các tên đường dẫn này về cơ bản không bao giờ tuyệt đối. Nếu bạn di chuyển jar có tên 'i-have-a-ClassPath.jar' vào thư mục con riêng của nó, thì các đường dẫn lớp manifest sẽ không tìm thấy các lọ khác ở các vị trí mong muốn. Tôi cho rằng sẽ vẫn rên rỉ nếu bạn bật đủ lint, mặc dù.

2

Heres một mục tiêu Ant để sửa đổi các tập tin manifest (sử dụng kiến-contrib)

<target name="util-modify-manifest" depends="build-classpath"> 
<for param="file"> 
    <fileset dir="${jars}" > 
     <include name="**/*.jar" /> 
    </fileset> 
    <sequential> 
     <jar jarfile="@{file}" destfile="@{file}" update="true"> 
      <manifest> 
       <attribute name="Class-Path" value="" /> 
       <attribute name="Export-Package" value="" /> 
      </manifest> 
     </jar> 
     <echo message="Manifest Replaced: @{file}" /> 
    </sequential> 
</for> 

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