Cara terbaik untuk membangun sistem Plugin dengan Java

145

Bagaimana Anda menerapkan sistem Plugin untuk aplikasi Java Anda?

Apakah mungkin untuk memiliki sistem yang mudah digunakan (untuk pengembang) yang mencapai yang berikut:

  • Pengguna menempatkan plugin mereka ke dalam subdirektori aplikasi
  • Plugin dapat menyediakan layar konfigurasi
  • Jika Anda menggunakan kerangka kerja, apakah lisensi tersebut kompatibel dengan pengembangan komersial?
Sven Lilienthal
sumber

Jawaban:

107

Pertama, Anda membutuhkan antarmuka yang harus diimplementasikan oleh semua plugin, misalnya

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

Pembuat plugin kemudian harus membundel plugin mereka ke dalam file JAR. Aplikasi Anda membuka file JAR dan kemudian dapat menggunakan atribut dari manifes JAR atau daftar semua file dalam file JAR untuk menemukan kelas yang mengimplementasikan antarmuka Plugin Anda. Instantiate kelas itu, plugin siap untuk digunakan.

Tentu saja Anda mungkin juga ingin menerapkan semacam sandboxing sehingga plugin dibatasi apa yang bisa dan tidak bisa dilakukan. Saya telah membuat aplikasi pengujian kecil (dan membuat blog tentang itu ) yang terdiri dari dua plugin, salah satunya ditolak akses ke sumber daya lokal.

Bombe
sumber
2
kotak pasir yang Anda sebutkan sebenarnya adalah bagian yang paling sulit! tapi jangan khawatir - osgi sudah melakukannya untuk Anda seperti yang disebutkan di atas.
Chii
1
Sandboxing tidak terlalu sulit. Butuh waktu sekitar dua minggu untuk mencari tahu bagaimana melakukannya dengan benar tetapi begitu Anda tahu bahwa itu sangat sederhana. :)
Bombe
@Bombe, apakah contoh aplikasi ini masih hidup di mana saja?
ataulm
* menggunakan lampiran yang ditemukan di bugs.freenetproject.org/print_bug_page.php?bug_id=1900
ataulm
@ timberwo7ves Saya tidak mengerti maksud Anda. Aplikasi pengujian file masih dapat diunduh dari lokasi yang diberikan dalam pos, dan dari halaman yang Anda sebutkan.
Bombe
41

Gunakan OSGi .

Ini adalah dasar dari sistem plug-in Eclipse. Equinox adalah implementasi Eclipse (berlisensi EPL) dan Felix adalah implementasi Proyek Apache (Lisensi Publik Apache berlisensi).

Eclipse memberikan contoh nyata bahwa OSGi dapat mencakup poin yang Anda sebutkan (atau Anda bisa membangun aplikasi Anda di atas Eclipse RCP jika Anda menginginkan tumpukan Eclipse / SWT / JFace penuh).

Aaron Maenpaa
sumber
4
Saya telah mencoba-coba OSGi tetapi tidak pernah menemukan primer yang sangat bagus untuk itu. Akan lebih bagus jika seseorang dapat merekomendasikan beberapa tautan di sini.
Brian Matthews
1
Saya telah menyematkan equinox ke dalam aplikasi saya dan menggunakan praktik standar OSGi untuk melakukan persis apa yang diinginkan OP. Dalam ayunan juga, bukan SWT. Web juga dimulai. baik sumber daya awal: neilbartlett.name/blog
basszero
3
OSGi idealnya adalah sistem plugin de facto. Namun, lompatan dari model pemrograman Java ke OSGi standar cukup luas ...
Hendy Irawan
30

Sejak 1.6, sudah ada java.util.ServiceLoader yang dapat digunakan jika Anda ingin kode sistem sederhana Anda sendiri.

Tetapi jika Anda menginginkan lebih dari fitur dasar, gunakan salah satu kerangka kerja yang ada.

Pete Kirkham
sumber
16

Ada juga JPF (Java Plugin Framework) .

jan
sumber
Adakah yang menggunakan JPF di sini? Kedengarannya menarik
Sven Lilienthal
1
JabRef menggunakan JPF untuk plugin-nya. Bekerja dengan sangat baik.
koppor
Saya menggunakan JPF, tetapi erat dengan Ant. Saya ingin menyingkirkannya tetapi saya tidak tahu seberapa besar dampaknya pada aplikasi saya.
MartinL
Saya membuat plugin JPF untuk produk sumber terbuka (OpenEMM); Saya dapat membuatnya dengan maven (maven-assembly plugin); Yang pasti saya sangat menghargai kesederhanaan pengembangan bahkan sekarang mungkin OSGI yang lebih populer.
рüффп
Apakah ada batasan pada versi java untuk menggunakan JPF?
Madhav
16

Gunakan PF4J . Ini memiliki dukungan untuk Web, Spring dan Wicket. Mudah digunakan dan membangun aplikasi

Mallikarjuna Sangisetty
sumber
saya menemukan ini menjadi apa yang saya butuhkan dan tampaknya cukup sederhana tetapi saya butuh bantuan
nonybrighto
coba ajukan pertanyaan ke Decebal di github. dia akan membantu Anda
Daniel Jipa
lihat meta.stackoverflow.com/questions/376686/… tentang status akun Decebals di sini
Wolfgang Fahl
1
Jika Anda melihat pf4j, Anda mungkin juga melihat github.com/hank-cp/sbp . Itu dibangun di atas pf4j untuk mendukung Spring Boot untuk membangun aplikasi web yang lengkap.
Hank
13

Saya bekerja di OSGi selama seminggu - minggu yang intens dan tidak ada apa-apa selain OSGi. Pada akhirnya itu seperti mimpi buruk tetapi saya belajar banyak.

Saya dapat membuat OSGi berfungsi (tidak mudah, semua contoh sudah ketinggalan zaman, semua yang ada di internet setidaknya berusia tiga tahun jika tidak lima tahun), tetapi saya mengalami masalah serius untuk mengintegrasikannya ke dalam proyek yang ada karena masalah dengan manifes jar.

Singkatnya, hanya ada beberapa alat yang tidak jelas yang digunakan untuk membangun manifes dan mereka tidak didokumentasikan dengan baik (Alat BND hampir tidak jelas, tetapi dirancang untuk proses tertentu dalam Eclipse). Juga, sebagian besar informasi OSGi yang tersedia tidak ditargetkan untuk pengembang aplikasi yang memiliki aplikasi desktop yang ada.

Ini membuat banyak konteks untuk informasi berkabut atau tidak pantas. Posting blog Neil Bartlett adalah bantuan terbesar, tetapi bahkan yang gagal untuk mendapatkan sistem kerja (saya mengambil beberapa kode dari tutorial Felix dan menyatukannya untuk membuat kerangka kerja tertanam bergulir). Saya menemukan draf bukunya yang ia posting gratis bertahun-tahun yang lalu, yang sangat bagus, tetapi contoh-contoh di Eclipse tidak berfungsi karena perubahan dalam dukungan Eclipse OSGi.

Setiap langkah adalah rintangan utama. Saya akan mencoba memposting beberapa rincian lebih lanjut di sini nanti.

Sean Anderson
sumber
17
Bagaimana ini jawabannya? Ini lebih dari kata-kata kasar tentang OSGi, dan Anda bahkan tidak menjelaskan apa itu OSGi.
Stealth Rabbi
@StealthRabbi Pada saat "jawaban" ini, dan untuk beberapa waktu sesudahnya, itu adalah informasi yang bagus untuk seseorang yang mencoba bekerja dengan OSGi di alam liar. OSGi sudah menjadi bagian dari diskusi - jadi tidak perlu mendefinisikannya. Ini adalah jawaban yang mungkin menyelamatkan orang dari pekerjaan selama seminggu - alasan utama untuk SO.
Sean Anderson
9

Saya pikir merekomendasikan OSGi untuk memecahkan masalah yang disebutkan di atas adalah saran yang sangat buruk. OSGi adalah "pilihan yang tepat" tetapi untuk skenario seperti yang di atas, saya pikir baik JPF atau kerangka kerja minimalis homegrown cukup.

Steen
sumber
3

Bertahun-tahun yang lalu saya memulai proyek seperti itu dan saya berharap segera akan siap. Saya mendapat inspirasi dari proyek-proyek seperti NetBeans dan Eclipse tetapi sementara itu berubah menjadi sesuatu yang sedikit berbeda. OSGi terlihat seperti pilihan yang baik sekarang, tetapi saya tidak memiliki kesempatan untuk membandingkannya dengan proyek saya. Ini mirip dengan JPF yang disebutkan di atas, tetapi pada saat yang sama berbeda dalam banyak hal.

Ide dasar yang memotivasi saya adalah semudah mungkin untuk membangun aplikasi Java, tanpa pemisahan antara aplikasi web, aplikasi desktop atau aplikasi applet / JWS (tentu saja ini tidak mencakup UI - belum) sebagai fungsi inti.

Saya membangun proyek dengan beberapa tujuan di benak saya:

  • tidak masalah jika Anda membangun aplikasi web atau aplikasi desktop Anda harus memulai aplikasi dengan cara yang sama, metode utama, Tidak ada deklarasi web.xml yang mewah (bukan berarti saya menentang memiliki deskriptor web standar, tetapi itu tidak berjalan baik dengan sistem plug-in, di mana Anda menambahkan "servlets" - Saya menyebutnya RequestHandler (s) - dinamis sesuka Anda).
  • mudah untuk memasang "ekstensi" di sekitar "titik ekstensi" - sesuatu dari Eclipse tetapi pendekatan yang berbeda.
  • self-deployable, karena semua plugin terdaftar (file XML) aplikasi harus mandiri dari sistem build - tentu saja ada tugas Ant dan Maven MOJO yang merupakan tautan dengan dunia pihak kita, tetapi di mengakhirinya memanggil aplikasi dan menginstruksikannya untuk menyebarkan dirinya sendiri di lokasi tertentu.
  • dipinjam dari Maven, dapat mengunduh kode dari repositori (termasuk repositori Maven 1 & 2) sehingga aplikasi Anda dapat digunakan sebagai toples kecil selama Anda memiliki akses ke repositori (kadang-kadang berguna, dan pada dasarnya ini memberikan dukungan untuk otomatis pembaruan - tidakkah Anda menyukai gagasan untuk diberi tahu oleh aplikasi web Anda bahwa ada versi yang lebih baru, telah diunduh dan hanya perlu izin Anda untuk menginstalnya? Saya tahu saya suka itu).
  • pemantauan aplikasi dasar tentang kesehatan sistem, pemberitahuan email jika terjadi kegagalan
adrian.tarau
sumber
2
Saya tidak bermaksud mengomel, tetapi apakah Anda sudah mengusahakannya sejak itu? Apakah kodenya tersedia (saya mungkin bisa menggunakannya apa adanya atau menambahkannya)?
Piccolo