Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java maven资源插件设置为不同的阶段_Java_Maven - Fatal编程技术网

Java maven资源插件设置为不同的阶段

Java maven资源插件设置为不同的阶段,java,maven,Java,Maven,我试图强制maven resources插件在不同阶段执行,如下所示: <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.6</version> <executions> <e

我试图强制maven resources插件在不同阶段执行,如下所示:

<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>
            ...
为什么会这样? 我基于上述文件:

我还是不明白。我将描述问题的根本原因。我有以下任务:

maven war插件在编译阶段生成me war文件 maven资源插件我想在这里强制执行 checksummaven插件为我生成了一个checksum文件@phase包。 通常我不能这么做,因为我的观察maven资源插件是在创建war之前执行的。我想我会把这个插件放到测试阶段。但是你有什么建议?哪一个阶段对这有好处?怎么做

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

战争档案。 用于部署的JAR,它在部署之前通过校验和验证WAR文件。
您谈论的是两个不同的目标:复制资源和资源。对于大多数打包类型,后者绑定到流程资源阶段。这就是你在日志中看到的。 要在测试阶段执行复制资源,还需要添加

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

因此,您也可以阅读它

您谈论的是两个不同的目标:复制资源和资源。对于大多数打包类型,后者绑定到流程资源阶段。这就是你在日志中看到的。 要在测试阶段执行复制资源,还需要添加

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

因此,您也可以阅读它,因为父POM或生命周期规范定义了另一个执行

查看项目目录中的mvn help:effectivePOM,您将看到pom的实际外观

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

然而,它实际上是这样工作的:我正在定义这个执行。此执行将在下一阶段完成,然后在此配置下执行这些插件目标。哦,这是执行死刑的身份证,因为你说你需要它

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

但是,正如正确指出的,您可以通过使用相同的ID指定自己的执行来覆盖父POM设置的插件执行设置。再次检查有效的POM以查找这些ID。目前,对于Maven 3,在JAR打包类型中,资源插件有两个预定义的执行:default resources和default testResources

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

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

一场包含一些应用程序的战争, 将战争部署到某个容器的JAR。 Maven与make的不同之处在于,我的理解是它将工件的构建过程解耦。换句话说,您应该创建两个项目:一个带有WAR包,另一个带有JAR包。后者应该将WAR包复制到它的JAR中。除此之外,还有一种被称为

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

将项目分为两部分:一部分构建JAR,另一部分构建WAR。 创建将其他两个指定为的多模块项目。JAR项目应该是战后项目。您可以将多模块项目设置为其他两个,它将允许您同步版本和其他配置。 在JAR项目中,添加一个插件目标执行,将WAR复制到包中。您可以为此使用目标,例如:

<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>
另一种方法是将包指定为依赖项,然后

使用安装目标运行多模块项目的生成。您需要安装,因为它可以确保WAR项目的最新版本能够进入您的本地m2存储库,以便JAR项目能够使用


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

因为父POM或生命周期规范定义了另一个执行

查看项目目录中的mvn help:effectivePOM,您将看到pom的实际外观

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

然而,它实际上是这样工作的:我正在定义这个执行。此执行将在下一阶段完成,然后在此配置下执行这些插件目标。哦,这是执行死刑的身份证,因为你说你需要它

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

但是,正如正确指出的,您可以覆盖 由父POM通过使用相同ID指定您自己的执行来设置插件执行。再次检查有效POM以查找这些ID。目前,对于Maven 3,在JAR打包类型中,资源插件有两个预定义的执行:default resources和default testResources

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

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

一场包含一些应用程序的战争, 将战争部署到某个容器的JAR。 Maven与make的不同之处在于,我的理解是它将工件的构建过程解耦。换句话说,您应该创建两个项目:一个带有WAR包,另一个带有JAR包。后者应该将WAR包复制到它的JAR中。除此之外,还有一种被称为

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

将项目分为两部分:一部分构建JAR,另一部分构建WAR。 创建将其他两个指定为的多模块项目。JAR项目应该是战后项目。您可以将多模块项目设置为其他两个,它将允许您同步版本和其他配置。 在JAR项目中,添加一个插件目标执行,将WAR复制到包中。您可以为此使用目标,例如:

<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>
另一种方法是将包指定为依赖项,然后

使用安装目标运行多模块项目的生成。您需要安装,因为它可以确保WAR项目的最新版本能够进入您的本地m2存储库,以便JAR项目能够使用


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

您没有提到关键点:如果您知道ID,那么您可以在相同ID下重新定义执行,基本上覆盖以前的或默认定义。@rec:Arrgh,你说得对。在我认为OP理解的内容中,我极力淡化id的重要性,我完全忽略了这一点,OP需要这一点。我会把它编辑成答案,谢谢。所以id有特殊的意义。我之所以把它放在这里,是因为我在网上看到了这个例子:。@flyer:是的,不过请注意,在这个例子中,您定义了一个新的执行,您没有覆盖任何内容,至少没有覆盖打包配置中的任何内容。我想我是通过GNU make experience过滤Maven机制的。也许我应该设置一些依赖项,而不是重新定义阶段?你没有提到关键点:如果你知道ID,那么你可以在相同ID下重新定义执行,基本上覆盖了以前的或默认的定义。@rec:Arrgh,你是对的。在我认为OP理解的内容中,我极力淡化id的重要性,我完全忽略了这一点,OP需要这一点。我会把它编辑成答案,谢谢。所以id有特殊的意义。我之所以把它放在这里,是因为我在网上看到了这个例子:。@flyer:是的,不过请注意,在这个例子中,您定义了一个新的执行,您没有覆盖任何内容,至少没有覆盖打包配置中的任何内容。我想我是通过GNU make experience过滤Maven机制的。也许我应该设置一些依赖项,而不是重新定义阶段?根据我的观察,maven resources插件是在“编译”之前执行的。会是这样吗?你为什么要引用参考资料?你必须理解插件和目标之间的区别:插件是目标的集合,它们彼此属于。maven资源插件有3个目标:资源、测试资源和复制资源。还有一个帮助目标。你不能将插件绑定到一个阶段,只能绑定到一个目标。资源目标绑定到流程资源阶段,即编译阶段之前。是的!你能读懂我的心思,还是确切地说,我认为该阶段会在其他阶段之间的某个时间点生成目标……对于每种包装类型jar、war、ear,预定义的目标集都绑定到某些阶段。由开发人员将更多目标绑定到阶段。为此,在pom的plugins部分添加一个插件,并定义应该执行的目标。现在重要的部分是:一些目标配置了默认阶段。如果你喜欢这个阶段,就让它这样吧。在所有其他情况下,指定需要执行此目标的阶段。根据我的观察,maven resources插件在“编译”之前执行。会是这样吗?你为什么要引用参考资料?你必须理解插件和目标之间的区别:插件是目标的集合,它们彼此属于。maven资源插件有3个目标:资源、测试资源和复制资源。还有一个帮助目标。你不能将插件绑定到一个阶段,只能绑定到一个目标。资源目标绑定到流程资源阶段,该阶段
在编译阶段之前。是的!你能读懂我的心思,还是确切地说,我认为该阶段会在其他阶段之间的某个时间点生成目标……对于每种包装类型jar、war、ear,预定义的目标集都绑定到某些阶段。由开发人员将更多目标绑定到阶段。为此,在pom的plugins部分添加一个插件,并定义应该执行的目标。现在重要的部分是:一些目标配置了默认阶段。如果你喜欢这个阶段,就让它这样吧。在所有其他情况下,指定需要执行此目标的阶段。关于您的编辑,正如我在回答中所指定的,没有强制插件这样的事情。给定插件的给定目标(每个插件可以有多个目标)可以在构建中多次执行,每个目标都有一个独立的配置。目标的一个例子是maven resources插件:resources,这意味着maven resources插件中的资源目标。正如我所说,重新排列默认值可能会破坏您的构建。你想完成什么?我有两个由Maven创建的目标文件。一个是战争,一个是部署战争的JAR。我尝试向JAR文件添加一些校验和文件,以便稍后在执行时验证WAR。JAR中是否包含WAR?maven WAR插件在target dir中生成我的WAR。不知道如何将其添加到JAR。如果可以解决我的问题,我会跳过校验和计算。关于你的编辑,正如我在回答中指定的,没有强迫插件这样的事情。给定插件的给定目标(每个插件可以有多个目标)可以在构建中多次执行,每个目标都有一个独立的配置。目标的一个例子是maven resources插件:resources,这意味着maven resources插件中的资源目标。正如我所说,重新排列默认值可能会破坏您的构建。你想完成什么?我有两个由Maven创建的目标文件。一个是战争,一个是部署战争的JAR。我尝试向JAR文件添加一些校验和文件,以便稍后在执行时验证WAR。JAR中是否包含WAR?maven WAR插件在target dir中生成我的WAR。不知道如何将其添加到JAR。如果能解决我的问题,我会跳过校验和计算。