有条件地将maven中的一些资源排除在战争之外

时间:2014-04-15 11:17:15

标签: java maven

我开发了一个应用程序,它的最终战争在开发模式下还可以,但它包含一些我需要外部化生产的配置文件。我能够手动改变战争并从中删除这些文件,但我想自动化这个过程。我想将配置文件保留在开发模式的战争中。

我读了几个关于SO的问题,但他们错过了条件性。这同样适用于maven-war-plugin,其中包含/排除在某些条件下无法工作(根据他们的样本)。使用过滤器不会起作用,因为我不想改变复制文件的内容但跳过它们。

来源:

src
  main
    resources
      some.properties
      server-keystore.jks
      signature.properties
      MyRequests.xsd

发展战:

WEB-INF
  classes
      some.properties
      server-keystore.jks
      signature.properties
      MyRequests.xsd

生产战:

WEB-INF
  classes
      signature.properties
      MyRequests.xsd

实现这种效果的正确方法是什么?感谢

2 个答案:

答案 0 :(得分:3)

我最终得到了以下解决方案。它不使用配置文件,这些配置文件被某些人视为反模式:blackbuildHenrik Larne。该解决方案使用分类器和maven war resources exclusion构建。它将产生两个与内容和文件名不同的战争。

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <configuration>
        <classifier>dev</classifier>
        <webappDirectory>${project.build.directory}/${project.build.finalName}-dev</webappDirectory>
    </configuration>
    <executions>
        <execution>
            <id>package-prod</id>
            <phase>package</phase>
            <configuration>
                <classifier>prod</classifier>
                <webappDirectory>${project.build.directory}/${project.build.finalName}-prod</webappDirectory>
                <packagingExcludes>WEB-INF/classes/*.jks,WEB-INF/classes/some.properties</packagingExcludes>
            </configuration>
            <goals>
                <goal>war</goal>
            </goals>
        </execution>
    </executions>
</plugin>

谢谢大家。

答案 1 :(得分:-4)

请不要使用配置文件。配置文件的问题在于,生成的工件不包含有关用于构建它的配置文件的信息。

基本规则:配置文件不得更改构建的结果。

或者相反:如果您构建相同的源代码修订版,则结果必须相同,无论配置文件或参数如何。

(有关详细信息,请参阅How to really use Maven profiles (without endangering your karma)

因此,更好的方法是创建两个战争模块,比如my-projectmy-project-dev.war

如果my-project-dev.warmy-project.war具有战争依赖​​性,它将使用您的生产战争作为叠加层,从而生成使用您的作品和开发时间资源的合并战争文件。

添加了奖励功能:在您的开发战中,您可以覆盖生产战争的条目(例如,logging-config)。