Tôi muốn xây dựng mô-đun plugin có thể được tải bằng ServiceLoader
. Điều này đòi hỏi phải thêm một tệp vào thư mục META-INF/services
, được đặt tên theo giao diện dịch vụ và chứa đường dẫn đủ điều kiện cho lớp thực hiện nó. Sau đó, bạn có thể tải các dịch vụ này bằng cách gọi ServiceLoader.load()
.META-INF/dịch vụ trong JAR với Gradle
Dưới đây là ví dụ:
Giả sử chúng tôi muốn cung cấp giao diện plugin có tên org.example.plugins.PluginService
. Sau đó chúng tôi cung cấp dịch vụ này trong lớp org.example.plugins.impl.ExamplePlugin
.
Nếu chúng tôi muốn có một số loại cơ chế plugin, chúng tôi có thể tạo tệp JAR, chứa tệp triển khai. Tệp JAR này cũng phải chứa tệp META-INF/services/org.example.plugins.PluginService
. Tệp này phải chứa một dòng
org.example.plugins.impl.ExamplePlugin
để kích hoạt ServiceLoader
để tìm cách triển khai. Nếu tập tin JAR là trong build path, bạn có thể tải các plugin bằng cách gọi
Iterator<PluginService> it = ServiceLoader.load(PluginService.class).iterator();
iterator Điều đó sẽ cung cấp cho bạn truy cập vào tất cả các plugin quá được tìm thấy bởi các ServiceLoader
.
Vì một số lý do Gradle không bao gồm tệp vào thư mục META-INF
theo mặc định. Có cách nào để cho JAR kết quả chứa một tệp như vậy không?
Tôi đã tìm thấy phương thức metaInf
trong lớp Jar
. Nhưng tôi không biết groovy đủ tốt để tự mình tìm ra giải pháp.
Bạn có chắc chắn không? Làm việc tốt cho tôi. Trường hợp bạn đặt tệp này ở đâu chính xác và giao diện 'build.gradle' của bạn như thế nào? – axtavt
Có thư mục 'META-INF' trong thư mục nguồn chính' src/main/java'. Không có gì đặc biệt với kịch bản xây dựng. Nó gần như là một tiêu chuẩn, có chứa một số phụ thuộc bổ sung và một số kho tùy chỉnh. – pvorb