# ServiceProvider in Eclipse



## Kevin94 (15. Jun 2012)

Wie die Überschrift schon sagt: Ich nutze Eclipse und möchte, dass die ServiceProvider-Implementierungen in meinem Projekt zu Laufzeit bekannt sind. Das geht aber bekanntlich nur wenn die .class Dateien in einer .jar mit entsprechendem Eintrag im META-INF Verzeichnis liegen. Wie kann ich das bewerkstelligen, sodass ich das Projekt immer noch debuggen kann und ohne dass ich die ServicProvider-Implementationen in ein extra Projekt verschieben muss, um das dann als jar einzubinden, bzw. das ganze Projekt exportieren muss.


----------



## Marco13 (16. Jun 2012)

Es reicht doch das zweite Projekt auch offen zu haben und zum Build Path des ersten hinzuzufügen...


----------



## Kevin94 (16. Jun 2012)

Es gibt ja eben (noch) kein zweites Projekt. Dass wäre wohl die komfortabelste Notlösung die mir eingefallen ist, die ServiceProvider Implementationen in ein zweites Projekt auslagern und nur dass dann exportieren und als Lib einbinden. Ich dachte halt, dass es da eine komfortablere Lösung gibt. In Netbeans wird ja afaik bei jedem Start ein .jar erstellt, dachte sowas geht in Eclipse auch.


----------



## Marco13 (17. Jun 2012)

Man braucht das zweite Projekt nicht zu exportieren und als JAR einzubinden.


----------



## Kevin94 (17. Jun 2012)

Und wie krieg ich es dann her, dass die Klassen als ServiceProvider erkannt werden? Funktioniert es wenn ich im Projekt einen META-INF Ordner mit den entsprechenden Einträgen wie bei einem .jar File erstelle?


----------



## Ullenboom (17. Jun 2012)

Ja, die META-INF/services/* in das  Jar, das reicht. Wenn der ServiceLoader angeschmissen wird, durchsucht er den ganzen Klassenpfad nach genau diesem Verzeichnis. So funktionieren auch moderne Datenbanktreiber.


----------



## Kevin94 (17. Jun 2012)

Die Frage war ob es reicht, wenn ich in Eclipse *wie normalerweise in einem .jar* den META-Inf Ordner anlegen und dann das *Projekt* einbinde. Das es funktioniert, wenn ich's als .jar hinzufüge ist klar, das ist die normaler Vorgehensweise, wenn das das Problem wäre würde ich die Frage ja wohl kaum ins IDE-Forum stellen.

[EDIT]Es funktioniert tatsächlich, dass es den ServiceProvider findet, wenn man im src Verzeichniss genauso wie in einem .jar den META-INF Ordner anlegt. Danke Marco.[/EDIT]


----------



## Ullenboom (17. Jun 2012)

Ja und die Erklärung sagt, warum das so ist: Wegen dem Klassenlader. In einem Eclipse-Projekt bekommt der Klassenlader direkt die Klassen aus dem Pfad, sonst aus dem Jar.


----------



## Galaktos (6. Jul 2012)

Bin über Google über das Thema hier gestoßen und weil für mich aus den obigen Antworten noch nicht direkt ersichtlich war, wie die Projekte organisiert sein müssen (erforderte noch ca. 15 Minuten rumprobieren), dachte ich, ich schreibe das einfach mal für andere Suchende hier noch einmal klipp und klar hin:

Zwei Projekte (ich nenne sie mal PluginLoader und Plugin)
PluginLoader enthält die Service-Definition (Interface oder abstrakte Klasse) und verwendet den ServiceLoader
Plugin enthält eine Klasse, die den Service implementiert
Plugin ist im Build Path von PluginLoader enthalten
Plugin muss auch Zugriff auf die Klassen von PluginLoader haben. Da ein zirkulärer Build Path nicht erlaubt ist, fügen wir nicht das _Projekt_ PluginLoader, sondern seinen /bin/-Ordner zum Build Path von Plugin hinzu (Libraries - Add Class Folder)
Plugin/src enthält einen /META-INF/services/-Ordner mit den von ServiceLoader benötigten Dateien.


----------



## Bartertown (29. Jul 2014)

Hallo,

Ich will gerade den Service Provider so organisieren, wie Galaktos beschrieben hat, aber ich komme da nicht weiter - auch nicht per Anhalter...

Also


Das PLUGIN_LOADER hat im buildpath das *Projekt* PLUGIN

Das PLUGIN hat im buildpath den classfolder  von PLUGIN_LOADER

Das Verzeichnis von PLUGIN/src sieht so aus:

PLUGIN
•src
•mypackage​•META-INF
•services
servicepackage.IPlugin​



Bei meiner Anwendung wird das Plugin nicht erkannt, was habe ich falsch gemacht ?


----------



## dzim (30. Jul 2014)

AFAIK gehört das META-INF nicht in das src-Verzeichnis, sondern eine ebene drüber.


----------



## Bartertown (30. Jul 2014)

Ich hätte es jetzt, das META-INF ist im *bin *Verzeichnis.

PLUGIN
•bin•mypackage​•META-INF
•services
servicepackage.IPlugin​•src
•mypackage​
TX


----------

