Bagaimana saya bisa memasang JAR baru yang mengimplementasikan antarmuka secara dinamis?

7

Latar belakang cepat: Saya sedang mengerjakan pengembangan antarmuka yang akan diimplementasikan oleh saya dan pengembang lainnya. Antarmuka ini akan memungkinkan pengguna untuk "plugin" kode fungsional baru ke dalam sistem untuk penggunaan baru. Kode baru ini akan dipanggil dari server / aplikasi yang sudah berjalan. (TLDR: Saya perlu mengembangkan kemampuan plugin untuk diinstal ke dalam aplikasi saya dengan cepat)

Semua pekerjaan yang telah saya lakukan dengan antarmuka sejauh ini adalah untuk keperluan pengkodean internal, bukan untuk diekspos keluar. Satu-satunya cara saya bisa memikirkan untuk memungkinkan pengguna untuk plugin antarmuka implementasi kode baru, akan bagi pengguna untuk entah bagaimana menghubungkan file JAR dalam berisi kelas pelaksana dan entah bagaimana mendefinisikan tanda tangan kelasnya untuk panggilan. Ini sepertinya sesuatu yang telah dilakukan sebelumnya, saya hanya belum pernah terkena ke sisi pengkodean itu.

Apakah ada kerangka kerja yang bisa saya gunakan untuk memungkinkan plugin kode Java baru ini selama runtime server / aplikasi? Saya telah menggunakan API sebelumnya, tetapi di lebih banyak layanan web mengekspos rasa di mana Anda mengkonsumsi layanan dan tidak "mengimplementasikan" beberapa antarmuka inti.

Untuk referensi saya menggunakan Java backend, dengan Spring untuk aplikasi utama.

Dinding
sumber
1
Tampak seperti duplikat dari stackoverflow.com/questions/25449/…
Esben Skov Pedersen
@EsbenSkovPedersen yang menuntun saya ke lubang kelinci yang akhirnya memberi saya semua yang saya butuhkan dan kemudian beberapa. Terima kasih banyak. (-admins: Duplikat, tutup baik-baik saja oleh saya)
Walls
@Wall duplikat harus di situs yang sama. Hanya karena SO memiliki pertanyaan serupa, bukan berarti ini duplikat. Anda dapat meringkas apa yang Anda temukan dalam jawaban untuk pertanyaan ini dan menautkan ke pertanyaan SO, karena jawabannya sedikit lebih permanen daripada komentar.

Jawaban:

5

Setelah melihat ke posting terkait pada Stack Overflow , saya menemukan ada berbagai alat yang berbeda yang saya inginkan untuk melakukan pengembangan gaya "plugin".

Pertama, saya dekat dengan "API" tetapi solusi yang benar adalah "SPI" atau Antarmuka Penyedia Layanan. Saya menemukan posting yang sangat bagus menggambarkan perbedaan pada Stack Overflow . Untuk meringkas: API adalah satu set kelas / antarmuka / metode yang Anda PANGGIL dan GUNAKAN untuk mencapai tujuan. Dibandingkan dengan SPI yang merupakan sekumpulan kelas / antarmuka / metode yang Anda EXTEND dan IMPLEMENT untuk mencapai tujuan.

Ada banyak cara saya masih mencari melalui untuk menemukan solusi yang tepat untuk saya, tetapi tampaknya menggunakan Java ClassLoaderatau URLClassLoaderakan menjadi cara untuk pergi. Oracle memberikan tutorial yang bagus tentang bagaimana menerapkan ini di sini .

Ada banyak alat di luar sana yang dapat memberikan dukungan untuk ini seperti Apache Aries dan OSGi .

Dinding
sumber