2

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

通常我不能这样做,因为我的观察maven-resources-plugin是在创建战争之前执行的。我虽然我会把这个插件放到test阶段。但是你有什么建议?哪个阶段对此有好处?怎么做?


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

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

2 回答 2

5

因为由父 POM 或生命周期规范定义的此插件的目标还有另一个执行。

检查mvn help:effective-pom你的项目目录,你会看到你的 POM 的实际样子。

听起来你假设插件执行是这样的:“这是我要执行插件的地方,并且只在这里”。

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

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

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

请注意,这不是您通常应该为resources插件做的事情,因为这可能会破坏您的构建。


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

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

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

具体来说,您可以做的是:

  1. 将项目分为两部分:一栋建筑JAR和一栋建筑WAR
  2. 创建将其他两个指定为modules的多模块项目。JAR项目应该在项目之后WAR您可以将多模块项目设置为其他两个的父项目,它将让您同步版本和其他配置。
  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>
    

    (另一种方法是将包指定为依赖项并使用程序集插件

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

您可以跳过多模块位,只需创建两个单独的项目。但是,在这种情况下,只要前者发生变化,您就需要在手动运行项目之前运行项目WARinstall目标。JARpackage

于 2013-09-06T21:44:40.930 回答
1

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

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

因此,您也可以在这里阅读

于 2013-09-06T21:43:10.177 回答