网上分环境打包的相关资料还是挺多的,但是至少我看的文章还是不太智能,比如我选完test环境的打包后,本地运行起来就会以test环境的配置为准而不是以local.

所以本篇文章主要是对我看到的网上的分环境打包做了一些补充配置,让体验更好点.

以下只展示关键配置

首先要有以下的相关环境配置

springboot 判断是开发环境还是_maven

 

      1.pom.xml:以下配置有哪些环境(local:本地和test:测试)

<profiles>
        <profile>
            <id>local</id>
            <properties>
                <package.environment>local</package.environment>
            </properties>
            <!-- 是否默认 true表示默认-->
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>test</id>
            <properties>
                <package.environment>test</package.environment>
            </properties>
        </profile>
</profiles>

src/main/resources哪些资源文件要被build到target/classes里面,此处把application.yml,application-local.yml,application-test.yml都放进去.

如果是网上的配置可能是配置<include>application-${package.environment}.yml</include>只包含当前环境的配置文件.如果配置只包含当前环境的配置文件就会存在我开篇说的问题.

<resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
                <includes>
                    <include>application.yml</include>
                    <!-- 环境配置文件通过打jar包的工具控制是否放入jar包 -->
                    <include>application-*.yml</include>
                     <!--<include>application-${package.environment}.yml</include>-->
                </includes>
                <excludes>
                    <exclude>deployConfig/*</exclude>
                </excludes>
            </resource>
</resources>

application-*.yml(如application-local.yml,application-test.yml)都不打包进jar包里.因为第2点配置build时把application-*.ym都放入到target/classes里,而默认会把target/classes的所有文件都放入jar包.如果打的是正式环境的jar包,应该不希望把测试环境的配置也一起打包进去吧?因此在此处配置不打包application-*.yml相关文件

<plugin>
                    <artifactId>maven-jar-plugin</artifactId>
                    <configuration>
<!--                        <includes>-->
<!--                            <include>application-*.yml</include>-->
<!--                        </includes>-->
                        <excludes>
                            <!-- 打包排除掉所有环境配置文件 环境配置文件通过maven-assembly-plugin打包 -->
                            <exclude>application-*.yml</exclude>
                        </excludes>
                    </configuration>
</plugin>

application-${package.environment}.yml放入jar包.第3点的配置是application-*.yml都不放入jar包,所以就需要另外配置把当前环境的yml放入jar包里.

<plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <version>3.3.0</version>
                    <configuration>
                        <!-- 打包生成的包不拼接xml里的id 为后缀 -->
                        <appendAssemblyId>false</appendAssemblyId>
                        <!--打包文件路径-->
                        <descriptors>
                            <descriptor>${project.basedir}/assembly.xml</descriptor>
                        </descriptors>
                    </configuration>
                    <executions>
                        <execution>
                            <id>assembly-package</id>
                            <phase>package</phase>
                            <goals>
                                <goal>single</goal>
                            </goals>
                        </execution>
                    </executions>
</plugin>

 下面是assembly.xml的配置

<?xml version="1.0" encoding="UTF-8"?>
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">

    <!--项目标识,设置的话,生成后的zip文件会加上此后缀-->
    <id>${project.version}</id>
    <!--打包格式-->
    <formats>
        <format>jar</format>
    </formats>
    <!--压缩包下是否生成和项目名相同的根目录-->
    <includeBaseDirectory>false</includeBaseDirectory>
    <fileSets>
        <fileSet>
            <directory>${project.build.directory}/classes</directory>
            <outputDirectory>/</outputDirectory>
            <includes>
                <!-- 打包当前的环境配置文件 -->
                <include>application-${package.environment}.yml</include>
            </includes>
        </fileSet>
    </fileSets>
    <dependencySets>
        <!-- 基于maven-jar-plugin生成的当前项目的Project.jar打包
        就是把maven-jar-plugin生成的Project.jar里的所有文件放进最后生成的jar包里
        否则得自己重新配置把当前项目的class及相关配配置打包进jar包 -->
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <includes>
                <!-- 当前项目的groupId是com.project --> 
                <include>com.project:*</include>
            </includes>
            <unpack>true</unpack>
        </dependencySet>
    </dependencySets>

</assembly>

5.application.yml:如下配置springboot激活的环境和自己maven选择的环境一样.

# Spring配置
spring:
  profiles:
    active: @package.environment@

下图是idea maven选择环境 ,默认在idea右上角

springboot 判断是开发环境还是_spring boot_02

6.idea:配置本地都以local环境运行,而不是以maven选择的环境为准,这样不管maven选择哪个环境,本地运行的都是application-local.yml的配置

springboot 判断是开发环境还是_jar_03

此处解释下和我网上看到的配置的差别

1) 上面第2点如果只build当前环境的yml进target/classes就会导致当我们maven选择测试环境的时候,本地启动服务时因为target/classes没有application-local.yml导致本地启动找不到application-local.ym而报错,此时就得maven重新选择本地环境又或者手动把application-local.ym放入target/classes,这操作至少让我觉得不友好。

2)如果没有上面第3、4点就会导致jar包中包含的不止一个环境的yml.

3)如果按以上配置,本地运行不需要考虑当前选择的是哪个环境,不会因为自己部署了测试环境却导致本地重启不小心引用了测试环境的配置或者报错,也不会把额外的文件打包进jar.个人觉得用起来顺畅多了

7.deploy-helper-maven-plugin:自动部署配置,其实就是配置根据环境选择deploy-helper-maven-plugin对应的配置deployHelperConfig-${package.environment}.xml

下面可以把部署绑定到package上,这样在打包的时候就会自动触发部署,我是没这么配置,都是靠手动触发部署.

<plugin>
                <groupId>com.github.xiaoymin</groupId>
                <artifactId>deploy-helper-maven-plugin</artifactId>
                <!--请在maven中央仓库搜索最新版本-->
                <version>1.0</version>
                <configuration>
                    <!--配置文件路径-->
                    <configurationFile>src/main/resources/deployConfig/deployHelperConfig-${package.environment}.xml
                    </configurationFile>
                </configuration>
</plugin>

下面是deployHelperConfig-${package.environment}.xml的配置如deployHelperConfig-test.xml

<?xml version="1.0" encoding="UTF-8"?>
<deployHelperConfiguration>
    <profile server="test" deploy="test"></profile>

    <servers>
        <!--可以配置多个server节点,代表的是目标服务器-->
        <server profile="test" host="192.168.1.100" port="22" username="root" password="root"></server>
    </servers>
    <deploys>
        <deploy profile="test"
                <!-- 把当前项目target目录下的springboot.jar发布到linux -->
                source="target/springboot.jar"
                <!-- 发布到linux里的/usr/local/springboot1.jar
                target="/usr/local/springboot1.jar"
                processName="springboot1.jar"
                activeDefaultStart="true"
                <!-- 启动脚本,我启动脚本是会先备份已存在的springboot.jar,然后把传上去的springboot1.jar改名springboot.jar,之后重启服务. -->
                startShell="/usr/local/start.sh"
                <!-- 停止脚本,这个脚本我是什么都没做,因为如果这个脚本先停止服务的话会导致文件还没上传到服务器就把服务停了,如果服务上传需要10分钟就会导致服务停止10分钟,所以我把停止的逻辑卸载start.sh -->
                stopShell="/usr/local/stop.sh">
        </deploy>
    </deploys>
</deployHelperConfiguration>

如果按以上配置部署就是

选择环境->install->双击deploy-helper-maven-plugin插件就好了

springboot 判断是开发环境还是_jar_04

   ->  

springboot 判断是开发环境还是_xml_05

  ->

springboot 判断是开发环境还是_spring boot_06