我们有一个Maven版本(版本2.2.1),它当前生成一个WAR文件。我们的输出目录是target/
,因此我们最终得到了构建工件target/MyWar.WAR
。
我在POM.xml文件中添加了两个配置文件,以便于特定的构建“风格”,每个风格都需要特定版本的A.xml
文件。在中间构建目录target/MyWar/
中有3个文件:
A.xml
A_1.xml
A_2.xml
在没有指定配置文件的情况下在Maven中构建应使用A.xml,并且它当前正在使用。我想使用maven-antrun-plugin
(对于Profile 1)用A_1.xml替换A.xml,对于Profile 2用A_2.xml替换A.xml。 (删除_1和_2后缀。)
这是Profile 1执行的一个例子:
<profile>
<id>Profile1</id>
<build>
...
<execution>
<id>Profile1-Replace</id>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<delete
file="${project.build.outputDirectory}/../MyWar/A.xml" />
<copy
file="${project.build.outputDirectory}/../MyWar/A_1.xml"
tofile="${project.build.outputDirectory}/../MyWar/A.xml" />
</tasks>
</configuration>
</execution>
...
</build>
</profile>
这正确地替换了中间目标/ MyWar /目录中的文件,但无论出于何种原因,target
中生成的最终WAR 不都反映了这些更改。
就好像在'package'阶段运行太晚了,而WAR已经构建完毕。将阶段更改为“编译”或“测试”,即之前的阶段,抱怨因为尚未创建A.xml文件(和中间构建目录)。
答案 0 :(得分:2)
我建议您使用 process-resources 阶段,甚至 generate-resources ,如果您认为更适合。作为最后的手段,请使用 prepare-package 。但包阶段是做这种事情的错误地方。所有这些修改通常可能直接在源树中发生。
但是,如果您在单独的目录中执行文件操作,则可以使用maven-war-plugin在包阶段添加它,如下所示:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webResources>
<resource>
<directory>A_variant</directory>
</resource>
</webResources>
</configuration>
</plugin>
当然,如果你需要走这条路,那么保留三个目录并在你的个人资料中选择合适的目录会更简单。