利用maven-war-plugin打包项目部署在不同环境

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nb7474/article/details/81948139

一、前言

背景环境:希望将不同环境的需要修改的配置文件放到不同的文件夹中,打包的时候根据环境选择不同的文件夹作为配置文件。
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
这里写图片描述

猜你喜欢

转载自blog.csdn.net/nb7474/article/details/81948139
今日推荐