利用maven的resources、filter和profile實現不一樣環境使用不一樣配置文件

基本概念說明(resources、filter和profile):html

  1. profiles定義了各個環境的變量id
  2. filters中定義了變量配置文件的地址,其中地址中的環境變量就是上面profile中定義的值
  3. resources中是定義哪些目錄下的文件會被配置文件中定義的變量替換,通常咱們會把項目的配置文件放在src/main/resources下,像db,bean等,裏面用到的變量在打包時就會根據filter中的變量配置替換成固定值

在咱們日常的java開發中,會常常使用到不少配製文件(xxx.properties,xxx.xml),而當咱們在本地開發(dev),測試環境測試(test),線上生產使用(product)時,須要不停的去修改這些配製文件,次數一多,至關麻煩。如今,利用maven的filter和profile功能,咱們可實如今編譯階段簡單的指定一個參數就能切換配製,提升效率,還不容易出錯,詳解以下。java

一,原理:

利用filter實現對資源文件(resouces)過濾

maven filter可利用指定的xxx.properties中對應的key=value對資源文件中的${key}進行替換,最終把你的資源文件中的username=${key}替換成username=valueweb

利用profile來切換環境

maven profile可以使用操做系統信息,jdk信息,文件是否存在,屬性值等做爲依據,來激活相應的profile,也可在編譯階段,經過mvn命令加參數 -PprofileId 來手工激活使用對應的profile spring

結合filter和profile,咱們就能夠方便的在不一樣環境下使用不一樣的配製apache

二,配置:

profiles配置多環境加載資源文件的幾種方式
首先,依據maven的項目結構, 在src->main->filters創建不一樣環境資源文件目錄, 放置資源文件mybatis

src/main/filters/dev/jdbc.properties -- 開發環境
src/main/filters/product/jdbc.properties -- 生產環境maven

圖片描述

第一種方法

profiles->profile->build-filters-filter加載指定資源文件對源文件進行屬性替換測試

<build>
<resources>
    <!-- 先指定 src/main/resources下全部文件及文件夾爲資源文件 -->
    <resource>
        <directory>src/main/resources</directory>
        <includes>
            <include>**/*</include>
        </includes>
    </resource>
    <!-- 過濾指定文件,如spring-mybatis.xml,文件中的${key}會被替換掉爲真正的值 -->
    <resource>
        <directory>src/main/resources</directory>
        <includes>
            <include>spring-mybatis.xml</include>
        </includes>
        <filtering>true</filtering>
    </resource>
</resources>
</build>

<profiles>
<profile>
    <id>dev</id>
    <!-- 默認激活,使用dev目錄中的屬性文件來替換設置過濾的資源文件中的變量 -->
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <build>
        <filters>
            <filter>src/main/filters/dev/jdbc.properties</filter>
        </filters>
    </build>
</profile>
<profile>
    <id>product</id>
    <build>
        <filters>
            <filter>src/main/filters/product/jdbc.properties</filter>
        </filters>
    </build>
</profile>
</profiles>

第二種方法

profiles->profile->properties設置變量,build-filters-filter指定加載變量指定資源文件ui

<build>
<resources>
    <resource>
        <directory>src/main/resources</directory>
        <!-- src/main/resources文件中所有開啓過濾 -->
        <includes>
            <include>**/*</include>
        </includes>
        <filtering>true</filtering>
    </resource>
    <filters>
        <filter>src/main/filters/${package.environment}/jdbc.properties</filter>
    </filters>
</resources>
</build>

<profiles>
<profile>
    <id>dev</id>
    <!-- 默認激活,設置package.environment屬性由filter引用 -->
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
        <package.environment>dev</package.environment>
    </properties>
</profile>
<profile>
    <id>product</id>
    <properties>
        <package.environment>product</package.environment>
    </properties>
</profile>
</profiles>

結合使用插件maven-war-plugin

<build>
<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.2.0</version>
        <configuration>
            <archive>
                <addMavenDescriptor>true</addMavenDescriptor>
            </archive>
            <warName>${project.build.finalName}</warName>
            <webResources>
                <resource>
                    <directory>src/main/filters/${package.environment}</directory>
                    <targetPath>WEB-INF/classes</targetPath>
                </resource>
            </webResources>
        </configuration>
        <!-- 也能夠在插件中設置filtering直接替換屬性
        <configuration>
            <filters>
                <filter>src/main/filters/${package.environment}/jdbc.properties</filter>
            </filters>
            <archive>
                <addMavenDescriptor>true</addMavenDescriptor>
            </archive>
            <warName>${project.build.finalName}</warName>
            <webResources>
                <resource>
                    <directory>src/main/resources</directory>
                    <targetPath>WEB-INF/classes</targetPath>
                    <filtering>true</filtering>
                </resource>
                <resource>
                    <directory>src/main/filters/${package.environment}</directory>
                    <targetPath>WEB-INF/classes</targetPath>
                    <filtering>true</filtering>
                </resource>
            </webResources>
        </configuration>
        -->
    </plugin>
</plugins>
<resources>
    <resource>
        <directory>src/main/resources</directory>
        <includes>
            <include>**/*</include>
        </includes>
    </resource>
</resources>
</build>

<profiles>
<profile>
    <id>dev</id>
    <!-- 默認激活,設置package.environment屬性由filter引用 -->
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
        <package.environment>dev</package.environment>
    </properties>
</profile>
<profile>
    <id>product</id>
    <properties>
        <package.environment>product</package.environment>
    </properties>
</profile>
</profiles>

說明:spa

  • warName :指定了打好包的名字;
  • webResources 下 resource 下 directory :配置真正使用的資源文件存放的位置,一般這個位置不是一個標準 Web 項目應該存放資源文件的位置;
  • webResources 下 resource 下 targetPath:將上一步 directory 中配置的文件目錄下的文件都拷貝到這個目錄下;
  • webResources 下 resource 下 filtering:開啓打包以前將 directory 下的文件拷貝(覆蓋)到 targetPath 下這種配置

三,使用和總結:

經過 -P 指定 profile

mvn clean package -DskipTests -Pproduct

不指定 profile 就默認打出的是開發環境的 war 包。

mvn package -DskipTests

前兩種是在maven生命週期process-resources階段,第三種是在package階段,使用第三種方式應該注意src/main/resource目錄下不能有被替換同名文件不然IDEA編譯不經過;

也可使用spring profile進行配置, 參考地址

相關文章
相關標籤/搜索