我想从父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独立构建和部署(不知道自己的孩子),并且构建的子项只能访问父部署的工件(不是源代码)码)。
答案 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任务的示例项目中测试了这两种情况(您的配置和前缀),能够重现您的问题并按照上面的建议进行修复。