2016-11-23 3 views
0

Ich schreibe ein Maven-Plugin mit Parametern.Maven Plugin-Parameter nur in Ausführung verfügbar

Die Parameter werden richtig

initiiert
[DEBUG] Configuring mojo '...' with basic configurator --> 
[DEBUG] (f) includes = [subpackage] 
[DEBUG] (f) outputDirectory = /Users/username/dev/project/output 
[DEBUG] (f) sources = [/Users/username/dev/project/src/main/java/io/packagea, /Users/username/dev/project/src/main/java/io/packageb] 

die Parameter richtig in execute Verfahren initiiert, sind aber dann in null aufgerufenen Methoden: wirft Nullpointer. Wenn ich den Parameter des mojo geben als Parameter methodes aufgerufen, dann

Hier ein Beispiel Parameter:

@Parameter 
private String[] includes; 

ich nicht identifizieren, warum.

Der vollständige Code ist auf meinem GitHub Repo (auf Feature-Zweig): [Zweig als Antwort gelöscht ist klar, über den Ursprung des Problems]

Plugin kann mit mvn livingdoc:wordcloud an einem Projekt aufgerufen werden.

Der Plugin-Suchcode für @Wordcloud-Annotationen, aber kein Problem reproduzieren.

+0

Bitte machen Sie eine [mcve]. Warum meinst du "null" in aufgerufenen Methoden? – Tunaki

+0

Frage bearbeitet mit Link (musste Buggy-Zweig schieben). Es ist schwer, weniger Code zu reproduzieren – Javathought

Antwort

0

Ein Maven-Plugin wird durch eine Klasse repräsentiert, die die Mojo-Schnittstelle implementiert (normalerweise extends AbstractMojo). Es ist kommentiert und so, so dass Maven es erkennen kann, es instanziieren (eine neue Instanz erstellen) und es ausführen kann (rufen Sie die Methode execute auf). In Ihrem Fall sieht das etwa so aus:

@Mojo(name = "wordcloud") 
public class WordCloudMojo extends AbstractMojo { 

    @Parameter 
    private String[] includes; 

... 

Maven stellt sicher, dass Abhängigkeiten erfüllt sind, durch diesen in die neue Instanz der Klasse Injektion, zum Beispiel des includes Feld oben.

Wenn Sie eine andere neue und verschiedene Instanzen Ihrer Plugin-Klasse zu erstellen, Maven betrifft nicht selbst mit, dass und Abhängigkeiten nicht zufrieden sein. In Ihrem Fall, etwa so:

public void execute() { 
    final WordCloudMojo wordCloudMojo = new WordCloudMojo(); 
    Arrays.stream(includes).forEach(inc -> getLog().debug(inc)); 
    wordCloudMojo.scan(sources); 

Die stream(includes) wird immer noch die Maven-injizierten Abhängigkeit verwenden. Aber da Sie auf einer neuen Instanz von WordCloudMojo aufrufen, werden die Abhängigkeiten nicht erfüllt sein (das Feld wird wahrscheinlich null sein).

Dies würde das lösen:

final WordCloudMojo wordCloudMojo = new WordCloudMojo(); 
wordCloudMojo.includes = this.includes; 

Entschuldigung für eine Mutator-Methode nicht verwenden. Die this ist hier redundant, betone aber das Problem ein wenig.

Eine andere Lösung wäre: Erstellen Sie keine neue Instanz von WordCloudMojo? Was stimmt nicht mit dem, den Maven für dich gemacht hat?

+0

Danke, so offensichtlich. Aber ich wurde festgeklebt. – Javathought

+0

Danke, so offensichtlich, jetzt. Aber ich wurde auf die NPE geklebt.(); Ich werde die neue Instanz unterdrücken. Der Basiscode war kein Maven-Plugin und daher gab es eine Instanzerstellung, da sie an keiner anderen Stelle instanziiert wurde. Die erste Version war also "ok", da ich in den Methoden keine Parameter brauchte und diese fehlerhafte Instanziierung ohne Probleme behielt. Hinzufügen von Parametern, ich habe diesen Teil bei der Analyse des Problems verfehlt.(); Manchmal konzentrierst du dich auf etwas, das du offensichtlich vermisst. – Javathought

Verwandte Themen