gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:48:07 28 4
gpt4 key购买 nike

我试图强制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在创建我的 war 之前执行。我虽然会把这个插件放到 test阶段。但是你有什么建议呢?哪个阶段对此有好处?如何做到这一点?


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

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

最佳答案

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

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

听起来您假设插件执行是这样工作的:“这是我想执行插件的地方,而且只在此处”。

然而,它实际上更像是这样工作的:“我正在定义这个执行。这个执行是为接下来的阶段做的,然后执行这个配置下的这些插件目标。哦,这是一个ID执行,因为你说你需要它。

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

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

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


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

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

Maven 与 make 的不同之处(在我看来)是它解耦了 Artifact 的构建过程。换句话说,您应该创建两个项目:一个带有 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 项目能够拿起。

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

关于java - maven-resources-plugin 设置为不同阶段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18666886/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com