Tomcat Maven插件分环境运行配置

Java基础

浏览数:226

2020-5-30

本文主要针对分环境运行、打包配置的Maven Java Web项目进行介绍与描述。

在Java项目的实际开发中测试与开发的环境一般都会有些不同的配置,并且我们希望在运行与打包中可以通过指定不同环境得到不同的构建结果,Maven通过一些配置恰好可以完成这一工作。

分环境运行

我遇到的问题是使用maven的tomcat7插件启动项目时,所需的资源文件不能指定profile来完成整个启动,原因在于一些配置文件并未在整个构建阶段copy到指定目录中

那么直入主题,目录结构如下: 我们可以看到devproduct文件夹中的配置文件相同,但其中的配置不同,现在我们要达到的效果如下:

编译后我们将指定的profile中的配置文件copy到了conf文件夹下。

这样项目启动时会按照项目中指定的路径读取配置文件。完成配置需要以下插件:

  • tomcat7-maven-plugin
  • maven-resources-plugin

配置分别如下:

profile:

<profile>
    <id>dev</id>
    <properties>
         <runtime.env>dev</runtime.env>
    </properties>
</profile>
<profile>
    <id>product</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
        <runtime.env>product</runtime.env>
    </properties>
</profile>

maven-resources-plugin:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <configuration>
        <escapeString>/</escapeString>
        <encoding>UTF-8</encoding>
        <nonFilteredFileExtensions>
            <nonFilteredFileExtension>en</nonFilteredFileExtension>
        </nonFilteredFileExtensions>
    </configuration>
    <executions>
        <execution>
            <id>copy-resources</id>
            <!--在process-resources生命周期内执行-->
            <phase>process-resources</phase>
            <goals>
                <!--goal为copy-resources-->
                <goal>copy-resources</goal>
            </goals>
            <configuration>
                <!--copy目标目录-->
                <outputDirectory>target/classes/conf</outputDirectory>
                <resources>
                   <resource>
                   <!--copy资源所在的目录-->
                   <directory>src/main/resources/${runtime.env}</directory>
                   <filtering>true</filtering>
                  </resource>
                </resources>
            </configuration>
        </execution>
    </executions>
</plugin>

build resource

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <excludes>
                <exclude>dev/*</exclude>
                <exclude>product/*</exclude>
            </excludes>
        </resource>
    </resources>
</build>

tomcat7-maven-plugin

<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <configuration>
        <path>/</path>
        <port>8080</port>
        <uriEncoding>UTF-8</uriEncoding>
        <server>tomcat7</server>
        <finalName>${project.build.finalName}</finalName>
    </configuration>
</plugin>

由于tomcat插件的相关操作发生在default生命周期中的process-classes阶段,而resource插件的copy动作发生在process-resource阶段,所以并不影响tomcat插件的启动,并且启动时已经完成了资源文件的copy,所以在启动tomcat时我们只需做以下指定:

$ mvn tomcat7:run -Pdev

这样tomcat使用开发环境的配置来运行,target的class目录接口如图2所示,如需使用product环境配置文件启动则指定相应的profile即可。 在maven构建日志中我们能看到copy动作的执行以及各阶段的执行顺序,如下:

分环境打包

关于打包上面的配置并不需要改变,只需执行打包命令时做同样的profile指定即可:

$ mvn package -Pproduct

这时打包出来的目录结构与图2相同,如下:

如本文有不恰当之处,还请各位看官在评论中指正。

参考文章

作者:Laughing_Vzr