从父pom运行外部Ant文件

时间:2016-01-31 22:45:23

标签: maven maven-antrun-plugin

我想从父POM运行Ant build.xml版本。

这可能如下所示:

<project>
    <groupId>my.group</groupId>
    <artifactId>my-parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>initialize</phase>
                        <configuration>
                            <tasks>
                                <ant antfile="build.xml"/>
                            </tasks>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

除非我将此模块用作父POM,否则此工作正常。 问题出在这一行<ant antfile="build.xml"/>。虽然此POM作为父POM运行,但该插件没有build.xml文件。

如何在所有子构建期间从文件(位于父POM中)运行Ant脚本

PS 我尝试将build.xml打包在某个分类器下,以使其可用于子构建。但我不知道,如何在build.xml之前提取我的打包antrun:run

PPS

项目结构:

<root>
  + Parent POM
  | +- pom.xml
  | +- build.xml
  |
  + Component1
  | + Child1
  | | +- src/main/java
  | | +- ...
  | | +- pom.xml
  | |
  | + Child2
  |   +- src/main/java
  |   +-...
  |   +- pom.xml
  |
  + Component2
    + Child3
    | +- src/main/java
    | +- ...
    | +- pom.xml
    |
    + Child4
      +- src/main/java
      +-...
      +- pom.xml

作为奖励:我也想知道这些情况的答案,其中父POM独立构建和部署(不知道自己的孩子),并且构建的子项只能访问父部署的工件(不是源代码)码)。

1 个答案:

答案 0 :(得分:1)

要避免FileNotFoundException,您可以使用已配置的属性作为ant构建文件的前缀。这样的属性在父pom上是空的,而在所需的模块中有正确的前缀(即父文件夹的相对路径)。

例如,在您的父POM中,您的配置如下所示:

<properties>
    <ant.build.dir.prefix></ant.build.dir.prefix>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-antrun-plugin</artifactId>
            <executions>
                <execution>
                    <phase>initialize</phase>
                    <configuration>
                        <tasks>
                            <ant antfile="${ant.build.dir.prefix}build.xml" />
                        </tasks>
                    </configuration>
                    <goals>
                        <goal>run</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

请注意添加到ant调用的${ant.build.dir.prefix}前缀。默认情况下它将为空,这意味着文件应该与pom位于同一目录中。

但是,在模块中,您只需要覆盖属性的值,如下所示:

<properties>
    <ant.build.dir.prefix>..\</ant.build.dir.prefix>
</properties>

或文件夹层次结构中的任何其他相对路径。

在运行时,该值将被替换,因此ant文件的路径将动态更改,强制执行ant run(在父pom中)的常见和集中配置以及模块中的特定路径配置(通过属性前缀)。

我刚刚在带有echo ant任务的示例项目中测试了这两种情况(您的配置和前缀),能够重现您的问题并按照上面的建议进行修复。