Maven 插件可以自动从“执行”部分查看“配置”标签吗?

Posted

技术标签:

【中文标题】Maven 插件可以自动从“执行”部分查看“配置”标签吗?【英文标题】:Can a Maven plugin see the "configuration" tag from an "execution" section automatically? 【发布时间】:2013-01-12 10:00:31 【问题描述】:

我正在分析一个 Maven 插件,我可以在 pluginconfiguration 部分中配置它:

<plugin>
     ...
     <executions>...</executions>
     <configuration>
         <!-- items placed here are visible to the MOJO -->
     </configuration>
</plugin>

该插件完全忽略execution 的任何配置项,但:

<plugin>
     ...
     <executions>
         <execution>
             <id>execution1</id>
             <phase>test</phase>
             <goals><goal>test</goal></goals>
             <configuration>
                <!-- items placed here are ignored -->
             </configuration>
         </execution>
     </executions>
</plugin>

我使用mvn test 运行 Maven。我确信执行会发生,因为 Maven 正确打印了它的 id,但未配置插件 - 打印有关当 &lt;configuration&gt; 部分移出 &lt;executions&gt; 时不存在的不正确设置的警告。

问题:是插件的实现方式,它只接受“***”配置吗?我研究了它的源代码,在我看来,它是 Maven 调用 MOJO 类上的设置器,并且它对于选项来自哪个部分的插件是透明的。

MOJO 注释为:

* @component
* @goal test
* @phase test
* @execute phase="jasmine-process-test-resources"

【问题讨论】:

您对二传手的看法是正确的。 Plexus 是 DI 框架。 Some more info on that. 但请注意,现在有一个用于进行注入的 java 注释方法。 执行的配置只适用于生命周期绑定的执行。你确定这是你正在调用的执行吗 @StephenConnolly 我猜...我已将 MOJO 配置添加到我的答案中。 @MaDa 没什么区别...(除了阶段是完整的罂粟鸡)我们需要在&lt;execution&gt; 中查看您的&lt;goals&gt; 并确保您指定一个CLI 上在您绑定到的阶段之后的阶段 【参考方案1】:

我在使用maven:3.6.3-jdk-8 docker 映像时遇到了基本maven-install-plugin:2.5.2 的问题。

感谢接受的答案让我走上正轨。

我不完全理解this note in the documentation(在本节末尾),但您似乎可以给阶段目标一个执行ID,强制它使用您的配置:

注意:元素内部的配置过去不同于外部的配置,因为它们不能从直接命令行调用中使用,因为它们仅在它们绑定到的生命周期阶段被调用时才应用。因此,您必须将配置部分移到执行部分之外,以将其全局应用于插件的所有调用。由于 Maven 3.3.1 不再是这种情况,因为您可以在命令行上指定直接插件目标调用的执行 ID。因此,如果您想从命令行运行上述插件并且它是特定的 execution1 的配置,您可以执行:

mvn myqyeryplugin:queryMojo@execution1

我最后的工作 docker 命令:

docker run -it --rm --name parser -v "$(shell pwd)":/usr/src/parser -w /usr/src/parser maven:3.6.3-jdk-8 mvn -X install:install-file@install-my-jar-file

install-my-jar-file 是我的处决 ID &lt;execution&gt;&lt;id&gt;install-my-jar-file&lt;/id&gt;...

【讨论】:

【参考方案2】:

有问题的插件正在分叉自定义生命周期。

分叉的自定义生命周期将删除指定 id (execution1) 的执行(因为它是一个分叉的生命周期)

因此,由分叉生命周期执行的任何插件目标都将丢失其配置。主要的 mojo 本身应该获取配置,但出了问题的是分叉的生命周期执行。

我猜它是哪个插件,如果我猜对了,那就是custom lifecycle,您看到的警告来自例如other mojos 与文字类似

javascript source folder was expected but was not found. Set configuration property
`jsSrcDir` to the directory containing your JavaScript sources. Skipping 
jasmine:resources processing.

在这种情况下,您需要将 &lt;configuration&gt; 部分放在外部块中,或者配置生命周期的执行。

为生命周期配置执行将需要使用魔术格式的ids 添加执行。我不能 100% 确定,但在您的情况下,您将使用 default-resourcesjasmine-lifecycle-resourcesids 定义额外的执行,以确保配置成功。

不那么冗长的方法是将配置放在外部并完成。

【讨论】:

谢谢。我仍然没有完全掌握分叉生命周期的概念,但是您将我推向了正确的方向。将配置放在外部不是一个选项,我需要使用不同的参数集进行多次执行。 @Mada 你最后做了什么?我也有同样的问题。我自己并没有掌握分叉生命周期的概念。我不明白有关使用“魔术 id”的一点点 这个问题是由 Jasmine(一个 JavaScript 库)的 Maven 插件触发的。在我提出这个问题后不久,我们决定放弃尝试使用 Java 管理 JS 应用程序,而采用 100% JavaScript 方法。

以上是关于Maven 插件可以自动从“执行”部分查看“配置”标签吗?的主要内容,如果未能解决你的问题,请参考以下文章

Jacoco Maven 插件 - 生命周期配置未涵盖插件执行

devops自动化部署maven执行报错

避免maven package 打包时执行 mybatis-generator-maven-plugin 插件

Maven学习之 插件plugin

Maven组件插件无法执行问题,怎么解决

maven-surefire-plugin,用于自动化测试和单元测试的