[英]maven plugin parameter only available in execute
我正在編寫帶有參數的Maven插件。
參數已正確啟動
[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]
參數在方法execute
中正確初始化,但在被調用的方法中為null
:引發NullPointerException。 如果我將mojo的參數作為參數傳遞給被調用的方法,則
這里是一個示例參數:
@Parameter
private String[] includes;
我不知道為什么。
完整的代碼在我的github repo上(在功能分支上):[ 刪除分支,因為答案在問題的根源上是明確的 ]
可以在項目上使用mvn livingdoc:wordcloud
調用該插件。
插件瀏覽@Wordcloud批注的代碼,但無需重現問題。
一個Maven插件由實現Mojo
接口的類表示(通常extends AbstractMojo
)。 它帶有這樣的注釋,以便Maven可以識別它,實例化它(創建一個新實例)並執行它(調用execute
方法)。 您的情況如下所示:
@Mojo(name = "wordcloud")
public class WordCloudMojo extends AbstractMojo {
@Parameter
private String[] includes;
...
Maven通過將依賴項注入到類的新實例中來確保滿足依賴關系,例如,上面的includes
字段。
如果您創建插件類的任何其他新實例和其他實例,則Maven不會對此進行關注,並且將無法滿足依賴關系。 在您的情況下,如下所示:
public void execute() {
final WordCloudMojo wordCloudMojo = new WordCloudMojo();
Arrays.stream(includes).forEach(inc -> getLog().debug(inc));
wordCloudMojo.scan(sources);
該stream(includes)
仍將使用Maven注入的依賴項。 但是,由於您對WordCloudMojo
的新實例調用了scan
,因此將無法滿足依賴關系(該字段可能為null
)。
這樣可以解決:
final WordCloudMojo wordCloudMojo = new WordCloudMojo();
wordCloudMojo.includes = this.includes;
對不起,我沒有使用mutator方法。 this
在這里是多余的,但要強調一點問題。
另一個解決方案是:不創建WordCloudMojo
的新實例? Maven已經為您制作的那是什么問題?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.