2017-11-10 13 views
7

Giả sử tôi có một số thư viện lib.jar mà tôi không có mã nguồn (hoặc nó được viết bằng một số ngôn ngữ không phải là Java chưa biết về các mô-đun). lib.jar không có module-info.class và tôi không muốn sử dụng nó làm mô-đun tự động, vì vậy tôi muốn tiêm module-info.class vào đó.Làm thế nào để tiêm khai báo mô-đun vào JAR?

đầu tiên tôi tạo ra module-info.java với lệnh sau đây:

jdeps --generate-module-info . lib.jar 

Giả sử này đã tạo ra một cái gì đó như thế:

module lib { 
    exports package1; 
    exports package2; 
} 

Sau đó, tôi cố gắng biên dịch nó nhưng javac thất bại vì các gói package1package2 làm không tồn tại:

> javac module-info.java 
module-info.java:4: error: package is empty or does not exist: package1 

Tất nhiên, tôi có thể tạo các thư mục package1package2 với các lớp giả trong đó, nhưng có cách tiếp cận nào tốt hơn không?

Trả lời

6

Có, điều này là có thể với tùy chọn --patch-module. Tùy chọn này thường được sử dụng trong thời gian chạy, nhưng nó cũng làm việc tại thời gian biên dịch:

javac --patch-module <module name>=<path to jar> module-info.java 
+0

khi tôi sử dụng lệnh này, tôi vẫn nhận được lỗi: > javac module-info.java module-info.java:4: lỗi: gói trống hoặc không tồn tại : package1 Bất kỳ sự biếng nhác nào tại sao nó có thể không hoạt động đối với tôi? –

+0

@TiagoSantos Gói có tồn tại trong JAR không? – ZhekaKozlov

+0

vâng, mọi thứ có vẻ tốt, tôi quản lý để nó hoạt động bằng cách sử dụng giải pháp ở trên từ nullpointer, tôi đồng ý rằng giải pháp của bạn thanh lịch hơn, vấn đề duy nhất là không hoạt động với .jars của tôi: –

5

Ngoài ra, để biên dịch module-info.java tạo ra bạn cũng cần phải trích xuất nội dung của JAR vào một thư mục.

Sau đó, biên dịch module-info.java với thư mục đầu ra (-d) được đặt thành thư mục mà bạn đã trích xuất nội dung.

Credits :- Alan

+1

Cảm ơn, tôi không biết về phương pháp này – ZhekaKozlov

+1

tôi chấp nhận tôi câu trả lời của riêng tôi bởi vì tôi nghĩ rằng cách của tôi là thanh lịch hơn một chút. Trích xuất các tập tin là một bước bổ sung mà là một chút bất tiện (đặc biệt là cho các công cụ). – ZhekaKozlov

+0

@ZhekaKozlov Tôi đồng ý, điều đó thực sự sạch hơn. Tôi hy vọng tôi không nên loại bỏ cái này.;) – nullpointer

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