pom 文件中打包配置-resources 、maven-resources-plugin

前言

最近在一个工程下面敲代码,但是不懂这个工程时怎么配置的,有很多环境下的配置文件,这些配置文件也都在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
来使用不同的配置。

激活方式有两种:

  • 隐式激活:配置profile时,可以在 profile标签的 activation 标签元素下配置隐式激活的信息,如下。 ```xml true # activeByDefault 标签 为true表明就是隐式激活 ```
  • 显式激活:通过maven 的-P参数激活指定的profile,参数的值是profile的id,多个profile以逗号分割,如果不想激活某个默认的profile,就在它的id前加个!,例如: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 打各种环境的包

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值