Java maven资源插件设置为不同的阶段
我试图强制maven resources插件在不同阶段执行,如下所示: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
<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。如果能解决我的问题,我会跳过校验和计算。