Maven多环境构建
1.Maven属性
<properties>
<spring.verion>5.2.1.RELEASE</spring.verion>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.verion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.verion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.verion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.verion}</version>
</dependency>
</dependencies>
${pom.build.sourceDirectory}:项目的主源码目录,默认为src/main/java/
${project.build.testSourceDirectory}:项目的测试源码目录,默认为src/test/java/
${project.build.directory}:项目构建输出目录,默认为target/
${project.build.outputDirectory}:项目主代码编译输出目录,默认为target/classes
${project.build.testOutputDirectory}:项目测试代码编译输出目录,默认为target/test-classes
${project.groupId}:项目的groupId
${project.artifactId}:项目的artifactId
${project.version}:项目的version,与${version}等价
${project.build.finalName}:项目打包输出文件的名称,默认为${project.artifactId}-${project.version}
${basedir} 项目路径
// ${父标签.子标签}
${settings.localRepository}
// 查看命令
mvn help:system
// 所有的环境变量都可以使用env.开头的方式来进行引用,如:
${env.JAVA_HOME}
pom中输入
<properties>
<!-- 项目的主源码目录,默认为src/main/java/ -->
<a>${project.build.sourceDirectory}</a>
<!-- 项目的测试源码目录,默认为src/test/java/ -->
<b>${project.build.testSourceDirectory}</b>
<!-- 项目构建输出目录,默认为target/ -->
<c>${project.build.directory}</c>
<!-- 项目主代码编译输出目录,默认为target/classes -->
<d>${project.build.outputDirectory}</d>
<!-- 项目测试代码编译输出目录,默认为target/test-classes -->
<e>${project.build.testOutputDirectory}</e>
<!-- 项目的groupId -->
<f>${project.groupId}</f>
<!-- 项目的artifactId -->
<g>${project.artifactId}</g>
<!-- 项目的version,与${version}等价-->
<h>${project.version}</h>
<!-- 项目打包输出文件的名称,默认为${project.artifactId}-${project.version} -->
<i>${project.build.finalName}</i>
<!-- setting属性 -->
<!-- 获取本地仓库地址-->
<a1>${settings.localRepository}</a1>
<!-- 系统属性 -->
<!-- 用户目录 -->
<a2>${user.home}</a2>
<!-- 环境变量属性,获取环境变量JAVA_HOME的值 -->
<a3>${env.JAVA_HOME}</a3>
</properties>
到项目根目录执行如下命令
mvn help:effective-pom -pl :maven-nexu-test > finally.xml
项目根目录会出现一个 finally.xml 内容如下(注意 : maven-nexu-test 改为自己的项目名)
<properties>
<a>C:\Users\LENOVO\Desktop\apache-tomcat-8.5.56-src\maven-nexu-test\src\main\java</a>
<a1>${settings.localRepository}</a1>
<a2>C:\Users\LENOVO</a2>
<a3>C:\JDK\Java\jdk1.8.0_202</a3>
<b>C:\Users\LENOVO\Desktop\apache-tomcat-8.5.56-src\maven-nexu-test\src\test\java</b>
<c>C:\Users\LENOVO\Desktop\apache-tomcat-8.5.56-src\maven-nexu-test\target</c>
<d>C:\Users\LENOVO\Desktop\apache-tomcat-8.5.56-src\maven-nexu-test\target\classes</d>
<e>C:\Users\LENOVO\Desktop\apache-tomcat-8.5.56-src\maven-nexu-test\target\test-classes</e>
<f>com.wang</f>
<g>maven-nexu-test</g>
<h>1.0</h>
<i>maven-nexu-test-1.0</i>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
2.Maven多环境
抛出问题:
我们写的项目会操作数据库,所以我们需要一个配置文件来放数据库的配置信息,配置文件一般都放在src/main/resources中,在这个目录中新建一个jdbc.properties文件
上面jdbc的配置的是开发库的db信息,打包之后生成的jar中也是上面开发环境的配置,那么上测试环境是不是我们需要修改上面的配置,最终上线的时候,上面的配置是不是又得重新修改一次,相当痛苦的。
我们能不能写3套环境的jdbc配置,打包的时候去指定具体使用那套配置?
还是你们聪明,maven支持这么做,pom.xml的project元素下面提供了一个profiles元素可以用来对多套环境进行配置。
maven中设置 maven-resources-plugin:2.6插件复制 resources资源文件时的编码格式
<properties>
<encoding>UTF-8</encoding>
</properties>
设置资源文件内容动态替换
资源文件中可以通过${maven属性}来引用maven属性中的值,打包的过程中这些会被替换掉,替换的过程默认是不开启的,需要手动开启配置
<build>
<resources>
<resource>
<!-- 指定资源文件的目录 -->
<directory>${project.basedir}/src/main/resources</directory>
<!-- 是否开启过滤替换配置,默认是不开启的 -->
<filtering>true</filtering>
</resource>
</resources>
<testResources>
<testResource>
<!-- 指定资源文件的目录 -->
<directory>${project.basedir}/src/test/resources</directory>
<!-- 是否开启过滤替换配置,默认是不开启的 -->
<filtering>true</filtering>
</testResource>
</testResources>
</build>
自定义替换的分隔符
// 配置maven-resources-plugin插件的参数
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<configuration>
<!-- 是否使用默认的分隔符,默认分隔符是${*}和@ ,这个地方设置为false,表示不启用默认分隔符配置-->
<useDefaultDelimiters>false</useDefaultDelimiters>
<!-- 自定义分隔符 -->
<delimiters>
<delimiter>$*$</delimiter>
<delimiter>##</delimiter>
</delimiters>
</configuration>
</plugin>
</plugins>
指定需要替换的资源文件
// 指定resources那些文件会被复制
<resources>
<resource>
<!-- 指定资源文件的目录 -->
<directory>${project.basedir}/src/main/resources</directory>
<!-- 是否开启过滤替换配置,默认是不开启的 -->
<filtering>true</filtering>
<includes>
<include>**/jdbc.properties</include>
</includes>
<excludes>
<exclude>**/const.properties</exclude>
</excludes>
</resource>
</resources>
上面使用includes列出需要被处理的,使用excludes排除需要被处理的资源文件列表,采用通配符的写法,**匹配任意深度的文件路径,*匹配任意个字符。
使用profiles处理多环境构建问题
<profiles>
<!-- 开发环境使用的配置 -->
<profile>
<id>dev</id>
<properties>
<jdbc.url>dev jdbc url</jdbc.url>
<jdbc.username>dev jdbc username</jdbc.username>
<jdbc.password>dev jdbc password</jdbc.password>
</properties>
</profile>
<!-- 测试环境使用的配置 -->
<profile>
<id>test</id>
<properties>
<jdbc.url>test jdbc url</jdbc.url>
<jdbc.username>test jdbc username</jdbc.username>
<jdbc.password>test jdbc password</jdbc.password>
</properties>
</profile>
<!-- 线上环境使用的配置 -->
<profile>
<id>prod</id>
<properties>
<jdbc.url>test jdbc url</jdbc.url>
<jdbc.username>test jdbc username</jdbc.username>
<jdbc.password>test jdbc password</jdbc.password>
</properties>
</profile>
</profiles>
输入如下命令指定环境
mvn clean package -pl :maven-nexu-test -Pdev
注意上面命令中多了一个-Pdev参数,-P后面跟的是pom.xml中profile的id,表示需要使用那套环境进行构建。此时我们使用的是dev环境,即开发环境。
开启默认环境配置
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<jdbc.url>dev jdbc url</jdbc.url>
<jdbc.username>dev jdbc username</jdbc.username>
<jdbc.password>dev jdbc password</jdbc.password>
</properties>
</profile>
没有指定环境时默认是dev
通过maven属性来控制环境的开启(自定义属性)
<!-- 配置多套环境 -->
<profiles>
<!-- 开发环境使用的配置 -->
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
<!-- 构建时指定该命令可激活此环境 -->
<property>
<name>env</name>
<value>env_dev</value>
</property>
</activation>
<properties>
<jdbc.url>dev jdbc url</jdbc.url>
<jdbc.username>dev jdbc username</jdbc.username>
<jdbc.password>dev jdbc password</jdbc.password>
</properties>
</profile>
<!-- 测试环境使用的配置 -->
<profile>
<id>test</id>
<activation>
<property>
<name>env</name>
<value>env_test</value>
</property>
</activation>
<properties>
<jdbc.url>test jdbc url</jdbc.url>
<jdbc.username>test jdbc username</jdbc.username>
<jdbc.password>test jdbc password</jdbc.password>
</properties>
</profile>
<!-- 线上环境使用的配置 -->
<profile>
<id>prod</id>
<activation>
<property>
<name>env</name>
<value>env_prod</value>
</property>
</activation>
<properties>
<jdbc.url>prod jdbc url</jdbc.url>
<jdbc.username>prod jdbc username</jdbc.username>
<jdbc.password>prod jdbc password</jdbc.password>
</properties>
</profile>
</profiles>
输入命令
mvn clean package -pl :项目名 -Denv=env_prod
启动的时候指定多个环境
mvn clean package -pl :项目名称 -Pdev,test,prod
可以在-P参数后跟多个环境的id,多个之间用逗号隔开,当使用多套环境的时候,多套环境中的maven属性会进行合并,如果多套环境中属性有一样的,后面的会覆盖前面的。
查看目前有哪些环境
mvn help:all-profiles
// 当前激活的环境
mvn help:active-profiles
配置分散问题
背景:父模块b2b下存在两个子模块b2b-account-service ,b2b-order-service
两个子模块都有各自不同环境的数据库配置,dev test prod 这样数据库配置存在6份如果更多的模块数据库配置将增加。
解决方案:将数据库配置统一放到b2b中给子模块引用
实现步骤:
b2b中创建3个(dev test prod)如下文件
b2b/config/dev.properties
# b2b-account-service jdbc配置信息
b2b-account-service.jdbc.url=dev_account_jdbc_url
b2b-account-service.jdbc.username=dev_account_jdbc_username
b2b-account-service.jdbc.password=dev_account_jdbc_password
# b2b-order-service jdbc配置信息
b2b-order-service.jdbc.url=dev_order_jdbc_url
b2b-order-service.jdbc.username=dev_order_jdbc_username
b2b-order-service.jdbc.password=dev_order_jdbc_password
b2b/config/test.properties
# b2b-account-service jdbc配置信息
b2b-account-service.jdbc.url=test_account_jdbc_url
b2b-account-service.jdbc.username=test_account_jdbc_username
b2b-account-service.jdbc.password=test_account_jdbc_password
# b2b-order-service jdbc配置信息
b2b-order-service.jdbc.url=test_order_jdbc_url
b2b-order-service.jdbc.username=test_order_jdbc_username
b2b-order-service.jdbc.password=test_order_jdbc_password
b2b/config/prod.properties
# b2b-account-service jdbc配置信息
b2b-account-service.jdbc.url=prod_account_jdbc_url
b2b-account-service.jdbc.username=prod_account_jdbc_username
b2b-account-service.jdbc.password=prod_account_jdbc_password
# b2b-order-service jdbc配置信息
b2b-order-service.jdbc.url=prod_order_jdbc_url
b2b-order-service.jdbc.username=prod_order_jdbc_username
b2b-order-service.jdbc.password=prod_order_jdbc_password
b2b-account-service 增加配置文件jdbc.properties:
jdbc.url=${b2b-account-service.jdbc.url}
jdbc.username=${b2b-account-service.jdbc.username}
jdbc.password=${b2b-account-service.jdbc.password}
b2b-order-service 增加配置文件jdbc.properties:
jdbc.url=${b2b-order-service.jdbc.url}
jdbc.username=${b2b-order-service.jdbc.username}
jdbc.password=${b2b-order-service.jdbc.password}
b2b-account/pom.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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.javacode2018</groupId>
<artifactId>b2b-account-service</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.javacode2018</groupId>
<artifactId>b2b-account-api</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<properties>
<!-- 指定资源文件复制过程中采用的编码方式 -->
<encoding>UTF-8</encoding>
</properties>
<!-- 配置多套环境 -->
<profiles>
<!-- 开发环境使用的配置 -->
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
<property>
<name>env</name>
<value>env_dev</value>
</property>
</activation>
<build>
<filters>
<filter>../../config/dev.properties</filter>
</filters>
</build>
</profile>
<!-- 测试环境使用的配置 -->
<profile>
<id>test</id>
<activation>
<property>
<name>env</name>
<value>env_test</value>
</property>
</activation>
<build>
<filters>
<filter>../../config/test.properties</filter>
</filters>
</build>
</profile>
<!-- 线上环境使用的配置 -->
<profile>
<id>prod</id>
<activation>
<property>
<name>env</name>
<value>env_prod</value>
</property>
</activation>
<build>
<filters>
<filter>../../config/prod.properties</filter>
</filters>
</build>
</profile>
</profiles>
<build>
<resources>
<resource>
<!-- 指定资源文件的目录 -->
<directory>${project.basedir}/src/main/resources</directory>
<!-- 是否开启过滤替换配置,默认是不开启的 -->
<filtering>true</filtering>
</resource>
</resources>
<testResources>
<testResource>
<!-- 指定资源文件的目录 -->
<directory>${project.basedir}/src/test/resources</directory>
<!-- 是否开启过滤替换配置,默认是不开启的 -->
<filtering>true</filtering>
</testResource>
</testResources>
</build>
</project>
b2b-order/pom.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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.javacode2018</groupId>
<artifactId>b2b-order-service</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>b2b-account-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>b2b-order-api</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<properties>
<!-- 指定资源文件复制过程中采用的编码方式 -->
<encoding>UTF-8</encoding>
</properties>
<!-- 配置多套环境 -->
<profiles>
<!-- 开发环境使用的配置 -->
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
<property>
<name>env</name>
<value>env_dev</value>
</property>
</activation>
<build>
<filters>
<filter>../../config/dev.properties</filter>
</filters>
</build>
</profile>
<!-- 测试环境使用的配置 -->
<profile>
<id>test</id>
<activation>
<property>
<name>env</name>
<value>env_test</value>
</property>
</activation>
<build>
<filters>
<filter>../../config/test.properties</filter>
</filters>
</build>
</profile>
<!-- 线上环境使用的配置 -->
<profile>
<id>prod</id>
<activation>
<property>
<name>env</name>
<value>env_prod</value>
</property>
</activation>
<build>
<filters>
<filter>../../config/prod.properties</filter>
</filters>
</build>
</profile>
</profiles>
<build>
<resources>
<resource>
<!-- 指定资源文件的目录 -->
<directory>${project.basedir}/src/main/resources</directory>
<!-- 是否开启过滤替换配置,默认是不开启的 -->
<filtering>true</filtering>
</resource>
</resources>
<testResources>
<testResource>
<!-- 指定资源文件的目录 -->
<directory>${project.basedir}/src/test/resources</directory>
<!-- 是否开启过滤替换配置,默认是不开启的 -->
<filtering>true</filtering>
</testResource>
</testResources>
</build>
</project>
执行命令
mvn clean package -pl :b2b-account-service,:b2b-order-service -Pdev