1. 程式人生 > >maven的資源過濾

maven的資源過濾

maven的過濾資源需要結合maven的2個定義才能實現,分別是:

  • profile
  • resources

下面分開來做介紹。

profile

profile可以讓我們定義一系列的配置資訊,然後指定其啟用條件。這樣我們就可以定義多個profile,然後每個profile對應不同的啟用條件和配置資訊,從而達到不同環境使用不同配置資訊的效果。需要掌握profile的定義以及啟用條件。後面結合resources會介紹。

resources

resources是指定maven編譯資原始檔指定到何處的,例如maven的標準資源目錄結構是src/main/resources(這個在超級pom中定義到了),maven進行編譯時候就會將resources中的資原始檔放到web的WEB-INF/classes下.具體如何和資源目錄有關係,後面結合的時候後講到。 
超級pom中定義的resources:

<resources>
     <resource>
            <directory>${project.basedir}/src/main/resources</directory>
    </resource>
</resources>
<testResources>
      <testResource>
           <directory>${project.basedir}/src/test/resources</directory>
      </testResource>
</testResources>

 

maven標準目錄filter

很多網際網路專案中,測試環境和線上環境都是分離的,那麼為了方便開發測試,maven專案可以在編譯時選取不同的配置檔案,如何設定呢,看看以下例子?。

例子如下: 
我在java/src/resources目錄中定義了jdbc.properties檔案內容如下:

#dataSource configure
#jdbc.connection.url=jdbc:mysql://localhost:3306/test
#jdbc.connection.username=root
#jdbc.connection.password=123456


jdbc.connection.url=${jdbc.url}
jdbc.connection.username=${jdbc.username}
jdbc.connection.password=${jdbc.password}
  • 通過maven編譯後再WEB-INF/classes中得到的jdbc.properties檔案內容如下:
#dataSource configure
#jdbc.connection.url=jdbc:mysql://localhost:3306/test
#jdbc.connection.username=root
#jdbc.connection.password=123456


jdbc.connection.url=abcd
jdbc.connection.username=cccc
jdbc.connection.password=dddd

具體是怎麼做到的呢?屬性在使用${}的方式獲取,屬性值肯定得在pom中定義,這個在專案pom.xml中的定義方式如下:

<profiles>
        <!-- 開發/測試環境,預設啟用 -->
        <profile>
            <id>test</id>
            <properties>
                <jdbc.url>abcd</jdbc.url>
                <jdbc.username>cccc</jdbc.username>
                <jdbc.password>dddd</jdbc.password>
            </properties>
            <activation>
                <!--預設啟用的是dev環境配置 -->
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>

        <!-- 生產環境 -->
        <profile>
            <id>product</id>
            <properties>
                <env>product</env>
            </properties>
        </profile>
    </profiles>

為了能讓profiles中的內容能讓resources中的檔案使用到,還需要上面說到的resources外掛,定義資訊如下:

<build>
        <finalName>idea-maven-introduce</finalName>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

filtering設定為true很關鍵,不然引用不到profiles中的內容。但是這樣做,就算設定好了嗎,如何切換不同的屬性的呢,還是沒能體現到啊

profiles的啟用方式:

  1. 預設啟用方式 
    根據上面的例子,定義了一個
<activation>
        <!--預設啟用的是dev環境配置 -->
         <activeByDefault>true</activeByDefault>
</activation>

這個是預設的啟用方式,意思就是你什麼都不做,直接使用標準的package打包時候會將該test定義屬效能讓resources下面的檔案獲取到。

使用標準的maven目錄file進行管理profiles

src/main/java/filters中的檔案如下: 
aaa.properties

jdbc.url=aaajdbc:mysql://192.168.120.220:3306/testdb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull
jdbc.username=aaatestuser
jdbc.password=aaa123456

bbb.properties

jdbc.url=bbbjdbc:mysql://192.168.120.220:3306/testdb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull
jdbc.username=bbbtestuser
jdbc.password=bbb123456

file管理配置檔案例子1:

pom.xml檔案的內容:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.lgy</groupId>
    <artifactId>idea-maven-introduce</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>idea-maven-introduce Maven Webapp</name>
    <url>http://maven.apache.org</url>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
    </dependencies>



    <build>
        <finalName>idea-maven-introduce</finalName>

        <filters> <!-- 指定使用的 filter -->
            <filter>src/main/filters/aaa.properties</filter>
        </filters>

        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>
</project>

此時去掉了profiles,直接用filters指定要使用的filter,此時,resources中要用到的值都會從aaa.properties.

結合profiles的啟用機制能更好的使用filers目錄中的內容,pom.xml中的內容如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.lgy</groupId>
    <artifactId>idea-maven-introduce</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>idea-maven-introduce Maven Webapp</name>
    <url>http://maven.apache.org</url>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
    </dependencies>


    <profiles>
        <!-- 開發/測試環境,預設啟用 -->
        <profile>
            <id>test</id>
            <properties>
                <dev.name>aaa</dev.name>
            </properties>

            <activation>
                <!--預設啟用的是dev環境配置 -->
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>

        <!-- 生產環境 -->
        <profile>
            <id>product</id>
            <properties>
                <dev.name>bbb</dev.name>
            </properties>
        </profile>
    </profiles>

    <build>
        <finalName>idea-maven-introduce</finalName>

        <filters> <!-- 指定使用的 filter -->
            <filter>src/main/filters/${dev.name}.properties</filter>
        </filters>

        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>
</project>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59

此時預設的啟用方式就是profiles中id為test,filters就會去尋找aaa.peroperties中的對應的屬性值給resources中的資原始檔進行使用!

總結

有關知識點的內容講解有如下: 
- maven profiles標籤的使用 
- resources 資源標籤的使用 
- filters 標籤的使用