2016-02-06 18 views
5

Tôi có một dự án sử dụng this technique hoạt động tốt trong JDK 8 trở lên. Tuy nhiên, trong JDK 9 bình này đã bị loại bỏ và nó không còn hoạt động nữa:Khai báo phụ thuộc maven trên tools.jar để hoạt động trên JDK 9

'dependencies.dependency.systemPath' for com.sun: tools: jar đề cập đến một tập tin không tồn tại/usr/lib/jvm /java-9-jdk/../lib/tools.jar. Vui lòng xác minh rằng bạn chạy Maven bằng cách sử dụng JDK và không chỉ là một JRE.

(Con đường trông lạ, mặc dù có không tools.jar in JDK 9)

thực hành tốt nhất mà sẽ làm việc trên các phiên bản JDK và có lẽ ngay cả các nhà cung cấp JDK là gì? Tôi thậm chí không tìm thấy bất kỳ giải pháp nào cho JDK 9 trên OpenJDK (trong khi vẫn giữ dự án có thể xây dựng trên JDK 8).

Trả lời

0

Giải pháp của bạn (chỉ là giải pháp thay thế) được coi là bị hỏng và không hoạt động với Java 9. Tất cả những gì bạn có thể làm là chạy jdeps và chuyển mã của mình sang API công khai.

+0

Điều này đúng như xa như lý thuyết đi. Vấn đề là các API "công khai" thường được cung cấp bởi các lớp trong 'tools.jar' để giữ cho dự án có thể xây dựng cho các JDK cũ hơn yêu cầu vấn đề này phải được giải quyết. –

10

Sự cố của bạn là do các thay đổi Project Jigsaw đã đi vào bản dựng Java 9 EA mà bạn dường như đã sử dụng. JEP 220 mô tả chúng.

Phần Removed: rt.jartools.jar mô tả này một cách chi tiết hơn nhưng Rủi ro và Giả chứa một bản tóm tắt tốt:

JDK và JRE hình ảnh sẽ, như đã nói ở trên, không còn chứa các tập tin lib/rt.jar, lib/tools.jar, lib/dt.jar và các tệp jar nội bộ khác. Mã hiện có giả định rằng sự tồn tại của các tệp này có thể không hoạt động chính xác.

Vì vậy, như bạn đã quan sát, các tệp đó đã biến mất. Xem thêm:

Các tệp lớp và tài nguyên trước đây được tìm thấy trong lib/tools.jar và chỉ hiển thị trong tệp JDK, qua trình tải lớp hệ thống hoặc trong một số trường hợp, trình nạp lớp bootstrap. Tuy nhiên, các mô-đun chứa các tệp này sẽ không được đề cập trong đường dẫn lớp ứng dụng, tức là, trong giá trị của thuộc tính hệ thống java.class.path.

Vì vậy, các lớp học từ tools.jar được chuyển thành mô-đun nhưng có vẻ như chúng có thể không khả dụng cho người dùng. Bạn nên sử dụng jdeps từ một xây dựng Jigsaw gần đây ...

  • ... để xác định phụ thuộc mô-đun của bạn: $jdeps -M -s $your_JAR
  • ... để xác định phụ thuộc vào API JDK-nội: jdeps -jdkinternals $your_JAR

Nếu bạn may mắn, API bạn đang sử dụng đã được xuất bản (sau đó nó sẽ không hiển thị trong phân tích thứ hai) hoặc có một lựa chọn công cộng (mà phân tích thứ hai sẽ liệt kê).Nếu không, bạn nên xem xét việc này để Jigsaw mailing list và yêu cầu giúp đỡ ở đó, lưu ý rõ ràng các API bạn đang sử dụng và những gì cho.

+0

Cảm ơn, điều này là hữu ích trong việc hiểu chính xác những gì tôi phụ thuộc vào nhưng trong trường hợp tools.jar, nó không giúp đỡ để có được maven để xây dựng trong trường hợp tôi phụ thuộc vào một trong những mô-đun tích hợp. –

+0

Điều này hữu ích khi biết trong các ngữ cảnh khác, chẳng hạn như nếu (như tôi) bạn có các tài liệu Javadoc tùy chỉnh hiện có và cần tìm ra cách biên dịch chúng bằng Java 9. – mhucka

2

Nó chỉ ra các giải pháp nhận thức được JDK 9 không phải là tất cả những gì khác biệt so với original trick:

<profiles> 
    <profile> 
     <id>jigsaw</id> 
     <activation> 
     <jdk>[1.9,)</jdk> 
     </activation> 
     <!-- No dependencies needed by Jigsaw --> 
     <dependencies/> 
    </profile> 
    <profile> 
     <id>default-jdk</id> 
     <activation> 
     <file> 
      <exists>${java.home}/../lib/tools.jar</exists> 
     </file> 
     </activation> 
     <dependencies> 
     <dependency> 
      <groupId>com.sun</groupId> 
      <artifactId>tools</artifactId> 
      <scope>system</scope> 
      <version>1.6</version> 
      <systemPath>${java.home}/../lib/tools.jar</systemPath> 
     </dependency> 
     </dependencies> 
    </profile> 
    <profile> 
     <id>osx-jdk</id> 
     <activation> 
     <file> 
      <exists>${java.home}/../Classes/classes.jar</exists> 
     </file> 
     </activation> 
     <dependencies> 
     <dependency> 
      <groupId>com.sun</groupId> 
      <artifactId>tools</artifactId> 
      <scope>system</scope> 
      <version>1.6</version> 
      <systemPath>${java.home}/../Classes/classes.jar</systemPath> 
     </dependency> 
     </dependencies> 
    </profile> 
    </profiles> 

Nếu toàn bộ dependency tờ khai được chuyển đến profile nó cho phép cấu hình khác nhau để sử dụng số khác nhau phụ thuộc.


Tôi tạo ra một reusable module để che giấu sự phức tạp từ dự án cá nhân mà phụ thuộc vào tools.jar:

<dependency> 
    <groupId>com.github.olivergondza</groupId> 
    <artifactId>maven-jdk-tools-wrapper</artifactId> 
    <version>0.1</version> 
</dependency> 
Các vấn đề liên quan