我正试图强制maven-resources-plugin
执行不同的阶段,如下所示:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>test</phase>
...
我在日志中看到,plugin
首先在maven-compiler-plugin:2.3.2:compile
:
[INFO] --- maven-resources-plugin:2.6:resources (default-resources)
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
为什么会这样? (我基于此文件:http://maven.apache.org/plugins/maven-resources-plugin/examples/copy-resources.html)
我仍然没有得到它。我将描述我的问题的根本原因。我有这个任务:
maven-war-plugin
生成WAR文件(@ phase <phase>compile</phase>
)maven-resources-plugin
我想强行执行 checksum-maven-plugin
为我生成校验和文件(@ phase <phase>package</phase>
)。通常情况下,我不能这样做,因为我的观察maven-resources-plugin
形成于我的战争创建之前。我虽然将这个插件放到test
阶段。但你有什么建议?哪个阶段对此有利?怎么做?
潜在的问题描述。我想提供两个文件作为应用程序:
答案 0 :(得分:4)
因为父POM或生命周期规范定义了a goal for this plugin的另一个执行。
检查项目目录中的mvn help:effective-pom
,您将看到POM的实际情况。
听起来你假设插件执行的效果如下:“这是我想要执行插件的地方,而这里只是”。
然而,它实际上更像是这样:“我正在定义此执行。此执行将在以下阶段完成,然后在此配置下执行这些插件目标。哦,这是一个ID执行,因为你说你需要它“。
换句话说:插件执行不是插件独有的,甚至不是插件目标。
然而,正如rec正确指出的那样,您可以通过指定您自己的具有相同ID的执行来覆盖父POM设置的插件执行设置。再次检查有效POM以查找这些ID。目前,对于Maven 3,{JAR打包类型中resources
插件有两个“预定义”执行:default-resources
和default-testResources
。
请注意,这不是您通常应该为resources
插件执行的操作,因为这可能会破坏您的构建。
编辑:在你的情况下,很明显你有两个项目部分:
Maven与make
(在我的理解中)的不同之处在于它解耦了工件的构建过程。换句话说,您应该创建两个项目:一个包含WAR
包装,另一个包含JAR
包装。后者应将WAR
包复制到其JAR
中。最重要的是所谓的multi-module project。
具体而言,您可以做的是:
JAR
的项目和构建WAR
的项目。JAR
项目之后,WAR
项目应 。您可以将多模块项目as a parent设置为另外两个,它将允许您同步版本和其他配置。在您的JAR
项目中,添加一个插件目标执行,将WAR
复制到您的包中。您可以使用dependency:copy
目标,例如:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.8</version>
<executions>
<execution>
<id>copy-war</id>
<phase>generate-resources</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>[your-war-group-id]</groupId>
<artifactId>[your-war-artifact-id]</artifactId>
<version>${project.version}</version>
<type>war</type>
<overWrite>true</overWrite>
<outputDirectory>${basedir}/src/main/resources</outputDirectory>
<destFileName>install.war</destFileName>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
(另一种方法是将包指定为依赖项并use the assembly plugin)
使用install
目标运行多模块项目的构建。您需要install
,因为它可以确保最新版本的WAR
项目能够进入您的本地m2存储库,以便JAR
项目可以接收。
您可以跳过多模块位,只需创建两个单独的项目。但是,在这种情况下,只要前者发生更改,您就需要在WAR
项目的install
之前手动运行JAR
项目的package
目标。
答案 1 :(得分:1)
您正在谈论两个不同的目标:copy-resources
和resources
。对于大多数包装类型,后者绑定到process-resources
阶段。那就是你在日志中看到的那个。
要在copy-resources
阶段执行test
,还要添加
<goals>
<goal>copy-resources</goal>
</goals>
因此,您也可以阅读here