2017-08-03 13 views
1

Also habe ich irgendeine Art von Plugins API für ein Java-Projekt gemacht (um JAR-Dateien extern zu laden) und gut, ich wollte in der Lage sein, jedes Guice-Modul innerhalb eines Plugins zum Abhängigkeitsgraphen meines Projekts hinzuzufügen .SPI mit Guice Fehler

Was ich getan habe, war ein PluginsModule und in der configure-Methode für andere Module in Plugins suchen und installieren Sie sie mit Java ServiceLoader.

Ich habe ein Test-Plugin erstellt und ein Modul dafür erstellt, ich habe bestätigt, dass es installiert wurde. Keine Probleme an dieser Stelle. Die Probleme tauchen auf, wenn ich etwas innerhalb dieses Moduls mache, zum Beispiel habe ich eine Schnittstelle an eine Implementierung in diesem Plugin gebunden (um das zu klären, habe ich dasselbe ohne das Plugin getan und es hat so funktioniert, dass es kein bindendes Problem ist) und versucht um es zu injizieren, erscheinen Konfigurationsfehler, die besagen, dass für diese Schnittstelle keine Implementierung angezeigt wurde.

public enum StandardGuiceModuleScanningStrategy implements GuiceModuleScanningStrategy { 
INSTANCE; 

@Override 
public Set<Module> scan(Path directory) throws IOException { 
    File directoryAsFile = directory.toFile(); 
    File[] childrenFiles = directoryAsFile.listFiles(); 

    if (!directoryAsFile.isDirectory() 
      || childrenFiles == null 
      || childrenFiles.length == 0) { 
     return Collections.emptySet(); 
    } 

    Set<Module> modules = new HashSet<>(); 

    for (File childrenFile : childrenFiles) { 
     ClassLoader directoryClassLoader = new URLClassLoader(
       new URL[]{childrenFile.toURI().toURL()}); 
     ServiceLoader<Module> moduleServiceLoader = ServiceLoader.load(
       Module.class, directoryClassLoader); 

     moduleServiceLoader.forEach(modules::add); 
    } 

    return modules; 
} 

In dieser Umsetzung meiner GuiceModuleScanningStrategy, wie ich schon erwähnt, habe ich ServiceLoader verwenden. Wie auch immer, ich habe auch andere Sachen ausprobiert, zum Beispiel die JAR-Datei zu scannen und nach einem Modul zu suchen und zu sehen, ob es eine bestimmte Anmerkung hat.

Antwort

0

Alle Guice-Module, die mit @GuiceModule kommentiert sind, werden in einem Kind-Injektor installiert. Alle mit @AutoBind annotierten Klassen sind an alle geerbten Schnittstellen gebunden. Sie können es auch benennen, was zu einer benannten Bindung führen und die Schnittstellen überschreiben würde, die verwendet werden sollten. Und wenn Sie nicht alle Funktionen verwenden möchten, überschreiben Sie einfach das StartupModule und binden nur die gewünschten Funktionen oder Ihre eigenen.

+0

Ich denke, ich war nicht genug über alles informiert, was Guice tun kann, haha. Danke trotzdem, aber ähm, könntest du mir bitte sagen, wie würde @GuiceModule mit Kinderinjektoren arbeiten? –

+0

Sie müssen Classpath-Scanner-Implementierungen erstellen, die Reine Java-Klassen und ASM Reflections verwendet, die Javassit (unterstützt paralleles Scannen!) Sonatype-Extension – Tehmina

+0

Hmm, ich werde das versuchen. Aber ähm, warum würde mir in diesem Fall ein Kinderinjektor helfen? –