springboot 不同环境的配置问题

  基于springboot的项目开发中常用的配置文件常常会因为环境的不同而变动,常见的环境就有本地环境,开发环境,测试环境,预生产以及生产环境。

  为了方便对不同环境的配置管理和启用,spring提供了profile机制来实现不同环境的配置切换。

 

一、文件组成

  在springboot项目中,默认的主配置文件一般放在项目的src\main\resources\目录下,默认启用的文件名为application.properties(或application.yml)。

  随springboot的灵活配置特性,配置文件一般可以指定启动端口,启动项目名,数据源以及其他自定义的内容。如:

  application.properties

#设定启动端口
server.port=8888
#定义项目名(springboot2.0及以上语法)
server.servlet.context-path:/spring-test
#设定日志配置路径
logging.config=classpath:logback.xml

 

  而采用profile机制,则可以多追加以application-{profile}.properties的格式文件来表现不同环境的不同配置内容。如:

  application-local.properties  #本地环境

  application-dev.properties  #开发环境

  application-test.properties  #测试环境

  application-prod.properties  #生产环境

  如图示:

  

  各文件根据具体文件编写不同的配置项,如不同环境启用不同的端口,指定不同格式的logback文件等等。

  基于以上情况,项目在正常运行时就要指定其加载何种配置文件,接下来就是激活profile的事情。

 

二、激活profile

  真正需要的配置文件现在为applicaiton-{profile}.properties。

  激活的方式有多种,网上其他内容有4至5种不同的profile激活方式,本文只罗列习惯的几种。

  1.application.properties配置方式 (开发调试阶段常用)

  使用此方式只需要在主配置文件application.properties追加spring.profiles.active内容即可。spring项目启动时读到此行会加载相应内容覆盖,代码如下:

  application.properties

#激活指定配置文件
spring.profiles.active=dev

 

  2.命令行 (启动项目时设定)

  由于第一种方式一般只是在项目开发时使用,实际打包时若要更改环境配置还需要手动修改spring.profiles.active的值。

  因此可以尝试使用命令行的方式运行项目,编写启动命令时增加命令行选项来指定需要激活的配置。

  1)将项目install之后,会在target目录中生成.jar文件(本文springboot项目打包成jar包)。

  2)然后在jar包所在磁盘地址栏cmd,输入如下命令启动项目使项目按照指定active值运行:

    java -jar spring-test-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod

 

  3.使用Maven命令指定相应环境打包 (项目打包时设定)

  为实现此方式的前提,项目的pom文件需要有如下配置:

  <groupId>com.myDemo</groupId>
  <artifactId>spring-test</artifactId>
  <packaging>jar</packaging>
  <version>0.0.1-SNAPSHOT</version>
  
  <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  
  <build>
      <plugins>
          <plugin>
              <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-maven-plugin</artifactId>
          </plugin>
      </plugins>
  </build>

 

  使用mvn命令打包代码。mvn命令介绍:

  (PS:打包项目一般要跳过测试代码,设置命令选项 -D maven.test.skip=true即可)

  mvn -U clean package 

    使用package方式打包,该方式会执行clean、resources、compile、testResources、testCompile、test、jar等7个阶段。完成项目清理,文件加载,编译,测试和打包功能。但不会把打好的jar包部署到本地maven仓库和远程maven私服仓库。

 

  mvn -U claen install

    使用install命令打包,该方式会在上述7个阶段中增加intall阶段。即:clean、resources、compile、testResources、testCompile、test、jar、install。新增的阶段会将打好的jar包部署到本地maven仓库,但不会部署到远程maven私服仓库。

    若打包成功,项目target目录会生成jar包,同时本地的Repository目录下(具体见maven安装目录下的config/settings.xml中的localRepository节点路径)也会生成相应jar包。

 

  mvn clean deploy

    该命令使用deploy,又会在上述8个阶段中增加deploy阶段,即实现远程maven私服仓库的部署。

 

  熟悉以上情况后,可以尝试进行命令行打包了。windows系统下打开cmd命令行切换到项目根目录下,执行如下命令:

  

mvn -D maven.test.skip=true -U clean package

  打包成功后会出现[INFO] BUILD SUCCESS等释文,此时项目的target目录下则会出现响应jar包。此jar包可以通过java -jar xxx.jar方式运行。

  若需要部署到本地maven仓库,则执行命令:

mvn -D maven.test.skip=true -U clean install

  此时,项目目录target目录以及本地mavan仓库repo目录都会出现相应jar包。

  

  介绍了这么多,接下来步入正题,由于我们需要针对目标环境进行打包,所以我们可以在mvn命令中再追加一个命令选项

  -P, --activate-profiles<arg>  Comma-delimited list of profiles to activate.

  这样就可以激活指定的profile文件。示例:

mvn -D maven.test.skip=true -U clean package -P test

  其中-P test指的就是项目中的application-test.properties文件。

 

========20200225更新========

在上文中提到,用-P命令项来指定环境打包,但是纯粹依赖上文是不行的。依据profile特性,还需要调整pom.xml中的内容来达到目的。具体如下

  1.pom中增加profile节点

  在pom.xml中追加profiles节点,并为每个环境配置自己的profile节点,举例如下:

<project>
    ...
    <!-- 使用profile机制针对不同环境打包。命令行采用mvn -P 环境名 来执行打包 -->
  <profiles>
      <profile>
          <id>dev</id>
          <properties>
              <package.env>windows</package.env>
          </properties>
          <activation>
              <activeByDefault>true</activeByDefault>
          </activation>
      </profile>
      <profile>
          <id>test</id>
          <properties>
              <package.env>test</package.env>
          </properties>
      </profile>
      <profile>
          <id>prod</id>
          <properties>
              <package.env>prod</package.env>
          </properties>
      </profile>
  </profiles>
</project>

  注意,上述profile节点中定义了properties的属性,属性名自定义为package.env,这个属性需要在application.properties中被引用。

 

  2.applicatoin.properties中更改配置为属性名引用

#激活一个环境的配置文件
#spring.profiles.active=dev
#由pom.xml中指定resource和profiles来选择配置环境文件,这里改为profile中定义的property参数
spring.profiles.active=@package.env@

 

  3.pom中的build节点增加resource节点来指定打包指定环境时需要加载的配置文件

  在上两步完成之后,可以在原build节点中在增加resources节点,配置resource,指定需要加载的配置文件,示例如下:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
    <!-- 因增加了profiles节点指定环境配置,故build节点中要增加resource来指定文件所在 -->
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <!-- 过滤属性需要设置为true才会用指定文件覆盖原来的配置 -->
            <filtering>true</filtering>
            <includes>
                <!-- 定义要纳入的文件,这里*代表所有properties,xml后缀的配置文件 -->
                <!-- 注意:一旦这里include,那么只会加载include中的文件,没有指定的文件在打包的时候不会被加载,所以这里要么针对性的明确加载哪些文件,要么全部加载 -->
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
        </resource>
    </resources>
 </build>

 

  以上步骤完成后,mvn -P 指令才会生效,此时在执行如下命令就可以正确打包。

mvn -D maven.test.skip=true -U clean package -P test

 

 

  

posted @ 2020-02-25 18:09  风灵苏  阅读(196)  评论(0)    收藏  举报