将Maven配置文件与WAR包装产品一起使用

时间:2011-02-10 23:41:37

标签: java maven-2 servlets maven war

我们有一个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文件(和中间构建目录)。

1 个答案:

答案 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>

当然,如果你需要走这条路,那么保留三个目录并在你的个人资料中选择合适的目录会更简单。