2017-06-03 2 views
1

Ich möchte ServiceLoader zwischen verschiedenen Modulen in einem Maven-Projekt verwenden. Ich habe ein Elternmodul namens iMage. Im übergeordneten Modul gibt es ein Modul mit dem Namen jmjrst.main und es hat eine öffentliche abstrakte Klasse namens 'JmjrstPlugin'.ServiceLoader und META-INF/Dienste Generator zwischen verschiedenen Modulen in Maven?

Dann gibt es ein weiteres Modul namens prizm-plugin mit folgender Klasse: public class HelloWorldPlugin erweitert JmjrstPlugin {...}. Ich habe jmjrst.main als Abhängigkeit zu prizm-plugin und umgekehrt hinzugefügt.

Um ServiceLoader zu verwenden, wollte ich META-INF/services generator verwenden. Ich fügte hinzu, die auf die pom.xml von prizm-Plugin folgende Zeile:

<dependency> 
    <groupId>org.kohsuke.metainf-services</groupId> 
    <artifactId>metainf-services</artifactId> 
    <version>1.1</version> 
    <optional>true</optional> 
</dependency> 

und die Klasse HelloWorldPlugin beginnt wie folgt aus:

@MetaInfServices(JmjrstPlugin.class) 
public class HelloWorldPlugin extends JmjrstPlugin{ ... } 

Auf der Website auf META-INF/services generator geht: „Wenn Sie javac verwenden In JavaSE6 werden META-INF/services/* -Dateien automatisch generiert. Es sind keine zusätzlichen Compiler-Switches erforderlich. Diese Bibliothek behandelt auch die inkrementelle Kompilierung korrekt. "

Bei mir wird nichts generiert. Kann mir jemand dabei helfen?

Antwort

0

Aus dem Code-Snippet Ihrer Klasse HelloWorldPlugin ist nicht klar, welche Schnittstelle "der Vertrag" ist. Und in der Verknüpfung, die Sie gaben:

Wenn Sie mehrere Schnittstellen und/oder Basistyp haben, kann die Bibliothek den Vertragstyp nicht ableiten. In einem solchen Fall geben explizit die Vertragsart, indem es @MetaInfServices geben ..

Also zunächst einmal Sie sicher sein, welche Vertrag, den Sie wollen dann mehrere erfüllen und wenn die übergeordnete Klasse (n) implementieren Sie müssen explizit angeben, welche in der @MetaInfServices Annotation.

Das ist die erste Sache zu überprüfen, denke ich.

+0

da ist nur ein Basistyp drin. aber ich habe es so versucht: @MetaInfServices (JmjrstPlugin.class) öffentliche Klasse HelloWorldPlugin erweitert JmjrstPlugin {...} noch jetzt Erfolg –

Verwandte Themen