2017-05-02 2 views
1

Ich erstelle ein benutzerdefiniertes Maven-Plugin. In einem seiner Mojos, lese ich ein Xpp3Dom Objekt aus XML-Datei folgenden Code Stückes:Holen Sie sich den Verzeichnispfad des Maven-Plugins in seinem eigenen Mojo

File pluginsFile = new File(
     "absolute-path-to-file/plugins.xml"); 
Xpp3Dom Xpp3DomObject = new Xpp3Dom("plugins"); 
try { 
    FileReader reader = new FileReader(pluginsFile); 
    Xpp3DomObject = Xpp3DomBuilder.build(reader); 
    reader.close(); 
} catch (Exception e) { 
    // TODO throw exception 
} 

Die XML-Datei, aus der ich gelesen bin (plugins.xml) in src/main/resources des Maven gespeichert Plugin selbst. Meine Frage ist, wie kann ich auf diese XML-Datei zeigen, ohne explizit den absoluten Pfad zu dieser Datei anzugeben?

Um es klar zu stellen: Ich möchte, dass diese Datei im Verzeichnis meines Maven Plugins ist. Es kann nicht außerhalb des Maven-Plugins sein, da es ein notwendiger Teil des Maven-Plugins ist und nicht von anderen Maven-Projekten geändert werden sollte, die dieses Plugin benutzen.

Ich habe nach einer Variable/Methode in Maven Mojo gesucht, die mir die absolute Position des Maven-Plugins selbst geben würde. Wenn ich das bekomme, kann ich den Ort einfach als value-of-that-variable/src/main/resources/plugins.xml angeben. Aber ich kann eine solche Variable nicht finden. Ich habe auch versucht für eine Möglichkeit, Eigenschaften von Maven Plugin POM zu einem seiner Mojos zu übergeben, so dass ich project.build.directory übergeben kann, aber keinen Weg finden kann.

Um klar zu sein: Ich möchte auf eine Datei zugreifen, die unter dem Maven Plugin-Verzeichnis ist, in einem seiner Mojos.

Alle Vorschläge helfen.

Antwort

2

Ich denke, die einfachste Form, einige der eigenen Plugin-Ressourcen-Dateien zu lesen, ist über die getResourceAsStream() API, weil früher oder später wird Ihr Plugin als JAR geliefert werden, und dann src Verzeichnis wird verschwinden und es wird nur bleiben classpath Ressourcen:

try (InputStream input=getClass().getClassLoader().getResourceAsStream("plugins.xml")){ 
    try(Reader reader=new InputStreamReader(input)); 
    { 
     Xpp3Dom Xpp3DomObject = Xpp3DomBuilder.build(input); 
    } catch (Exception e) { 
     ... 
    } 
} 

Wie auch immer, auf diese Weise besteht die Gefahr, dass einige andere JAR des classpath eine plugins.xml Datei zufällig enthalten sollen. Um zu vermeiden (oder zumindest zu reduzieren), dieses Risiko, sollten Sie Paket es:

src\ 
    main\ 
     resources\ 
      foo\ 
       bar\ 
        MyMojo.java 
        plugins.xml 

... und in diesem Fall müssen Sie es durch getClass().getResourceAsInputStream() lesen.

+0

Das hat funktioniert! Ich hatte 'getClassLoader(). GetResource (" fileName ")' versucht und direkt diese Ressource-Datei in 'Xpp3DomBuilder.build()' als Eingabe verwendet. Aber ich habe eine Fehlermeldung erhalten, dass 'absoluter Pfad zu Plugin-jar/jarName!/FileName' nicht existiert. Die Verwendung von 'getResourceAsStream' und das Speichern in einer temporären Datei unter Verwendung von 'OutputStream' und die Verwendung dieser Datei funktionierten jedoch. Irgendeine Idee, warum es direkt verwendet hat, hat nicht funktioniert? –

+0

Und nur um für irgendjemand anderen zu verdeutlichen, 'Xpp3DomBuilder.build (input)' funktioniert nicht. Die Eingabe muss eine Datei sein. –

+1

Warum hat es nicht direkt funktioniert? Ich nehme an, Sie haben versucht, eine 'Datei' zu erstellen, indem Sie die URL verwenden, die von' getResource' zurückgegeben wird. Dies sind inkompatible Typen. Deshalb empfehle ich Ihnen, 'getResourceAsStream' zu verwenden, das einen' InputStream' zurückgibt, so dass Sie die 'File' API vermeiden können. –

Verwandte Themen