【问题标题】:Using Maven Profiles with a WAR-Packaged Product将 Maven 配置文件与 WAR 打包的产品一起使用
【发布时间】:2011-02-10 23:41:37
【问题描述】:

我们有一个当前生成 WAR 文件的 Maven 构建(版本 2.2.1)。我们的输出目录是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.xml 替换为 A_1.xml,对于 Profile 2 将 A.xml 替换为 A_2.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>

这会正确替换中间 target/MyWar/ 目录中的文件,但无论出于何种原因,target 中生成的最终 WAR反映了这些更改。

好像运行在'package'阶段已经太晚了,WAR已经建好了。将阶段更改为“编译”或“测试”,即之前的阶段,抱怨因为 A.xml 文件(和中间构建目录)甚至还没有创建。

【问题讨论】:

  • Maven 2 还是 Maven 1?如果是 Maven 2,哪个版本?我相信在最新版本的 Maven 2 中,您的插件在 元素中的顺序决定了插件在同一阶段时运行的顺序。
  • Maven 2.2.1,更新了我的问题。
  • 也许您可以保留一份 A.xml 文件的副本,但使用资源过滤 (sonatype.com/books/mvnref-book/reference/…) 而不是配置文件来获得所需的效果?
  • 资源过滤的问题是我在Eclipse中运行webapp进行开发,所以我不能在任何文件中留下变量,即使是预发布。

标签: java maven-2 servlets maven war


【解决方案1】:

我建议改用 process-resources 阶段,或者甚至 generate-resources,如果您觉得这样更合适的话。作为最后的手段,使用prepare-package。但是 package 阶段是做这种事情的错误地方。所有此类修改通常可能直接发生在源代码树中。

但是,如果您在单独的目录中执行文件操作,则可以在 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>

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

【讨论】:

  • 试过了,问题是中间目录(被压缩以创建WAR)直到某个时间准备包阶段之后,但在包装阶段。所以在prepare-package阶段运行失败是因为XML文件还不存在,而在package阶段运行失败是因为WAR已经创建了。
  • @craig 我添加了一些细节以澄清我的意思是源树 - 或者您如何通过添加 webResources 来选择性地选择要包含的树。如果你走那条路,我就不会费心处理文件了。我只是使用单独的目录,例如有 Profile2/A.xml 而不是 A_2.xml。
猜你喜欢
  • 1970-01-01
  • 2011-04-26
  • 2019-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多