Cách tốt nhất để xây dựng một hệ thống Plugin với Java


145

Làm thế nào bạn sẽ triển khai một hệ thống Plugin cho ứng dụng Java của bạn?

Có thể có một hệ thống dễ sử dụng (dành cho nhà phát triển) đạt được những điều sau:

  • Người dùng đặt plugin của họ vào thư mục con của ứng dụng
  • Plugin có thể cung cấp màn hình cấu hình
  • Nếu bạn sử dụng một khung, giấy phép có tương thích với phát triển thương mại không?

Câu trả lời:


107

Trước tiên, bạn cần một giao diện mà tất cả các plugin cần thực hiện, ví dụ:

public interface Plugin {
    public void load(PluginConfiguration pluginConfiguration);
    public void run();
    public void unload();
    public JComponent getConfigurationPage();
}

Các tác giả plugin sau đó nên bó các plugin của họ vào các tệp JAR. Các ứng dụng của bạn mở tệp JAR và sau đó có thể sử dụng một thuộc tính từ tệp kê khai JAR hoặc danh sách tất cả các tệp trong tệp JAR để tìm lớp thực hiện giao diện Plugin của bạn. Khởi tạo lớp đó, plugin đã sẵn sàng để đi.

Tất nhiên bạn cũng có thể muốn thực hiện một số loại hộp cát để plugin bị hạn chế trong những gì nó có thể và không thể làm. Tôi đã tạo ra một ứng dụng thử nghiệm nhỏ (và viết blog về nó ) bao gồm hai plugin, một trong số đó bị từ chối truy cập vào tài nguyên cục bộ.


2
Sandbox bạn đề cập thực sự là phần khó khăn nhất! nhưng không phải băn khoăn - osgi đã làm điều đó cho bạn như đã đề cập ở trên.
Chii

1
Sandboxing không khó lắm. Mất khoảng hai tuần để tìm ra cách thực hiện chính xác nhưng một khi bạn biết rằng nó khá đơn giản. :)
Bombe

@Bombe là ứng dụng ví dụ này vẫn còn sống ở bất cứ đâu?
ataulm

* sử dụng tệp đính kèm được tìm thấy tại bug.freenetproject.org/print_orms_page.php?orms_id=1900
ataulm

@ timberwo7ves Tôi không hiểu ý của bạn. Ứng dụng kiểm tra tệp vẫn có thể được tải xuống từ vị trí được đưa ra trong bài đăng và từ trang bạn đã đề cập.
Bombe

41

Sử dụng OSGi .

Nó là nền tảng của hệ thống trình cắm thêm Eclipse. Equinox là triển khai của Eclipse (EPL được cấp phép) và Felix là triển khai của Dự án Apache (Giấy phép công cộng Apache được cấp phép).

Eclipse cung cấp một ví dụ cụ thể rằng OSGi có thể bao gồm các điểm bạn đã đề cập (hoặc bạn chỉ có thể xây dựng ứng dụng của mình trên RCP Eclipse nếu bạn muốn có một ngăn xếp Eclipse / SWT / JFace đầy đủ).


4
Tôi đã tìm hiểu về OSGi nhưng chưa bao giờ tìm thấy một mồi thực sự tốt cho nó. Sẽ thật tuyệt nếu ai đó có thể giới thiệu một số liên kết ở đây.
Brian Matthews

1
Tôi đã nhúng Equinox vào ứng dụng của mình và sử dụng các thực hành OSGi tiêu chuẩn để thực hiện chính xác những gì OP muốn. Trong swing quá, không SWT. Webstarted là tốt. tài nguyên khởi đầu tốt: neilbartlett.name/blog
basszero

3
OSGi là hệ thống plugin thực tế. Tuy nhiên, bước nhảy vọt từ mô hình lập trình Java tiêu chuẩn sang OSGi khá rộng ...
Hendy I Girls

30

Kể từ 1.6, đã có java.util.ServiceLoader có thể được sử dụng nếu bạn muốn mã hóa hệ thống đơn giản của riêng bạn.

Nhưng nếu bạn muốn bất cứ điều gì ngoài các tính năng cơ bản, hãy sử dụng một trong các khung hiện có.


16

Ngoài ra còn có JPF (Java Plugin Framework) .


Có ai ở đây đã sử dụng JPF? Nghe có vẻ thú vị
Sven Lilienthal

1
JabRef sử dụng JPF cho các plugin của nó. Hoạt động khá tốt.
koppor

Tôi đang sử dụng JPF, nhưng nó được kết hợp chặt chẽ với Ant. Tôi muốn thoát khỏi nó nhưng tôi không biết nó sẽ ảnh hưởng đến ứng dụng của tôi đến mức nào.
MartinL

Tôi đã tạo một plugin JPF cho một sản phẩm nguồn mở (OpenEMM); Tôi đã có thể làm nó với maven (plugin maven-assembly); Chắc chắn tôi thực sự đánh giá cao sự đơn giản của sự phát triển ngay cả bây giờ có lẽ là OSGI phổ biến hơn.
2014

Có bất kỳ hạn chế nào đối với các phiên bản java khi sử dụng JPF không?
Madhav

16

Sử dụng PF4J . Nó có hỗ trợ cho Web, Spring và Wicket. Dễ dàng sử dụng và xây dựng các ứng dụng


tôi thấy đây là thứ tôi cần và nó có vẻ khá đơn giản nhưng tôi cần sự giúp đỡ về nó
nonybrighto

cố gắng đặt câu hỏi cho Decebal trên github. anh ấy sẽ giúp bạn
Daniel Jipa

xem meta.stackoverflow.com/questions/376686/ trên trạng thái tài khoản Decebals tại đây
Wolfgang Fahl

1
Nếu bạn đang xem pf4j, bạn cũng có thể xem github.com/hank-cp/sbp . Nó được xây dựng trên đỉnh pf4j để hỗ trợ Spring Boot để xây dựng một ứng dụng web hoàn chỉnh.
Hank

13

Tôi đã làm việc trên OSGi trong một tuần - một tuần cực kỳ căng thẳng, không có gì ngoài OSGi. Cuối cùng nó giống như một giấc mơ xấu nhưng tôi đã học được rất nhiều.

Tôi đã có thể khiến OSGi hoạt động (không dễ, tất cả các ví dụ đã lỗi thời, mọi thứ trên mạng đều ít nhất ba tuổi nếu không phải năm), nhưng tôi gặp rắc rối nghiêm trọng khi tích hợp nó vào một dự án hiện có vì các vấn đề với biểu hiện bình.

Nói tóm lại, chỉ có một vài công cụ tối nghĩa được sử dụng để xây dựng các bảng kê khai và chúng không được ghi chép rõ ràng (Công cụ BND hầu như không tối nghĩa, nhưng nó được thiết kế cho một quy trình nhất định trong Eclipse). Ngoài ra, hầu hết các thông tin OSGi có sẵn không nhắm vào các nhà phát triển ứng dụng có ứng dụng máy tính để bàn hiện có.

Điều này làm cho rất nhiều bối cảnh cho thông tin mờ hoặc không phù hợp. Các bài đăng trên blog của Neil Bartlett là sự trợ giúp lớn nhất, nhưng ngay cả những người không thể có được một hệ thống làm việc (tôi đã lấy một số mã từ hướng dẫn của Felix và ghép nó lại để làm cho khung nhúng được nhúng). Tôi đã tìm thấy bản thảo sách của anh ấy mà anh ấy đã đăng miễn phí nhiều năm trước, điều này thật tuyệt vời, nhưng các ví dụ trong Eclipse không hoạt động vì những thay đổi trong hỗ trợ OSGi của Eclipse.

Mỗi bước là một trở ngại lớn. Tôi sẽ cố gắng để đăng một số chi tiết ở đây sau.


17
Làm thế nào đây là một câu trả lời? Đó là nhiều hơn những lời ca ngợi về OSGi, và bạn thậm chí không giải thích OSGi là gì.
Rabbi tàng hình

@StealthRabbi Tại thời điểm "câu trả lời" này và trong một thời gian sau đó, đó là thông tin tốt cho ai đó đang cố gắng làm việc với OSGi ngoài tự nhiên. OSGi đã là một phần của cuộc thảo luận - vì vậy không cần phải xác định nó. Đó là một câu trả lời rằng nó có thể đã cứu mọi người một tuần làm việc - toàn bộ lý do cho SO.
Sean Anderson

9

Tôi nghĩ rằng khuyến nghị OSGi để giải quyết vấn đề nêu trên là lời khuyên cực kỳ tồi. OSGi là "sự lựa chọn đúng đắn" nhưng đối với một kịch bản như ở trên, tôi nghĩ rằng JPF hoặc một số khung tối giản trong nhà là đủ.


3

Cách đây nhiều năm, tôi đã bắt đầu một dự án như thế và tôi hy vọng sẽ sớm sẵn sàng. Tôi lấy cảm hứng từ các dự án như NetBeans và Eclipse nhưng trong khi đó nó đã thay đổi thành một thứ hơi khác một chút. OSGi có vẻ như là một lựa chọn tốt bây giờ, nhưng tôi không có cơ hội so sánh nó với dự án của mình. Nó tương tự như JPF đã đề cập ở trên, nhưng đồng thời cũng khác nhau theo nhiều cách.

Ý tưởng cơ bản thúc đẩy tôi là xây dựng ứng dụng Java dễ dàng nhất có thể, không tách biệt giữa các ứng dụng web, ứng dụng máy tính để bàn hoặc ứng dụng applet / JWS (tất nhiên điều này không bao gồm UI - chưa) như là một chức năng cốt lõi.

Tôi đã xây dựng dự án với một vài mục tiêu trong đầu:

  • không thành vấn đề nếu bạn xây dựng một ứng dụng web hoặc một ứng dụng máy tính để bàn, bạn nên khởi động ứng dụng theo cùng một cách, một phương thức chính đơn giản, Không khai báo web.xml ưa thích (không phải là tôi chống lại việc mô tả web chuẩn, nhưng nó không hoạt động tốt với hệ thống trình cắm, nơi bạn thêm "servlets" - tôi gọi chúng là RequestHandler (s) - động theo ý của bạn).
  • dễ dàng cắm các "phần mở rộng" xung quanh một "điểm mở rộng" - thứ gì đó từ Eclipse nhưng một cách tiếp cận khác.
  • có thể tự triển khai, vì tất cả các plugin đã được đăng ký (tệp XML), ứng dụng phải tự triển khai độc lập với hệ thống xây dựng - tất nhiên có một tác vụ Ant và Maven MOJO là các liên kết với thế giới bên ngoài của chúng tôi, nhưng trong kết thúc nó gọi ứng dụng và hướng dẫn nó tự triển khai tại một địa điểm cụ thể.
  • mượn từ Maven, nó có thể tải xuống mã từ kho lưu trữ (bao gồm cả kho lưu trữ Maven 1 & 2) để ứng dụng của bạn có thể được triển khai dưới dạng một lọ nhỏ miễn là bạn có quyền truy cập vào kho lưu trữ (đôi khi hữu ích và về cơ bản điều này cung cấp hỗ trợ cho tự động cập nhật - bạn không thích ý tưởng được ứng dụng web của bạn thông báo rằng có phiên bản mới hơn, nó đã được tải xuống và nó chỉ cần sự cho phép của bạn để cài đặt nó? Tôi biết tôi thích điều đó).
  • giám sát ứng dụng cơ bản về sức khỏe hệ thống, thông báo email trong trường hợp thất bại

2
Tôi không có ý cằn nhằn, nhưng bạn đã làm việc với nó từ bao giờ? Là mã có sẵn (tôi có thể có thể sử dụng nó như là hoặc thêm vào nó)?
Piccolo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.