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的啟用方式:
- 預設啟用方式
根據上面的例子,定義了一個
<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 標籤的使用