pom中的resources设置

Maven项目中一般都会把配置文件放到src/main/resources目录下,有时为了满足多个环境打包发布,可能会创建一些自定义目录来放置各环境的配置文件,如:src/main/profile/dev(prod)。以上这些资源文件需要在maven的resources对其进行的配置。(如果没有自定义目录,并且resources目录下的文件也无需特殊处理,比如过滤的情况下,可以不设置)

resources配置一般如下:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
        </resource>
        <resource>
            <directory>src/main/profile/${profiles.active}</directory>
            <filtering>false</filtering>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <excludes>
                <exclude>*.yml</exclude>
            </excludes>
        </resource>
    </resources>
</build>

配置中一共有两个resource,分别用来设置项目中的两个配置文件目录。

第一个resource配置src/main/resources目录,includes中的内容表示此目录下所有以.properties、xml结尾的文件会在package时会当做资源文件打包(放在classpath下)include可设置多条,目录下规则之外的其他文件会被忽略。

第二个resourcee配置src/main/profile/${profiles.active}目录,${profiles.active}是一个变量,在这个例子中这个变量是一个表示当前环境的字符串,如dev或者prod,至于这个变量如何设置我们后面会说到。includes解释同上不赘述。excludes中可指定此目录满足exclude规则的文件不打包(本例子中以yml结尾的文件不打包),exclude规则可设置多个。

true表示resource规则选中的文件中如果有类似${key}这样的配置,就会根据maven的配置进行覆盖,使用真实值来代替${key},至于真实值如何来,后面会具体讲。false表示不替换。

如果在同一个resource中的规则发生冲突,以为准。如果都不配置,就是把directory下的所有配置文件都放到classpath下,不一样的文件取并集。这样配合下面讲的profiles也可以实现各种不同环境的自动切换。

${profiles.active}以及前面讲到被过滤的文件中的${key}会被真实值置,这些真实值来自哪里呢?
这些真实值其实都来自于profiles的配置里面,如下

<profiles>
        <profile>
            <id>localhost</id>
            <properties>
                <profiles.active>localhost</profiles.active>
                <app_name>local_app</app_name>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>development</id>
            <properties>
                <profiles.active>development</profiles.active>
               <app_name>dev_app</app_name>
            </properties>
        </profile>
        <profile>
            <id>production</id>
            <properties>
                <profiles.active>production</profiles.active>
               <app_name>prod_app</app_name>
            </properties>
        </profile>
    </profiles>

这段配置结合文章开头的配置,假设为development环境打包:
命令如下:
mvn clean package -Pdevelopment(利用id=development的profile配置打包)

${profiles.active}会被替换为development,maven会根据中设定的规则从src/main/profile/development目录下筛选出文件打包到classpath下,并把需要过滤的文件(true)中的${app_name}使用dev_app替换,其他占位符同理。利用这种特性也可以实现各种不同环境的自动切换,只要在打包时指定使用哪个profile即可:
mvn clean package -Pdevelopment

若是配置信息比较多,可能导致需要配置很多项,pom文件会看起来不够简洁,这时可以利用profile的另外一个节点属性filter,它可以指定文件,并使用指定文件中的配置信息来替换过滤文件的占位符。配置如下:

<profile>
  <id>dev</id>
  <activation>
    <activeByDefault>true</activeByDefault>
  </activation>
  <build>
   <filters>
          <filter>src/main/resources/profiles/dev/config.properties</filter>
   </filters>
  </build>
</profile>

当然你有可以按下面设置也是可以的:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
        </resource>
        <resource>
            <directory>src/main/profile/${profiles.active}</directory>
            <filtering>false</filtering>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <excludes>
                <exclude>*.yml</exclude>
            </excludes>
        </resource>
    </resources>
     <filter>src/main/resources/profiles/${profiles.active}/config.properties</filter>
</build>
posted @ 2015-09-10 17:58  缘聚潇湘  阅读(2163)  评论(0编辑  收藏  举报