[英]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.