如何使用不同的属性两次执行 Maven 插件

Posted

技术标签:

【中文标题】如何使用不同的属性两次执行 Maven 插件【英文标题】:How to execute a maven plugin twice with different property 【发布时间】:2016-03-15 08:59:22 【问题描述】:

我想从一个运行同一插件的两个顺序执行的 maven pom 构建,在同一阶段仅相差一个属性,这将导致创建两个不同的存档。由于配置相当复杂,我宁愿不复制它只是为了更改一个值,这会造成维护的噩梦。如果可以在插件配置的<executions> 部分中定义这样的属性,我就可以避免这种头痛。

问题:这可能吗?如果可以,怎么办?

更新:两个答案提到使用多次执行,其中一个提到您可以在每次执行中进行单独的配置。但是考虑到我的大部分配置在两次执行之间是不变的,我是否可以在插件级别有一个配置,并且在每次执行中也有不同部分的配置部分?

【问题讨论】:

How to invoke the same maven build twice in one call的可能重复 不是我想说的那个问题的重复 @Steve 检查我的答案,是的,它完全符合您的观点(在您的更新中澄清) @A_Di-Matteo 我已经尝试使用您的解决方案来解决我自己的问题,但似乎没有区别,请您帮忙***.com/questions/42299040/… 试试 gradle。这些问题让我不再使用 maven 构建 rpms :-) 【参考方案1】:

给定简单的 Maven 源插件配置(作为示例),您在其所有执行(executions 元素之外)之间拥有一个共享配置,然后在每次执行时都有一个自定义配置,用于同一阶段,根据请求你的问题:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <includePom>true</includePom>
            </configuration>
            <executions>
                <execution>
                    <id>test-id1</id>
                    <phase>verify</phase>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <configuration>
                        <finalName>aaa</finalName>
                    </configuration>
                </execution>
                <execution>
                    <id>test-id2</id>
                    <phase>verify</phase>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <configuration>
                        <finalName>bbb</finalName>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

在这种情况下,配置条目&lt;includePom&gt;true&lt;/includePom&gt; 将与每个执行的自定义配置合并,因此将通用配置集中为插件通用配置。

有关不同级别配置的更多详细信息,您可以查看官方 Maven 文档,here,尤其是示例“配置编译运行两次”。更多详细信息也可以在官方 POM 文档here,插件部分中找到。

【讨论】:

如果我对您的理解正确,您已经为我的更新问题提供了答案。您似乎在说可以为整个插件定义一个配置(包含常量项)并在执行中单独配置(包含每次​​执行的差异)。你说的是这个吗? 没错,我刚刚测试了我发布的 sn-p,然后将其添加到我的答案中,它运行良好。我将很快链接官方文档(我不久前就阅读了关于这一点的内容)。 已添加相关官方文档链接。 我还是想知道官方文档中“选项”的意义。它们对我来说似乎没用。 而且它仍然不如能够在两次执行之间定义不同的属性。【参考方案2】:

你需要创建一个不同的执行(仍然绑定到同一个阶段)

为避免配置重复,您可以将 &lt;configuration&gt; 放在 &lt;execution&gt; 元素之外,然后在 2 次执行中,您只需定义不同的属性。

取自 maven docs:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-myquery-plugin</artifactId>
        <version>1.0</version>
        <executions>
          <execution>
            <id>execution1</id>
            <phase>test</phase>
            <configuration>
              <url>http://www.foo.com/query</url>
              <timeout>10</timeout>
              <options>
                <option>one</option>
                <option>two</option>
                <option>three</option>
              </options>
            </configuration>
            <goals>
              <goal>query</goal>
            </goals>
          </execution>
          <execution>
            <id>execution2</id>
            <configuration>
              <url>http://www.bar.com/query</url>
              <timeout>15</timeout>
              <options>
                <option>four</option>
                <option>five</option>
                <option>six</option>
              </options>
            </configuration>
            <goals>
              <goal>query</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>

【讨论】:

谢谢。是的,我看到了这个文档,但我不明白“选项”的意义是什么。它们是如何使用的?该示例并未显示这一点。属性有名称和值,但选项似乎没有。 嗨史蒂夫,我想我不完全理解你的问题。你能澄清一下哪些地方不清楚吗? ...您是否尝试过阅读链接的整个页面?因为它确实解释了如何配置插件以及如何继承配置。 去澄清问题。【参考方案3】:

您在 声明中创建了两个 元素。每个 元素都可以有自己的 部分。

【讨论】:

【参考方案4】:

我想创建一个 jar 并放入一个带有其他配置文件的 zip 文件 这对我有用

	<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-assembly-plugin</artifactId>
				<version>2.4.1</version>
				<executions>
					<execution>
					<id>build-jar-with_dep1</id>
					 <phase>package</phase>
						<configuration>
							<descriptorRefs>
								<descriptorRef>jar-with-dependencies</descriptorRef>
							</descriptorRefs>
							<finalName>$buildversion</finalName>
							<finalName>finalname</finalName>
							<appendAssemblyId>false</appendAssemblyId>
						</configuration>
						<goals>
	                        <goal>assembly</goal>
	                    </goals>
					</execution>
					<execution>
					<id>build_zip1</id>
					 <phase>package</phase>
						<configuration>
							<descriptor>src/assembly/bin.xml</descriptor>
							<finalName>$buildversion</finalName>
							<finalName>finalname</finalName>
							<appendAssemblyId>false</appendAssemblyId>
						</configuration>
						<goals>
	                        <goal>single</goal>
	                    </goals>
					</execution>
			
				</executions>
			</plugin>

【讨论】:

嗨 - 欢迎来到堆栈溢出。您能否添加一些有关此工作原理的详细信息/

以上是关于如何使用不同的属性两次执行 Maven 插件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Maven Surefire 插件与不同的组进行测试和集成测试?

Maven 发布插件执行两次测试

当我有多个用于该目标的配置时,如何在 Maven 插件中使用特定配置运行特定目标

是否可以在另一个插件的两次执行之间运行一个插件?

Maven 发布插件失败:源工件被部署两次

Maven SoapUI 插件 - 如何在 Maven 的生命周期中执行 2 个 SoapUI 测试项目