前言
最近在一个工程下面敲代码,但是不懂这个工程时怎么配置的,有很多环境下的配置文件,这些配置文件也都在resources文件夹下,不清楚这些文件是如何被读取的,而且不用环境,程序是如何识别环境,根据环境去读取配置,而没有读其它环境上的配置,所以今天来看看工程时如何配置这些的。
问题描述
如下图所示:
从图片中可以看到,source文件夹下面有不同环境的配置文件,部署到不同机器上可以对应不同的环境,从而调用不同的配置文件,但是这些文件按理说都会被spring 读取出来,那为什么会指定环境下的配置文件呢?
本文将来解析这个问题。
pom.xml中的resources
<resources>
<resource>
<directory>src/main/resources</directory> # 选取该目录下的所有文件
<excludes>
<exclude>**/source/*/*</exclude> # 排除掉source文件下的所有文件
</excludes>
</resource>
<resource>
<!-- 替换sentry.properties中的appName变量 -->
<directory>src/main/resources</directory> # 选取该目录下的所有文件
<includes>
<include>sentry-javaagent-home/sentry.properties</include> # 加载文件,可以填写多个
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources/source/${runtime.env}</directory> # 加载source目录下${runtime.env}文件夹所有的配置文件。
<filtering>true</filtering> # 这里不能理解为过滤,而是开启替换,为true,表明可以使用${}变量
</resource>
</resources>
备注:其中${runtime.env} 是读取runtime.env 这个变量的值,runtime.env 一般是定义在pom文件中的标签中定义的变量 ,或者单独的*.properties文件中。
从上面pom文件中可以看出,通过includes 标签和 excludes标签来读取指定环境中需要的配置文件。includes:指定加载的文件或文件夹
,excludes:排除掉指定的文件或文件夹,不加载
。
工程怎么知道具体的环境?
这里就要说一下profiles这个标签了,在maven多模块项目中最外层的pom.xml文件中可以指定这个profiles标签,因为这个profiles是全局的,放在最外层。
<profile>标签就像<dependency>一样是pom文件里的一个xml元素,在profile里几乎可以定义所有在pom里的定义
的内容(<dependencies>,<properties>,插件配置等等,不过不能再定义他自己了)。当一个profile被激活时,
在它定义的<dependencies>,<properties>等就会覆盖掉原pom里定义的相同内容,从而可以通过激活不同的profile
来使用不同的配置。
激活方式有两种:
<!-- 默认激活 -->
<profiles>
<profile>
<activation>
<activeByDefault>true</activeByDefault> # activeByDefault 标签 为true表明就是隐式激活
</activation>
</profile>
</profiles>
mvn -U clean package -Ptest,local,!ignore
,一般指定一个环境,不会指定多个环境。在pom.xml中,一般默认的是本地配置,一般部署在服务器中都会指定环境,采取显式激活方式,本工程的pom.xml配置如下:
<profiles>
<profile>
<id>local</id>
<activation>
<activeByDefault>true</activeByDefault> # 隐式激活
</activation>
<properties>
<runtime.env>local</runtime.env> # 指定了变量 runtime.env,如果要取这个变量使用${runtime.env}
<spring.profiles.active>local</spring.profiles.active>
</properties>
</profile>
<profile>
<id>unittest</id>
<properties>
<runtime.env>localtest</runtime.env>
<spring.profiles.active>unittestjd</spring.profiles.active>
</properties>
</profile>
<profile>
<id>dev</id>
<properties>
<runtime.env>test</runtime.env>
<spring.profiles.active>${spring.profiles.active}</spring.profiles.active>
</properties>
</profile>
</profiles>
build标签的resources标签 与 maven-resources-plugin
在上面的pom代码块中,我们看到maven的很多标签,其中resources标签是指定读取的配置文件或文件夹中的文件,这里其实是maven-resources-plugin来处理的,当然你也可以不使用resources标签来实现读取配置文件,通过maven-resources-plugin也可以达到这个目的,
<!--
此plugin可以用利用此plugin,把源代码中的xml文件,打包到相应位置,这里主要是为了打包Mybatis的mapper.xml文件,如下只
是截取了与 maven-resources-plugin 相关pom文件配置,其它部分按照自己的工程目录来。
-->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.5</version>
<executions>
<execution>
<id>copy-xmls</id>
<phase>process-sources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/classes</outputDirectory> # 读取打包到target/classes里
<resources>
<resource>
<directory>${basedir}/src/main/java</directory> # 指定目录
<includes>
<include>**/*.xml</include> # 加载所有的xml文件。
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
通过maven-resources-plugin 也同样可以达到同样的目的,当然其他插件也可以实现此目的,这里不累赘了重点内容。
注意
记得直接拷贝代码一定要把代码块里的注释去掉,会报错。
参考博客
Maven学习笔记(十二)-maven打包之resource配置
使用 Maven Profile 和 Filtering 打各种环境的包