Java ile bir Eklenti sistemi oluşturmanın en iyi yolu


145

Java uygulamanız için bir Eklenti sistemini nasıl uygularsınız?

Aşağıdakileri sağlayan kullanımı kolay (geliştirici için) bir sisteme sahip olmak mümkün müdür:

  • Kullanıcılar eklentilerini uygulamanın bir alt dizinine yerleştirir
  • Eklenti bir yapılandırma ekranı sağlayabilir
  • Bir çerçeve kullanırsanız, lisans ticari geliştirmeyle uyumlu mu?

Yanıtlar:


107

İlk olarak, tüm eklentilerin uygulaması gereken bir arayüze ihtiyacınız var, örn.

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

Eklenti yazarları eklentilerini JAR dosyalarına paketlemelidir. Uygulamalarınız JAR dosyasını açar ve ardından Eklenti arayüzünüzü uygulayan sınıfı bulmak için JAR manifest'inden veya JAR dosyasındaki tüm dosyaların listesini içeren bir öznitelik kullanabilir. Bu sınıfı başlatın, eklenti kullanıma hazırdır.

Tabii ki eklenti yapabilecekleri ve yapamayacağı şekilde kısıtlanacak şekilde bir çeşit sanal alan uygulamak da isteyebilirsiniz. Biri yerel kaynaklara erişimi reddedilen iki eklentiden oluşan küçük bir test uygulaması oluşturdum (ve bu konuda blog yazdım ).


2
bahsettiğiniz kum havuzu aslında en zor kısmı! ama üzülmek değil, yukarıda belirtildiği gibi zaten sizin için yapıyor.
Chii

1
Korumalı alan oluşturma o kadar da zor değil. Nasıl doğru yapılacağını öğrenmek için yaklaşık iki hafta sürdü, ancak bir kez bildiğinizde oldukça basit. :)
Bombe

@Bombe bu örnek uygulama hala her yerde yaşıyor mu?
ataulm


@ timberwo7ves Ne demek istediğini anlamıyorum. Dosya testi uygulaması yine de gönderide verilen konumdan ve belirttiğiniz sayfadan indirilebilir.
Bombe

41

OSGi kullanın .

Eclipse eklenti sisteminin temelidir. Equinox , Eclipse'in uygulamasıdır (lisanslı EPL) ve Felix , Apache Projesi'nin uygulamasıdır (lisanslı Apache Kamu Lisansı).

Eclipse, OSGi'nin bahsettiğiniz noktaları kapsayabileceğine dair somut bir örnek sunar (veya tam bir Eclipse / SWT / JFace yığını istiyorsanız uygulamanızı Eclipse RCP'nin üzerine inşa edebilirsiniz ).


4
OSGi ile dabbledim ama bunun için gerçekten iyi bir astar bulamadım. Birisi burada bazı bağlantılar önerebilir eğer harika olurdu.
Brian Matthews

1
Equinox'u uygulamama yerleştirdim ve OP'nin tam olarak ne istediğini yapmak için standart OSGi uygulamalarını kullandım. Salıncakta da, SWT değil. Webstar da. iyi bir başlangıç kaynak: neilbartlett.name/blog
basszero

3
OSGi ideal olarak fiili eklenti sistemidir. Ancak, standart Java'dan OSGi programlama modeline sıçrama oldukça geniştir ...
Hendy Irawan

30

1.6'dan beri , kendi basit sisteminizi kodlamak istiyorsanız kullanılabilecek java.util.ServiceLoader var .

Ancak temel özelliklerden başka bir şey istiyorsanız, mevcut çerçevelerden birini kullanın.


16

Burada kimse JPF kullandı mı? Kulağa ilginç
Sven Lilienthal

1
JabRef eklentileri için JPF kullanır. Oldukça iyi çalışıyor.
koppor

JPF kullanıyorum, ancak Ant ile sıkıca bağlı. Bundan kurtulmak istiyorum ancak uygulamam üzerinde ne kadar etkisi olacağını bilmiyorum.
MartinL

Açık kaynaklı bir ürün için bir JPF eklentisi oluşturdum (OpenEMM); Bunu maven (maven-montaj eklentisi) ile yapabildim; Elbette, şimdi bile gelişimin sadeliğini gerçekten takdir ediyorum, muhtemelen daha popüler olan OSGI.
рüффп

Java sürümlerinde JPF kullanımıyla ilgili herhangi bir kısıtlama var mı?
Madhav

16

PF4J kullanın . Web, Spring ve Wicket desteği vardır. Kullanımı ve uygulamaları kolay


i ihtiyacım olan şey bu bulmak ve oldukça basit görünüyor ama üzerinde biraz yardıma ihtiyacım var
nonybrighto

github hakkında Decebal'a sorular sormaya çalışın. sana yardım edecek
Daniel Jipa

bkz meta.stackoverflow.com/questions/376686/... Decebals hesap durumuna burada
Wolfgang fahl

1
Eğer pf4j bakıyor, ayrıca bir göz sürebilir github.com/hank-cp/sbp . Tam bir web uygulaması oluşturmak için Spring Boot'u desteklemek için pf4j üzerine inşa edilmiştir.
Hank

13

OSGi üzerinde bir hafta çalıştım - yoğun, OSGi haftasından başka bir şey değil. Sonunda kötü bir rüya gibiydi ama çok şey öğrendim.

OSGi'yi çalıştırabildim (kolay değil, tüm örnekler güncel değil, internetteki her şey beş değilse en az üç yaşında), ancak mevcut sorunlar ile ilgili sorunlar nedeniyle mevcut bir projeye entegre edilmede ciddi sorun yaşadım kavanoz tezahür eder.

Kısacası, tezahürler oluşturmak için kullanılan sadece birkaç belirsiz araç vardır ve bunlar iyi belgelenmemiştir (BND Araçları pek belirsizdir, ancak Eclipse'de belirli bir süreç için tasarlanmıştır). Ayrıca, mevcut OSGi bilgilerinin çoğu mevcut bir masaüstü uygulamasına sahip uygulama geliştiricilerine yönelik değildir.

Bu, bilginin sisli veya uygunsuz olması için bağlamın çoğunu yapar. Neil Bartlett'in blog gönderileri en büyük yardımdı, ancak bunlar bile bir çalışma sistemi elde edemedi (Felix öğreticisinden bazı kodlar aldım ve gömülü çerçeve haddelemesi için bir araya getirdim). Kitap taslağını yıllar önce ücretsiz olarak yayınladığını gördüm, bu mükemmel, ancak Eclipse'deki örnekler Eclipse OSGi desteğindeki değişiklikler nedeniyle çalışmıyor.

Her adım büyük bir engeldir. Daha sonra burada daha fazla ayrıntı yayınlamaya çalışacağım.


17
Bu nasıl bir cevap? Daha çok OSGi hakkında bir rant ve OSGi'nin ne olduğunu bile açıklamıyorsunuz.
Gizli Rabbi

@StealthRabbi Bu "cevap" zamanında ve daha sonra bir süre için, vahşi doğada OSGi ile çalışmaya çalışan biri için iyi bir bilgiydi. OSGi zaten tartışmanın bir parçasıydı - bu yüzden onu tanımlamaya gerek yoktu. Bu, insanları bir haftalık işten kurtarmış olabileceğinin bir cevabıdır - SO'nun tüm nedeni.
Sean Anderson

9

Yukarıda belirtilen problemi çözmek için OSGi'yi tavsiye etmenin son derece zayıf bir tavsiye olduğunu düşünüyorum. OSGi "doğru seçim" dir, ancak yukarıdaki gibi bir senaryo için, ya JPF ya da ev yapımı minimalist bir çerçevenin yeterli olduğunu düşünüyorum.


3

Yıllar önce böyle bir projeye başladım ve umarım yakında hazır olacağım, NetBeans ve Eclipse gibi projelerden ilham aldım ama bu arada biraz farklı bir şeye dönüştü. OSGi şimdi iyi bir seçim gibi görünüyor, ancak projemle karşılaştırma şansım olmadı.Yukarıda belirtilen JPF ile benzer, ancak aynı zamanda birçok yönden farklı.

Beni motive eden temel fikir, web uygulamaları, masaüstü uygulamaları veya applet / JWS uygulamaları (tabii ki bu henüz kullanıcı arayüzünü kapsamıyor) arasında temel bir işlev olarak Java uygulaması oluşturmak için olabildiğince kolay olmaktır.

Projeyi aklımda birkaç hedefle inşa ettim:

  • Bir web uygulaması veya masaüstü uygulaması oluşturmanız önemli değildir, uygulamayı aynı şekilde başlatmanız gerekir, düz bir ana yöntem, Fantezi web.xml bildirimi (standart bir web tanımlayıcısına karşı değilim, ancak "sunucu uygulamaları" eklediğiniz bir eklenti sistemi ile iyi gitmiyor - Onlara RequestHandler (ler) - isteğinize göre dinamik diyorum).
  • bir "uzatma noktası" etrafında "uzantıları" takmak kolay - Eclipse bir şey ama farklı bir yaklaşım.
  • kendi kendine konuşlandırılabilir, çünkü tüm eklentiler kaydedildiğinden (XML dosyaları) uygulama, derleme sisteminden bağımsız olarak kendiliğinden konuşlandırılabilir olmalıdır - elbette bir Ant görevi ve bizim dünyamızla bağlantıları olan bir Maven MOJO var, ancak son olarak uygulamayı çağırır ve kendisini belirli bir konuma kendi kendine dağıtmasını söyler.
  • Maven'den ödünç alındığında, depolardan kod indirebilir (Maven 1 ve 2 depoları dahil), böylece uygulamanız depolara eriştiğiniz sürece tek bir küçük kavanoz olarak dağıtılabilir (bazen yararlıdır ve temel olarak bu güncellemeler - web uygulamanız tarafından daha yeni bir sürüm olduğu konusunda bilgilendirilme fikrini sevmiyor musunuz, indirildi ve sadece yüklemek için izniniz gerekiyor mu? Bunu sevdiğimi biliyorum).
  • sistem sağlığı ile ilgili temel uygulama izleme, arıza durumunda e-posta bildirimleri

2
Nag demek istemiyorum, ama o zamandan beri üzerinde çalıştın mı? Kod var mı (olduğu gibi kullanabilir veya ekleyebilir miyim)?
Piccolo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.