一、前言
背景环境:希望将不同环境的需要修改的配置文件放到不同的文件夹中,打包的时候根据环境选择不同的文件夹作为配置文件。
maven-war-plugin插件用于将汇集的Java类文件、依赖的jar文件和资源文件等一起打包以构建war包文件。
maven-war-plugin中的配置详解:
https://maven.apache.org/plugins/maven-war-plugin/war-mojo.html
二、项目目录结构
如上面所说,这里我写了两个环境的配置文件,一个dev环境一个为qa环境,他们的配置文件的结构基本相同,props文件夹下存放的是properties文件。文件内容如下:
TYPE=${filtername}
三、pom.xml文件
profile配置
<profiles>
<profile>
<id>qa</id>
<properties>
<package.environment>qa/conf</package.environment>
<package.webxml>qa</package.webxml>
<filtername>FNameQA</filtername>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>dev</id>
<properties>
<package.environment>dev/conf</package.environment>
<package.webxml>dev</package.webxml>
<filtername>FNameDEV</filtername>
</properties>
</profile>
</profiles>
上面定义了两个profile,分别是qa环境和dev环境,配置了三个参数
* package.environment 配置文件的路径,在这里是conf路径下的文件,例如qa/conf,即代表在去resource目录下的qa/conf取配置文件。
* package.webxml web.xml的路径,例如qa即代表在resource/qa目录下取web.xml
* filtername properties文件中所要使用的参数
plugin配置
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<archive>
<!-- Whether the created archive will contain these two Maven files -->
<addMavenDescriptor>false</addMavenDescriptor>
</archive>
<warName>solrT</warName>
<webResources>
<resource>
<directory>src/main/resources/${package.environment}/</directory>
<targetPath>WEB-INF/classes</targetPath>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources/${package.webxml}</directory>
<targetPath>WEB-INF</targetPath>
<filtering>true</filtering>
</resource>
</webResources>
<warSourceExcludes>src/main/resources/dev/test.txt,src/main/resources/qa/test.txt</warSourceExcludes>
<packagingExcludes>
WEB-INF/conf/**,WEB-INF/classes/dev/**,WEB-INF/classes/qa/**,WEB-INF/test.txt,
WEB-INF/classes/test.txt,WEB-INF/classes/web.xml
</packagingExcludes>
</configuration>
</plugin>
在上面的配置中,通过configuration标签设置打包的一些配置,其中:
* directory:定义了要进行打包的文件路径,
* targetPath: 打包的目录文件夹,即将文件打成war包的时候放到war包的此目录下
* filtering:在打包的时候是否将配置文件中的用${}表示的值给替换。
四、打包结果
1.原先的web.xml:
是没有过滤器的属性的,但是通过profile打包时修改qa目录下的web.xml,并将其打包到web-inf目录下,替换原先的web.xml,打包完成后的web.xml:
这一点内容修改是我们想要看到的。
2.同样的properties文件
原先properties:TYPE=${filtername}
打包后:
我们想要实现的修改内容已经基本完成,证明此插件是可用的。
五、瑕疵的地方
问题1:
打包的时候src/main/resources目录下的文件本身就会被打包到classes目录下,而通过插件的resource标签,也可实现此功能,所以会造成两者重复。
可以发现他将src/main/resources目录下的dev和qa都打包进来了,而我最初的目的是只将qa/conf和dev/conf下的内容给打包出来。
这里需要注意两个标签:warSourceExcludes和packagingExcludes
warSourceExcludes是在拷贝文件到war文件夹时忽略掉指定文件或者文件夹(但是如果war命令前没有clean指令,而war文件夹下已经包含了指定文件或者文件夹时,最后生成的war包里还是会包含这些文件或文件夹,哪怕没有拷贝它们到war文件夹).
packagingExcludes是在生成war包时不包含指定文件或文件夹到war文件中,不论它们是否存在于war文件夹下。
因此慎重起见,更倾向于使用packagingExcludes参数。
通过pom文件中packagingExcludes标签的设置,
* WEB-INF/conf/**, WEB-INF下的conf文件夹不需要
* WEB-INF/classes/dev/**, classes下的dev文件夹不需要
* WEB-INF/test.txt, WEB-INF下的test.txt文件不需要
最终打包的时候会排除这些文件和文件夹。打包结果如下所示:
WEB-INF
classes