maven-resources-plugin设置为不同阶段

时间:2013-09-06 21:31:41

标签: java maven

我正试图强制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


我仍然没有得到它。我将描述我的问题的根本原因。我有这个任务:

  1. maven-war-plugin生成WAR文件(@ phase <phase>compile</phase>
  2. maven-resources-plugin 我想强行执行
  3. checksum-maven-plugin为我生成校验和文件(@ phase <phase>package</phase>)。
  4. 通常情况下,我不能这样做,因为我的观察maven-resources-plugin形成于我的战争创建之前。我虽然将这个插件放到test阶段。但你有什么建议?哪个阶段对此有利?怎么做?


    潜在的问题描述。我想提供两个文件作为应用程序:

    • WAR文件。
    • 用于部署的JAR,在部署之前通过校验和验证WAR文件。

2 个答案:

答案 0 :(得分:4)

因为父POM或生命周期规范定义了a goal for this plugin的另一个执行。

检查项目目录中的mvn help:effective-pom,您将看到POM的实际情况。

听起来你假设插件执行的效果如下:“这是我想要执行插件的地方,而这里只是”。

然而,它实际上更像是这样:“我正在定义此执行。此执行将在以下阶段完成,然后在此配置下执行这些插件目标。哦,这是一个ID执行,因为你说你需要它“。

换句话说:插件执行不是插件独有的,甚至不是插件目标

然而,正如rec正确指出的那样,您可以通过指定您自己的具有相同ID的执行来覆盖父POM设置的插件执行设置。再次检查有效POM以查找这些ID。目前,对于Maven 3,{JAR打包类型中resources插件有两个“预定义”执行:default-resourcesdefault-testResources

请注意,这不是您通常应该为resources插件执行的操作,因为这可能会破坏您的构建。


编辑:在你的情况下,很明显你有两个项目部分:

  • 包含一些应用程序的WAR,
  • 将WAR部署到某个容器的JAR。

Maven与make(在我的理解中)的不同之处在于它解耦了工件的构建过程。换句话说,您应该创建两个项目:一个包含WAR包装,另一个包含JAR包装。后者应将WAR包复制到其JAR中。最重要的是所谓的multi-module project

具体而言,您可以做的是:

  1. 将项目分为两个:构建JAR的项目和构建WAR的项目。
  2. 创建多模块项目,将另外两个项目指定为modules。在JAR项目之后,WAR项目应 。您可以将多模块项目as a parent设置为另外两个,它将允许您同步版本和其他配置。
  3. 在您的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

  4. 使用install目标运行多模块项目的构建。您需要install,因为它可以确保最新版本的WAR项目能够进入您的本地m2存储库,以便JAR项目可以接收。

  5. 您可以跳过多模块位,只需创建两个单独的项目。但是,在这种情况下,只要前者发生更改,您就需要在WAR项目的install之前手动运行JAR项目的package目标。

答案 1 :(得分:1)

您正在谈论两个不同的目标:copy-resourcesresources。对于大多数包装类型,后者绑定到process-resources阶段。那就是你在日志中看到的那个。 要在copy-resources阶段执行test,还要添加

<goals>
  <goal>copy-resources</goal>
</goals>

因此,您也可以阅读here