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 已经为您制作的那个有什么问题?
我正在写一个带参数的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 已经为您制作的那个有什么问题?