004-集成maven和Spring boot的profile功能打包

时间:2023-03-09 03:23:16
004-集成maven和Spring boot的profile功能打包

参考地址:https://blog.****.net/lihe2008125/article/details/50443491

一、主要目标

  1、通过mvn在命令行中打包时,可以指定相应的profile。

  2、需使用了maven的profile功能

  3、使用了Spring Boot的profile功能

二、profile简介

  什么是profile,解决什么问题呢?  

  一般在开发项目的时候要有多个环境,如开发环境、测试环境、生产环境,配置文件一般不同。当要向各个环境发布程序时,需要人工处理这些配置文件。有了profile,只要在maven打包时使用下面命令即可。

mvn clean package -Dmaven.test.skip=true -P prod 

  -P prod 就是告诉maven要使用名字为prod的profile来打包,即所有的配置文件都使用生产环境(prod:生产;test:测试;dev:开发)。

三、实现过程

  maven支持profile功能,当使用maven profile打包时,可以打包指定目录和指定文件,且可以修改文件中的变量。

  spring boot也支持profile功能,只要在application.properties文件中指定spring.profiles.active=xxx 即可,其中xxx是一个变量,当maven打包时,修改这个变量即可。

3.1、父pom增加profile配置

  在maven的父pom中增加如下配置 :
<profiles>
<profile>
<id>dev</id>
<properties>
<profileActive>dev</profileActive>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>test</id>
<properties>
<profileActive>test</profileActive>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<profileActive>properties</profileActive>
</properties>
</profile>
</profiles>

方式一、基本打包

测试环境:springboot 1.5.1下

在build中配置,下文 中会有详细解释

        <resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>application-dev.properties</exclude>
<exclude>application-test.properties</exclude>
<exclude>application-produce.properties</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>application.properties</include>
<include>application-${profiles.active}.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>

因可能版本较低,需要配置 maven-resources-plugin,否则变量不替换,但是更换了springboot 2.0.4后不用配置既可以

        <plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<delimiters><!-- 使用${..}作为占位符 -->
<delimiter>${*}</delimiter>
</delimiters>
<!-- 使用默认的占位符(@..@) -->
<useDefaultDelimiters>true</useDefaultDelimiters>
</configuration>
</plugin>
</plugins>

方式二、自定义配置的打包

1、配置好:assembly/depolyment.xml

<?xml version="1.0" encoding="UTF-8"?>
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
<id>dist</id>
<formats>
<format>zip</format>
<format>dir</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory> <fileSets>
<fileSet>
<directory>src/main/bin</directory>
<outputDirectory>bin/</outputDirectory>
</fileSet>
<!--<fileSet>-->
<!--<directory>src/main/resources</directory>-->
<!--<outputDirectory>/</outputDirectory>-->
<!--</fileSet>--> <fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
<dependencySets>
<dependencySet>
<outputDirectory>lib</outputDirectory>
<scope>runtime</scope>
<excludes>
<exclude>${groupId}:${artifactId}</exclude>
</excludes>
</dependencySet>
</dependencySets>
</assembly>

2、多环境配置

方式2.1、文件后缀方式

  在需要打包的子项目pom设置

    <build>
<resources>
<resource>
<!--指定打包时需要特殊处理的目录文件-->
<directory>src/main/resources</directory>
<!--处理文件是时,需要变量替换-->
<filtering>true</filtering>
<!--打包时,排除文件-->
<excludes>
<exclude>application.properties</exclude>
<exclude>application-dev.properties</exclude>
<exclude>application-test.properties</exclude>
<exclude>application-prod.properties</exclude>
</excludes>
</resource>
<resource>
<!--指定打包时需要特殊处理的目录文件-->
<directory>src/main/resources</directory>
<!--处理文件是时,需要变量替换-->
<filtering>true</filtering>
<!--打包时,包含文件-->
<includes>
<include>application.properties</include>
<include>application-${profileActive}.properties</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<!--打jar包-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifest>
<!--jar入口累-->
<mainClass>com.jd.bt.gateway.ZuulApplication</mainClass>
<!-- classpath路径 -->
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
</manifest>
<manifestEntries>
<Class-Path>./</Class-Path>
</manifestEntries>
</archive>
<excludes>
<!--注意从编译结果目录开始算目录结构-->
<!--<exclude>/*.yml</exclude>-->
<!--<exclude>/*.properties</exclude>-->
<!--<exclude>/*.xml</exclude>-->
<!--<exclude>/*.txt</exclude>-->
</excludes>
</configuration>
</plugin>
<!--自定义打包-->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<finalName>${artifactId}</finalName>
<!-- not append assembly id in release file name -->
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>src/main/assembly/depolyment.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>dist</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

  在resources配置管理boot 文件

  工程中有4个文件:

    application.properties, 包含通用配置的文件。文件中有spring.profiles.active=@profileActive@的属性。spring boot的profile是通过spring.profiles.active属性来配置的,这里的profileActive和上面coolpro工程中配置的profileActive属性名要一致。这样,在运行mvn命令时,maven就会帮我们将@profileActive@替换成指定的profile。

    application-dev.properties, 当mvn -P dev时, 需要打包这个文件。

    application-test.properties, 当mvn -P test时, 需要打包这个文件。

    application-prod.properties, 当mvn -P prod时, 需要打包这个文件。

  004-集成maven和Spring boot的profile功能打包

application.properties

spring.profiles.active=@profileActive@
server.port=8040

application-dev.properties

server.port=8050

……

方式2.2、以文件夹方式

  在需要打包的子项目pom设置

    <build>
<resources>
<!--文件夹-->
<resource>
<!--指定打包时需要特殊处理的目录文件-->
<directory>src/main/resources</directory>
<!--处理文件是时,需要变量替换-->
<filtering>true</filtering>
<!--打包时,排除文件-->
<excludes>
<exclude>dev_conf/*</exclude>
<exclude>test_conf/*</exclude>
<exclude>prod_conf/*</exclude>
</excludes>
</resource>
<resource>
<!--指定打包时需要特殊处理的目录文件-->
<directory>src/main/resources/${profileActive}_conf</directory>
<!--处理文件是时,需要变量替换-->
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<!--打jar包-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifest>
<!--jar入口累-->
<mainClass>com.jd.bt.gateway.ZuulApplication</mainClass>
<!-- classpath路径 -->
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
</manifest>
<manifestEntries>
<Class-Path>./</Class-Path>
</manifestEntries>
</archive>
<excludes>
<!--注意从编译结果目录开始算目录结构-->
<!--<exclude>/*.yml</exclude>-->
<!--<exclude>/*.properties</exclude>-->
<!--<exclude>/*.xml</exclude>-->
<!--<exclude>/*.txt</exclude>-->
</excludes>
</configuration>
</plugin>
<!--自定义打包-->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<finalName>${artifactId}</finalName>
<!-- not append assembly id in release file name -->
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>src/main/assembly/depolyment.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>dist</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

  在resources

    004-集成maven和Spring boot的profile功能打包

  log4j.xml:共有文件

  env.properties:

env.profile.active=@profileActive@

  注意:使用$符号,不能替换,maven的maven-resources-plugin使用@替换的符号。

3.4、打包即可

mvn clean package -Dmaven.test.skip=true -P dev -e