1

我的父母pom定义了 7 个模块,其中 5 个是依赖项jar,两个是war依赖于这些 jar 的。

问题:是否可以使用 maven profiles(或其他解决方案)来定义在mvn install针对父 pom 运行时包含哪些模块以排除两个 war 包?

然后我想有一个不同的配置文件(或另一个解决方案)来打包这两个战争。如果运行该配置文件,则仅当存储库中缺少依赖项 jar 模块时才应重新构建和安装它们。

4

1 回答 1

1

您可以build-helper-maven-plugin在父pom.xml文件中使用 来创建基于的新属性packaging(在运行时,它会从父文件更改为模块pomjar然后更改war为模块)。然后可以使用这个新属性来maven-install-plugin动态跳过。

一个简单的例子:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>1.10</version>
    <executions>
        <execution>
            <id>build-helper-regex-is-packaging-war</id>
            <phase>validate</phase>
            <goals>
                <goal>regex-property</goal>
            </goals>
            <configuration>
                <name>only.when.war.is.used</name>
                <value>${project.packaging}</value>
                <regex>war</regex>
                <replacement>true</replacement>
                <failIfNoMatch>false</failIfNoMatch>
            </configuration>
        </execution>
    </executions>
</plugin>

<plugin>
    <artifactId>maven-install-plugin</artifactId>
    <version>2.5.2</version>
    <configuration>
        <skip>${only.when.war.is.used}</skip>
    </configuration>
</plugin>

这样做,动态${only.when.war.is.used}属性将设置为true仅当project.packaging有值时,因此通过其选项war有效地跳过执行。maven-install-pluginskip


然后,您可以将此行为移动到配置文件并为jarand设置不同的设置war,将它们保持在一个共同的位置: root pom.xml,这要归功于它们的动态行为。


关于检测是否已安装工件的能力,官方插件文档中没有这样的选项,我认为您不能通过简单地使用插件来获得这样的行为。

但是,如果缺少文件(已安装的文件),您可以使用maven 配置文件激活机制并相应地激活配置文件。

您可以以动态方式(仅基于标准属性)采用以下方法:

<profiles>
  <profile>
    <activation>
      <file>
        <missing>${settings.localRepository}/${project.groupId}/${project.artifactId}/${project.build.fileName}.${project.packaging}</missing>
      </file>
    </activation>
    ...
  </profile>
</profiles>
于 2016-08-25T16:41:45.593 回答