SpringBoot中使用Profile的几种方式

开发 前端
我们在dockerfile中使用了ENV来指定我们要启动什么环境,但是这种方式太僵硬了, 因为相当于把启动什么环境给写死了,后面想要切换到其他环境的时候还要去修改dockerfile,这种方式看上去不太行呀!

最近项目中进行仓库拆分了之后,因为引入了公共包,所以就存在可能有snapshot版本以及release版本问题,比如我想要在dev环境的时候import snapshot版本,prod环境的时候又使用release版本,为了不频繁修改pom.xml文件,因此决定使用POM的profile来解决这个问题。

当然由于maven默认是不下载snapshot包的,因此我们要配置让它下载,这里分为全局配置和项目级别配置。

项目配置

在pom文件中添加如下内容:

<repositories>
    <repository>
        <id>nexus</id>
        <!--修改成自己私服地址-->
        <url>http://localhost:18081/repository/maven-public/</url>
        <releases>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
        </releases>
        <snapshots>
         <!--主要是这里-->
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
        </snapshots>
    </repository>
 </repositories>

全局配置

在maven的settings.xml中新增配置,如果不配置profile,只配置mirror,是下载不了snapshot包的

<profiles>
<profile>
  <id>bv-profile</id>
   <repositories>
    <repository>
        <id>nexus</id>
        <url>http://localhost:18081/repository/maven-public/</url>
        <releases>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
        </releases>
        <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
        </snapshots>
    </repository>
  </repositories>
</profile>
</profiles>

回到正题,如何使用maven的profile呢?

maven profile

同样的首先在pom.xml中新增配置:

<profiles>
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <spring.profiles.active>dev</spring.profiles.active>
            <bvpro.api.version>2.0.0-SNAPSHOT</bvpro.api.version>
        </properties>
    </profile>
    <profile>
        <id>prod</id>
        <properties>
            <spring.profiles.active>prod</spring.profiles.active>
            <bvpro.api.version>1.9.0</bvpro.api.version>
        </properties>
        </properties>
    </profile>
</profiles>

<resources>
    <resource>
        <!-- 指定配置文件所在的resource目录 -->
        <directory>src/main/resources</directory>
        <includes>
            <include>db/**</include>
            <include>static/**</include>
            <include>mapper/**</include>
            <!-- 选择要打包的配置文件和日志,当然也可以不加打包所有配置文件,然后由具体服务器来选择使用哪个 -->
            <include>bootstrap.yml</include>
            <include>bootstrap-${spring.profiles.active}.yml</include>
            <include>logback.xml</include>
        </includes>
        <filtering>true</filtering>
    </resource>
</resources>

比如这里我就设定了两个profile(dev, prod), 然后他们引用某个包的版本不一样,然后应用包的时候这样使用就行了

<dependencies>
 <dependency>
        <groupId>com.bvpro</groupId>
        <artifactId>bvpro-common-api</artifactId>
        <version>${bvpro.api.version}</version>
    </dependency>
</dependencies>

然后项目中的bootstrap.yml文件中修改如下

# Spring
spring: 
  profiles:
    # 环境配置
    active: @spring.profiles.active@

然后当我们打包的时候 mvn clean package -P dev 就可以打包dev环境的配置,同时 @spring.profiles.active@ 会被替换成dev。

当然如果你使用idea的时候就更加简单了,只需要勾选profile=dev就行了。

docker中使用

我们知道在使用dockerfile的时候也可以指定环境变量,然后启动的时候就可以根据环境变量来启动了,比如这样子:

FROM openjdk:8-jre-alpine
ENV env_java_debug_enabled=false
EXPOSE 8080
WORKDIR /app
ADD target/smcp-web.jar /app/target/smcp-web.jar
ADD run.sh /app
ENTRYPOINT ["java","-Dspring.profiles.active=test", "-jar","target/smcp-web.jar"]

然后run.sh这样写:

可以看到我们在dockerfile中使用了ENV来指定我们要启动什么环境,但是这种方式太僵硬了, 因为相当于把启动什么环境给写死了,后面想要切换到其他环境的时候还要去修改dockerfile,这种方式看上去不太行呀!

SPRING_PROFILES_ACTIVE

好在springboot项目启动的时候会去读这样的一个特殊环境变量 SPRING_PROFILES_ACTIVE, 如果环境变量中配置了这个值,那么会根据这个值找到对应的profile, 然后启动对应的环境,所以我么可以在启动的时候指定这个环境变量就行了, 所以可以这样子。

FROM openjdk:8-jre-alpine
ENV spring_profiles_active=dev
ENV env_java_debug_enabled=false
EXPOSE 8080
WORKDIR /app
ADD target/smcp-web.jar /app/target/smcp-web.jar
ADD run.sh /app
ENTRYPOINT ["java", "-jar","target/smcp-web.jar"]

这里预设了spring_profiles_active的值是dev,当启动的时候你可以更改这个值。

如果你使用docker-compose来启动,那么也可以在docker-compose文件中配置environment,比如:

environment:
   - SPRING_PROFILES_ACTIVE=prod

这就是指定profile的各种方式了,使用这种方式我们可以更加精确的控制我们需要启动的环境,并且还是最少的修改。

责任编辑:武晓燕 来源: think123
相关推荐

2024-10-18 08:53:49

SpringMybatis微服务

2018-03-14 13:57:19

云计算

2018-03-09 12:00:11

云计算公共云企业

2022-02-17 08:20:17

Spring执行代码SpringBoot

2009-07-30 12:19:32

ASP.NET中使用A

2021-05-07 16:19:36

异步编程Java线程

2010-09-25 14:48:55

SQL连接

2021-01-19 11:56:19

Python开发语言

2018-10-10 10:23:53

数据库RedisNoSQL

2022-03-31 09:13:49

Cache缓存高并发

2009-07-28 09:45:34

Webpart部署方式使用ASP.NET

2023-08-03 08:06:50

2023-02-08 08:43:55

前端继承原型

2023-09-07 13:21:00

Linux软件

2021-06-16 07:02:22

Python方式邮件

2010-11-24 09:56:20

mysql拷贝表

2021-08-02 11:13:28

人工智能机器学习技术

2021-10-07 20:36:45

Redis集群场景

2020-12-28 08:29:47

Vuecss框架

2024-05-10 07:44:23

C#进程程序
点赞
收藏

51CTO技术栈公众号