2013-07-31 22 views
5

Xem xét rằng tôi đang phát triển một chương trình phần mềm người dùng cuối (như là một uberjar) Tôi tự hỏi những lựa chọn của mình là gì để người dùng tải xuống plugin và tải trong thời gian chạy .Kiến trúc cho các plugin được tải trong thời gian chạy

Plugin sẽ được biên dịch và không có mã nguồn, do đó, sth. như load không phải là một tùy chọn. Các thư viện hiện có (hoặc cách nào của Java ...?) Tồn tại để xây dựng nó trên?

EDIT: Nếu bạn không chắc chắn tôi cũng sẽ hài lòng với cách khởi động lại/khởi động chương trình chính. Tuy nhiên, điều quan trọng là mã nguồn sẽ không được bao gồm trong bất kỳ tệp JAR nào (không phải ứng dụng chính cũng như các plugin-plugin, xem: tài nguyên của Leiningen bị bỏ qua).

Trả lời

1

Tôi đã không tự mình thử nghiệm, nhưng bạn nên trong lý thuyết có thể nhận được OSGi để làm việc với Clojure.

Có một Clojure/OSGi tích hợp thư viện ở đây:

+0

Có vẻ như OSGi là cách Java để thực hiện điều đó. Các repo github thực sự là kém tài liệu và có vẻ rất hackish từ một cái nhìn tại mã nguồn. Nếu không có gì có thể so sánh tôi có lẽ sẽ viết một wrapper cho OSGi bản thân mình. –

1

Nếu tôi là cố gắng để vai trò giải pháp của riêng tôi, tôi sẽ cố gắng sử dụng tools.namespace để tải và dỡ bỏ các plugin. Tôi không hoàn toàn chắc chắn nó sẽ làm việc, nhưng nó chắc chắn đi đúng hướng. Tôi nghĩ rằng một phần quan trọng là các lọ cắm sẽ phải được "cài đặt" ở một vị trí đã có trên classpath.

Một lần nữa, đây chỉ là khởi đầu của một giải pháp khả thi. Tôi đã không cố gắng làm điều này.

+0

Bạn có chắc chắn nếu tools.namespace.find hoạt động khi mã nguồn không được bao gồm trong các JAR không? –

+0

Tôi chưa thử, nhưng README nói rằng tools.namespace.tìm thấy chứa "các tiện ích để tìm kiếm các không gian tên Clojure trên hệ thống tập tin, trong các thư mục hoặc các tệp JAR. Kết hợp với java.classpath, nó có thể tìm kiếm các không gian tên trên đường dẫn lớp Java." – Jeremy

+0

Rất tiếc, không thể tìm thấy bất kỳ không gian tên nào trong tệp JAR mà không có nguồn :( –

4

Để thêm bình trong khi chạy, hãy sử dụng pomegranate cho phép bạn thêm tệp .jar vào đường dẫn lớp. Plugins của phần mềm của bạn nên được libs Clojure thường mà theo một số công ước mà bạn cần phải thiết lập:

  1. Làm cho họ cung cấp (ví dụ như trong một edn) một biểu tượng cho một đối tượng thực hiện một cơ chế constructor/destructor như Lifecycle giao thức trong thư viện Stuart Sierras component. Trong thời gian chạy, requireresolve biểu tượng đó, start đối tượng kết quả và giao nó để nghỉ ngơi các chương trình phối hợp plugin chương trình của bạn.

  2. Cung cấp API công khai trong chương trình của bạn cho phép các plugin tương tác với nó theo cách bạn phối hợp không đồng bộ e. g. với clojure.core.async (đừng để một plugin chặn toàn bộ chương trình).

  3. Đảm bảo rằng các plugin có cách phối hợp để hiển thị chức năng của chúng với nhau chỉ khi chúng muốn để cho phép mức độ mô đun cao trong số các plugin của bạn. Đảm bảo rằng trình tải plugin của bạn có khả năng phát hiện các phụ thuộc giữa các plugin và có khả năng tải và dỡ chúng theo đúng thứ tự.

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