2016-07-08 18 views
9

Tôi tạo ra hai dự án nhỏ de.app1de.app2, nơi App từ de.app1 sử dụng Test từ de .app2.Có thể sử dụng phụ thuộc mà không cần đun-info.class trong một module Java 9

├── de.app1 
│   ├── de 
│   │   └── app 
│   │    └── App.java 
│   └── module-info.java 
└── de.app2 
    └── de 
       └── test 
        └── Test.java 

module-info.java trong dự án đầu tiên chỉ chứa module de.app1 {}

tôi biên soạn dự án thứ hai và tạo ra một file jar:

javac de/test/Test.java 
jar cf app2.jar de/test/Test.class 

và sau đó cố gắng để biên dịch đầu tiên dự án như thế này:

javac -cp ../de.app2/app2.jar de/app/App.java module-info.java 

không thành công vì không thể tìm thấy Test. Khi tôi biên dịch dự án mà không cần module-info.java, mọi thứ đều hoạt động như bình thường.

Có phải bằng cách nào đó có thể sử dụng các lớp học từ một bình không phải là mô-đun Java 9 trong một mô-đun Java 9 là? Đặc biệt đối với các dự án phụ thuộc vào các dự án của bên thứ ba (ví dụ: apache-commons, ...), tôi nghĩ rằng điều này sẽ được yêu cầu.

Trả lời

9

Có, điều đó là có thể. Những gì bạn đang tìm kiếm là automatic modules.

Để tạo một bạn chỉ cần đặt một JAR thường xuyên vào một thư mục mà bạn đề cập đến trên con đường mô-đun (ví dụ guava-19.0.jar trong một thư mục libs - xem my example project). Điều này cho JVM biết để tạo ra một mô-đun từ nó. Mô-đun này sẽ có tên dựa trên tên tệp (trong trường hợp này là guava), sẽ đọc tất cả các mô đun khác và xuất tất cả các gói của nó.

Sau đó, bạn có thể yêu cầu với tên được cung cấp (ví dụ: require guava; - xem here).

+0

Rất tốt, cảm ơn! Vì vậy, để cho tôi để có được điều này thẳng: Khi tôi đang làm việc với các mô-đun, tôi về cơ bản nên luôn luôn sử dụng đường dẫn mô-đun thay vì classpath? –

+1

Nó không phải là đơn giản. JVM sẽ chỉ tải các mô-đun từ đường dẫn mô-đun được yêu cầu bởi một mô-đun khác. Phụ thuộc của các mô-đun tự động không được yêu cầu bởi bất kỳ ai (vì chúng không có 'module-info'), vì vậy chúng sẽ không được nạp. Chúng phải đi trên đường dẫn lớp, nơi chúng được gộp vào [module chưa được đặt tên] (http://openjdk.java.net/projects/jigsaw/spec/sotms/#the-unnamed-module). – Nicolai

+2

Nếu một mô-đun tự động phụ thuộc vào một mô-đun tự động khác (ví dụ, cả hai đều nằm trên đường dẫn mô-đun nhưng chỉ yêu cầu mô-đun rõ ràng) thì bạn có thể tải mô-đun tự động thứ hai qua ['- add-modules'] (http://openjdk.java.net/jeps/261#Root-modules) tùy chọn. Tùy chọn này chấp nhận các mã thông báo đặc biệt biểu thị các bộ sưu tập mô-đun hữu ích . ['ALL-MODULE-PATH'] (http://openjdk.java.net/jeps/261#ALL-MODULE-PATH), trong cụ thể, sẽ tải tất cả các mô-đun quan sát được tìm thấy trên đường dẫn mô-đun. –

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