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



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

我读了几个关于SO的问题,但它们没有附带条件。这同样适用于maven war插件,其中include/exclude在某些条件下无法工作(根据他们的示例)。使用过滤器不起作用,因为我不想更改复制文件的内容,而是跳过它们。

来源:

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

达到这种效果的正确方法是什么?感谢

我最终得到了以下解决方案。它不使用一些人认为是反模式的概要文件:blackbuild和Henrik Larne。该解决方案是用分类器和maven战争资源排除构建的。它将产生两个不同内容和文件名的战争。

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

谢谢大家。

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

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

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

(有关更多信息,请参阅如何真正使用Maven配置文件(而不危及您的因果报应)

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

如果my-project-dev.warmy-project.war有战争依赖,它将使用您的生产战争作为覆盖,从而产生使用您的产品和开发时间资源的组合战争文件。

增加了额外的功能:在你的开发战争中,你可以覆盖你的生产战争的条目(比如,日志配置)。

最新更新