2008-08-24 29 views
30

Tôi muốn tạo một chương trình Java có thể được mở rộng bằng các plugin. Làm thế nào tôi có thể làm điều đó và nơi tôi nên tìm?Làm thế nào để tạo một chương trình Java có thể bổ sung?

Tôi có một bộ giao diện mà plugin phải triển khai và nó phải nằm trong một cái lọ. Chương trình nên xem cho các lọ mới trong một thư mục tương đối (đến chương trình) và đăng ký chúng bằng cách nào đó.


Mặc dù tôi thích Eclipse RCP, tôi nghĩ rằng nó quá nhiều cho nhu cầu đơn giản của tôi.

Điều tương tự cũng xảy ra với Spring, nhưng vì tôi vẫn đang xem xét nó, tôi cũng có thể thử nó.

Nhưng vẫn còn, tôi muốn tìm cách tạo plugin "khung công cụ" của riêng mình càng đơn giản càng tốt.

+0

có thể trùng lặp với [Cách tốt nhất để xây dựng hệ thống Plugin với Java] (http://stackoverflow.com/questions/465099/best-way-to-build-a-plugin-system-with-java). Đây là sớm hơn, nhưng khác trở nên phổ biến hơn cuối cùng. –

Trả lời

37

Tôi đã làm điều này cho phần mềm tôi đã viết trong quá khứ, nó rất tiện dụng . Tôi đã làm nó bằng cách đầu tiên tạo ra một giao diện mà tất cả các lớp 'plugin' của tôi cần thiết để thực hiện. Sau đó tôi đã sử dụng Java ClassLoader để tải các lớp đó và tạo các phiên bản của chúng.

Một cách để bạn có thể đi về nó là thế này:

File dir = new File("put path to classes you want to load here"); 
URL loadPath = dir.toURI().toURL(); 
URL[] classUrl = new URL[]{loadPath}; 

ClassLoader cl = new URLClassLoader(classUrl); 

Class loadedClass = cl.loadClass("classname"); // must be in package.class name format 

Đó đã nạp lớp, bây giờ bạn cần phải tạo ra một thể hiện của nó, giả sử tên giao diện là MyModule:

MyModule modInstance = (MyModule)loadedClass.newInstance(); 
+0

Tôi biết tôi hơi muộn về chủ đề này, nhưng nếu bạn muốn lặp qua tất cả các lớp nhất định trong một thư mục và tải chúng? ở đâu đó tôi có thể thấy việc triển khai và thực thi mã trực tuyến không? Ngoài ra, tôi hiểu hầu hết các mã của bạn và nó rất đơn giản, cảm ơn! +1 –

+1

@CodyRichardson Có một ví dụ hoàn chỉnh về triển khai đơn giản tại http://www.knowbase.org/viewtopic.php?id=31; nó làm cho việc sử dụng Java 8 và Gradle 4. – Alexiy

+0

@Alexiy Cảm ơn bạn đã liên kết, nó đã giúp rất nhiều và về cơ bản là mọi thứ tôi cần. Ban đầu nó hơi phức tạp một chút (chủ yếu là lambdas) nhưng đó chỉ là vì tôi là một noob java :) Tôi đã xem nó một vài lần và nó có ý nghĩa hơn rất nhiều. Cảm ơn vì điều đó! –

1

Bạn đã xem xét việc xây dựng trên nền tảng khách hàng phong phú của Eclipse và sau đó vạch trần khung công tác mở rộng của Eclipse chưa?

Ngoài ra, tùy thuộc vào nhu cầu của bạn, Spring Framework có thể giúp đỡ với điều đó và những thứ khác mà bạn có thể muốn làm: http://www.springframework.org/

14

Tôi khuyên bạn nên xem xét kỹ lưỡng the Java Service Provider (SPI) API. Nó cung cấp một hệ thống đơn giản cho việc tìm kiếm tất cả các lớp trong tất cả các Lọ trên đường dẫn lớp mà tự phơi bày khi triển khai một dịch vụ cụ thể. Tôi đã sử dụng nó trong quá khứ với các hệ thống plugin với thành công lớn.

+2

Lưu ý rằng lớp sun.misc.Service đã bị thay thế bởi lớp java.util.ServiceLoader. –

16

Nhìn vào OSGi.

Một mặt, OSGi cung cấp tất cả các loại cơ sở hạ tầng để quản lý, khởi động và thực hiện nhiều việc khác với các thành phần phần mềm mô-đun. Mặt khác, nó có thể khiến tôi quá nặng cân cho nhu cầu của bạn.

Ngẫu nhiên, Eclipse sử dụng OSGi để quản lý các plugin của nó.

+1

+1 cho OSGi. Tôi tìm thấy nó đúng kích cỡ giữa các thủ thuật đơn giản ClassLoader (mà sẽ để lại cho bạn rất nhiều bánh xe để tái tạo lại) và Eclipse RCP (khung công tác lớn cho nhiệm vụ không phức tạp). – Leonel

4

Ở phương pháp tiếp cận lớp học được phát triển tại nhà: Mặc dù đây là cách tốt nhất để tìm hiểu về trình nạp lớp có thứ gọi là "classloader hell", được biết đến bởi những người vật lộn với nó khi sử dụng trong các dự án lớn hơn. Các lớp xung đột rất dễ giới thiệu và khó giải quyết.

Và có một lý do chính đáng khiến nhật thực di chuyển sang OSGi năm trước. Vì vậy, nếu có nhiều dự án thú cưng hơn, hãy xem xét kỹ hơn về OSGi. Giá trị của nó nhìn vào. Bạn sẽ tìm hiểu về các trình nạp lớp PLUS một tiêu chuẩn kỹ thuật mới nổi.

6

Mặc dù tôi sẽ là giải pháp được chấp nhận thứ hai, nếu cần hỗ trợ plugin cơ bản (hầu hết thời gian), cũng có Java Plugin Framework (JPF), mặc dù thiếu tài liệu phù hợp, rất gọn gàng triển khai khung plugin.

Có thể dễ dàng triển khai và - khi bạn vượt qua các phân loại đồng bộ hóa lớp - rất dễ phát triển. Nhận xét ở trên là lưu ý rằng đường dẫn plugin bên dưới thư mục plugin phải được đặt tên theo đường dẫn lớp đầy đủ ngoài việc có tệp lớp được triển khai trong đường dẫn gói thông thường có tên là đường dẫn. Ví dụ.

plugins 
`-com.my.package.plugins 
    `-com 
    `-my 
     `-package 
     `-plugins 
      |- Class1.class 
      `- Class2.class 
Các vấn đề liên quan