Maven多环境打包配置

一、启动时指定环境配置文件

在启动springboot应用的jar包时,我们可以指定配置文件,通常把配置文件上传到linux服务器对应jar包的同级目录,或者统一的配置文件存放目录

java 复制代码
   java -jar your-app.jar --spring.config.location=/opt/softs/applications-prod.yaml

实际可以把配置文件路径spring.config.location 后面的替换成你自己的存放路径,把配置文件放到服务器上可以很方便的随时修改内容。

以上说的是在启动jar包的时候指定配置文件,那么如何在maven打jar包的时候同时把指定配置文件打包进去,直接启动就好了?请看接下来的分析

二、maven多环境打包配置

首先创建一个springboot应用(如果是微服务,且每个服务都是springboot应用的话,都按照同样的配置即可,笔者这里是为了举例说明),大概的结构如下

代码结构不重要,重点是pom文件和配置文件怎么配置

多个配置文件创建

假设现在有三个环境,分别是开发环境、测试环境、生产环境,这也是标准的开发、测试、上线流程所需要的软件环境。笔者在src/main/resources下创建了四个配置文件

application.yaml

这个是主配置文件,里面可以配置一些通用和基础的配置,比如连接数据,mybatis等等

bash 复制代码
spring:
  profiles:
    active: @environment@
  datasource:
    # 数据库连接信息
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/usertest?useSSL=false&serverTimezone=UTC
    username: root
    password: root
mybatis:
  # MyBatis配置
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.execute.batch.executebatch.mapper
  configuration:
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

也可以只配置如下

bash 复制代码
spring:
  profiles:
    active: @environment@

笔者这里只配置了如下内容,active是使用哪个环境的配置,这里是一个变量,先不管后面再说明

application-dev.yaml

这个是开发环境配置,配置如下

端口号,和数据库配置,mybatis配置。数据库配置一般在各个环境使用的都不同,所以应该分别配置到对应环境下的配置文件中。mybatis配置这个一般是不变的,一般可以放在上面的application.yaml主配置文件中,不过笔者这里没有动了。

开发环境端口号是4455

application-test.yaml

这个是测试环境配置,内容如下

内容同上,只是端口不一样,为6677

application-prod.yaml

生产环境配置文件

生产环境的端口号是7788

pom文件配置

首先是profiles配置

xml 复制代码
<profiles>
        <profile>
            <!--不同环境Profile的唯一id-->
            <id>dev</id>
            <!--默认激活dev 环境-->
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <!--environment是自定义的字段(名字随便起),自定义字段可以有多个,确保与配置文件一致-->
                <environment>dev</environment>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <properties>
                <environment>prod</environment>
            </properties>
        </profile>
        <profile>
            <id>test</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <properties>
                <environment>test</environment>
            </properties>
        </profile>
    </profiles>

有三组profile,分别对应三个环境dev、prod、test

注: < e n v i r o n m e n t > d e v < / e n v i r o n m e n t > <environment>dev</environment> <environment>dev</environment>这个environment标签可以随意定义,只要application.yaml里面能对应上就行

build配置

xml 复制代码
    <!-- 打包需要引入对应环境的配置文件 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!--打包时跳过测试-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.1.2</version>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <executions>
                    <execution>
                        <id>default-resources</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>target/classes</outputDirectory>
                            <useDefaultDelimiters>false</useDefaultDelimiters>
                            <delimiters>
                                <delimiter>@</delimiter>
                            </delimiters>
                            <resources>
                                <resource>
                                    <directory>src/main/java</directory>
                                    <includes>
                                        <include>**/*.xml</include>
                                    </includes>
                                    <filtering>true</filtering>
                                </resource>
                                <resource>
                                    <directory>src/main/resources/</directory>
                                    <filtering>true</filtering>
                                    <includes>
                                        <include>**/*.yaml</include>
                                    </includes>
                                </resource>
                                <resource>
                                    <directory>src/main/resources/</directory>
                                    <excludes>
                                        <exclude>**/*.yaml</exclude>
                                    </excludes>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <version>1.3</version>
                <executions>
                    <execution>
                        <id>print-custom-info</id>
                        <phase>package</phase>
                        <configuration>
                            <tasks>
                                <!--suppress UnresolvedMavenProperty -->
                                <echo message="[INFO] ${environment} 环境打包执行成功"/>
                            </tasks>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

有两个需要注意的点

首先第一个打包时跳过测试的配置

这样我们在打包生产环境时的命令

bash 复制代码
mvn clean package -Pprod

而不是下面的,去掉了 -Dmaven.test.skip=true

bash 复制代码
mvn clean package -Pprod -Dmaven.test.skip=true

第二个分割符解析

这里的配置实际上是为了识别下面配置的@符号,从环境变量中读取具体哪个环境

注:上面的@符号可以换成其他的符号分割比如*或者&,一般还是不换比较好

三、IDEA启动调整

以上配置好后,IDEA启动就无法启动了,发现无法识别主配置里的自定义变量

这个是我们打包时候用到的,IDEA启动自然无法识别,打开右侧的maven配置,会发现多了几个配置文件(native 和nativeTest这两个是maven自己生成的不用管),我们勾选上dev

再次点击启动,发现启动成功了,这个主要是我们自己开发本地测试时使用

当你有使用其他环境,比如使用test环境启动的需求时,把dev勾选取消,仍然还有灰色的暗勾选,此时maven没有自动刷新。勾选上test后,点击左上角的刷新按钮,就会变成如下界面

再次启动,就会使用测试环境配置启动了

四、指定环境打包

有了以上的环境配置准备,我们就可以在打包时指定配置,而不是运行时指定配置环境了,笔者使用的时idea开发,进入terminal控制台输入如下命令,打包开发环境配置的jar包

bash 复制代码
mvn clean package -Pprod


看到打包成功了

五、启动jar包

windows下使用cmd命令进入打包后的项目target目录下执行

bash 复制代码
java  -jar execute-batch-0.0.1-SNAPSHOT.jar

启动成功了,我们的生产环境端口号正是7788

postman调用下接口

到这里maven多环境打包配置完成了

六、完整pom文件

笔者这里附上完整的pom文件内容,可供复制参考,主要是 < b u i l d > < / b u i l d > <build></build> <build></build>和 < p r o f i l e s > < / p r o f i l e s > <profiles></profiles> <profiles></profiles>中的配置

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.execute.batch</groupId>
    <artifactId>execute-batch</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>execute-batch</name>
    <description>execute-batch</description>
    <properties>
        <java.version>21</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter-test</artifactId>
            <version>3.0.3</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>2.0.1.Final</version>
        </dependency>
    </dependencies>

    <!-- 打包需要引入对应环境的配置文件 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!--打包时跳过测试-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.1.2</version>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <executions>
                    <execution>
                        <id>default-resources</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>target/classes</outputDirectory>
                            <useDefaultDelimiters>false</useDefaultDelimiters>
                            <delimiters>
                                <delimiter>@</delimiter>
                            </delimiters>
                            <resources>
                                <resource>
                                    <directory>src/main/java</directory>
                                    <includes>
                                        <include>**/*.xml</include>
                                    </includes>
                                    <filtering>true</filtering>
                                </resource>
                                <resource>
                                    <directory>src/main/resources/</directory>
                                    <filtering>true</filtering>
                                    <includes>
                                        <include>**/*.yaml</include>
                                    </includes>
                                </resource>
                                <resource>
                                    <directory>src/main/resources/</directory>
                                    <excludes>
                                        <exclude>**/*.yaml</exclude>
                                    </excludes>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <version>1.3</version>
                <executions>
                    <execution>
                        <id>print-custom-info</id>
                        <phase>package</phase>
                        <configuration>
                            <tasks>
                                <!--suppress UnresolvedMavenProperty -->
                                <echo message="[INFO] ${environment} 环境打包执行成功"/>
                            </tasks>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <profile>
            <!--不同环境Profile的唯一id-->
            <id>dev</id>
            <!--默认激活dev 环境-->
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <!--environment是自定义的字段(名字随便起),自定义字段可以有多个,确保与配置文件一致-->
                <environment>dev</environment>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <properties>
                <environment>prod</environment>
            </properties>
        </profile>
        <profile>
            <id>test</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <properties>
                <environment>test</environment>
            </properties>
        </profile>
    </profiles>
    
</project>
相关推荐
xlsw_1 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹2 小时前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭2 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫2 小时前
泛型(2)
java
超爱吃士力架2 小时前
邀请逻辑
java·linux·后端
南宫生2 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石3 小时前
12/21java基础
java
李小白663 小时前
Spring MVC(上)
java·spring·mvc
GoodStudyAndDayDayUp3 小时前
IDEA能够从mapper跳转到xml的插件
xml·java·intellij-idea
装不满的克莱因瓶3 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb