Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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.
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.
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?
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.
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]
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.
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.