我开发了一个应用程序,它的最终战争在开发模式下还可以,但它包含一些我需要外部化生产的配置文件。我能够手动改变战争并从中删除这些文件,但我想自动化这个过程。我想将配置文件保留在开发模式的战争中。
我读了几个关于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
实现这种效果的正确方法是什么?感谢
答案 0 :(得分:3)
我最终得到了以下解决方案。它不使用配置文件,这些配置文件被某些人视为反模式:blackbuild和Henrik 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-project
和my-project-dev.war
。
如果my-project-dev.war
对my-project.war
具有战争依赖性,它将使用您的生产战争作为叠加层,从而生成使用您的作品和开发时间资源的合并战争文件。
添加了奖励功能:在您的开发战中,您可以覆盖生产战争的条目(例如,logging-config)。