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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/randompeople/article/details/82629922

前言

最近在一个工程下面敲代码,但是不懂这个工程时怎么配置的,有很多环境下的配置文件,这些配置文件也都在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 标签元素下配置隐式激活的信息,如下。
  • <!-- 默认激活 -->
    <profiles>
      <profile>
        <activation>
            <activeByDefault>true</activeByDefault>  # activeByDefault 标签 为true表明就是隐式激活
        </activation>
      </profile>
    </profiles>

  • 显式激活:通过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 打各种环境的包

    猜你喜欢

    转载自blog.csdn.net/randompeople/article/details/82629922