2017-09-18 29 views
9

Khi tôi biên dịch một mô-đun phụ thuộc vào các mô-đun khác tôi đã biên dịch trước đây, tôi phải chỉ định tùy chọn --module-path <directory>. Điều này làm cho các mô-đun tôi phụ thuộc vào khả năng hiển thị.Có thể trộn --class-path và --module-path trong javac (JDK 9) không?

Nhưng đồng thời tôi cũng muốn làm cho một số tệp Jar không mô-đun có thể nhìn thấy. Tuy nhiên, nếu không tạo các mô-đun tự động và chỉ cần chỉ định --class-path some.jar ngay bên cạnh --module-path <directory> thì javac dường như bỏ qua claspath và ném "gói yyy không tìm thấy" và các lỗi "không tìm thấy" khác.

tôi có thể hiểu rằng việc sử dụng --class-path--module-path đồng (biên dịch) thời gian là bất hợp pháp, nhưng javac không cảnh báo tôi chống lại nó trong bất kỳ cách nào.

+0

Có thể kết hợp cả hai, bạn có thể chia sẻ một ví dụ tối thiểu mà chúng tôi có thể xác minh không? –

+0

* Tôi có thể hiểu rằng việc sử dụng --class-path và --module-path tại cùng một thời gian (biên dịch) là bất hợp pháp, * tại sao lại như vậy? – nullpointer

+5

Trộn là hoàn toàn hợp pháp.Tuy nhiên, lọ mô-đun không thể tham khảo lọ không mô-đun trên classpath. Các mô-đun tự động (các mô-đun không mô-đun trên đường dẫn mô-đun) hoạt động như một cây cầu: các mô-đun lọ _can_ tham chiếu chúng, và các mô-đun tự động có thể đọc đường dẫn lớp. –

Trả lời

14

Bạn có thể sử dụng đường dẫn lớp và đường dẫn mô-đun song song, nhưng có một vài chi tiết cần xem xét.

phụ thuộc module Đường dẫn ~> Lớp Đường dẫn module

Explicit (lọ với một mô tả mô-đun trên con đường mô-đun) không thể đọc được các module giấu tên (lọ trên con đường lớp) - đã được thực hiện trên mục đích để ngăn chặn mô-đun JARs phụ thuộc vào "sự hỗn loạn của đường dẫn lớp".

Vì mô-đun phải yêu cầu tất cả các phụ thuộc của nó và chỉ có thể được thực hiện bởi các mô-đun có tên khác (tức là không phải JAR trên đường dẫn lớp) tất cả các phụ thuộc của một mô-đun JAR phải được đặt trên đường dẫn mô-đun. Có, ngay cả các JAR không mô-đun, sau đó sẽ được chuyển thành automatic modules.

Điều thú vị là các mô-đun tự động có thể đọc mô-đun chưa đặt tên, vì vậy phụ thuộc của chúng có thể đi trên đường dẫn lớp.

phụ thuộc lớp Path ~> Module Đường dẫn

Nếu bạn biên dịch mã phi mô-đun hoặc khởi động một ứng dụng từ một JAR phi mô-đun, hệ thống mô-đun vẫn là trong vở kịch và bởi vì mã phi mô-đun không thể hiện bất kỳ phụ thuộc, nó sẽ không giải quyết các mô-đun từ đường dẫn mô-đun.

Vì vậy, nếu mã không theo mô-đun phụ thuộc vào hiện vật trên đường dẫn mô-đun, bạn cần thêm chúng theo cách thủ công với the --add-modules option. Không nhất thiết phải tất cả chúng, chỉ những cái bạn trực tiếp phụ thuộc vào (hệ thống mô-đun sẽ kéo phụ thuộc transitive) - hoặc bạn có thể sử dụng ALL-MODULE-PATH (kiểm tra bài liên kết, nó giải thích chi tiết hơn).

+5

Nicolai - câu trả lời của bạn là chính xác nhưng tôi nghĩ có thể được mở rộng để chỉ ra rằng tùy chọn '--add-modules' có thể cần thiết để đảm bảo rằng các mô-đun cần thiết theo mã đường dẫn lớp được giải quyết. Câu hỏi ban đầu hỏi tại sao javac bị lỗi và tôi giả định điều này là vì anh ta/cô ấy đang biên dịch mã trên đường dẫn lớp với tham chiếu đến các lớp trong các mô-đun trên đường dẫn mô-đun và chỉ cần '--add-modules' để đảm bảo rằng các mô-đun được giải quyết . –

+0

Tôi nghĩ OP đang cố gắng biên dịch mã mô-đun với sự phụ thuộc không phải mô-đun - dù bằng cách nào, tôi cũng đã thêm hướng khác nữa, chỉ để đảm bảo. – Nicolai

9

Tôi tin rằng bằng cách sử dụng tùy chọn --classpath--module-path đồng thời là không bất hợp pháp. Có thể sử dụng cả hai cùng một lúc ngay cả khi bạn không chỉ định rõ ràng đường dẫn lớp đó mặc định vào thư mục hiện tại.

chi tiết từ tin nhắn javac -helpjavac tools docs -

--module-path <path>, -p <path> 

Chỉ định nơi để tìm thấy các module ứng dụng

--class-path <path>, -classpath <path>, -cp <path> 

Chỉ định nơi để tìm tập tin người dùng lớp và nhà chế biến chú thích

Nếu --class-path, -classpath hoặc -cpkhông được chỉ định, sau đó người dùng đường dẫn lớp là thư mục hiện tại.


Sửa: Nhờ @MouseEvent, tôi có lẽ sẽ bỏ lỡ phần trong câu hỏi

Tuy nhiên, nếu không làm cho họ tự động mô-đun và chỉ cần chỉ định --class-path some.jar ngay bên cạnh --module-path, sau đó javac dường như bỏ qua claspath và ném "gói yyy không tìm thấy" và các lỗi "không tìm thấy" khác.

Nếu bạn không làm cho họ tự động, nó được xem như một Module System's unnamed module và -

Một module tên là không thể, trên thực tế, thậm chí tuyên bố một sự phụ thuộc vào các mô-đun giấu tên. Hạn chế này là cố ý, vì cho phép các tên phụ thuộc vào nội dung tùy ý của đường dẫn lớp sẽ làm cho cấu hình tin cậy là không thể.

Hơn nữa, giấu tên mô-đun xuất khẩu tất cả các gói của nó vì thế mã trong một tự động module sẽ có thể truy cập vào bất kỳ loại nào tải từ classpath.

Nhưng mô-đun tự động sử dụng các loại từ đường dẫn lớp không được hiển thị các loại đó theo mô-đun rõ ràng phụ thuộc vào nó, vì mô-đun rõ ràng không thể khai báo phụ thuộc vào mô-đun chưa đặt tên.

Nếu mã trong các mô-đun rõ ràng com.foo.app dùng để chỉ một loại công trong com.foo.bar, ví dụ, và chữ ký của loại hình đó đề cập đến một loại thuộc một trong các tập tin JAR vẫn trên con đường lớp, sau đó mã trong com.foo.app sẽ không thể truy cập loại đó vì com.foo.app không thể phụ thuộc vào mô-đun chưa đặt tên.

Điều này có thể được khắc phục bằng cách xử lý com.foo.app như là một module tự động tạm thời để mã của nó có thể truy cập các loại từ đường dẫn lớp, cho đến khi thời gian như các tập tin JAR có liên quan trên con đường lớp có thể được coi là một mô-đun tự động hoặc chuyển đổi thành một mô-đun rõ ràng.

+1

Hãy để một mình nếu nó hợp pháp ... Toàn bộ khái niệm về mô-đun chưa đặt tên là dành cho các lọ trong đường dẫn lớp và các mô-đun rõ ràng không thể truy cập chúng. – Mordechai

+0

@MouseEvent Vâng đó là sự thật. Tôi tin rằng tôi đã bỏ lỡ phần đó của câu hỏi mặc dù trước đây và chỉ trả lời tựa đề. Đã chỉnh sửa để bao gồm điều đó là tốt. Cảm ơn :) – nullpointer

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