maven 插件参数仅在执行时可用

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 存储库中(在功能分支上):[分支已删除,因为答案清楚地说明了问题的根源]

插件可以在项目中用 mvn livingdoc:wordcloud 调用。

@Wordcloud 批注的插件浏览代码,但无需重现问题。

Maven 插件由实现 Mojo 接口(通常为 extends AbstractMojo)的 class 表示。它被注释等,以便 Maven 可以识别它,实例化它(创建一个新实例)并执行它(调用 execute 方法)。在您的情况下,这看起来像这样:

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

    @Parameter
    private String[] includes;

...

Maven 通过将这些注入到 class 的新实例中来确保满足依赖关系,例如上面的 includes 字段。

如果您创建任何其他新的和 不同的 插件实例 class,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;

请原谅我没有使用增变器方法。 this 在这里是多余的,但稍微强调一下问题。

另一种解决方案是:不要创建 WordCloudMojo 的新实例? Maven 已经为您制作的那个有什么问题?