Java 将Maven概要文件与WAR打包产品一起使用

Java 将Maven概要文件与WAR打包产品一起使用,java,maven-2,servlets,maven,war,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 plugi

我们有一个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
来(对于概要文件1)将A.xml替换为_1.xml,对于概要文件2,将A.xml替换为_2.xml。(删除_1和_2后缀。)

这是概要文件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>

简介1
...
外形1更换
包裹
跑
...
这正确地替换了中间target/MyWar/目录中的文件,但是由于任何原因,
target
中生成的最终WAR不会反映这些更改


就好像进入“打包”阶段已经太晚了,战争已经开始了。将阶段更改为“编译”或“测试”,前几个阶段会抱怨,因为A.xml文件(和中间构建目录)甚至还没有创建。

如果您觉得更合适,我建议使用流程资源阶段,甚至生成资源。作为最后手段,请使用prepare package。但包装阶段是做这种事情的错误地方。所有这些修改通常都可能直接发生在源树中

但是,如果您在单独的目录中执行文件操作,则可以在打包阶段使用以下命令添加该文件:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <configuration>
      <webResources>
        <resource>
          <directory>A_variant</directory>
        </resource>
      </webResources>
    </configuration>
  </plugin>

org.apache.maven.plugins
maven战争插件
变种

当然,如果您需要这样做,保留三个目录并在您的配置文件中选择适当的目录会更简单。

Maven 2或Maven 1?如果Maven 2是哪个版本?我相信在Maven 2的最新版本中,插件在元素中的顺序决定了插件在同一阶段的运行顺序。Maven 2.2.1更新了我的问题。也许你可以保留一份A.xml文件的副本,但使用resource filtering(),而不是profiles,为了达到预期效果?资源筛选的问题是,我在Eclipse中运行webapp进行开发,因此即使是在预发布版本中,我也不能在任何文件中保留变量。问题是,中间目录(经过压缩以创建WAR)直到准备包阶段后才创建,但在打包阶段之前。因此,在“准备包”阶段运行失败是因为XML文件尚不存在,而在“包”阶段运行失败是因为WAR已经创建。@craig我添加了一些详细信息,以澄清我指的是源代码树,或者您如何通过添加webResources有选择地选择要包含的源代码树。如果你走这条路,我就不会费心处理文件;我只需要使用单独的目录,例如使用Profile2/A.xml而不是A_2.xml。