今天遇到一個問題,就是properties檔案中賦值用的這種形式${xxx},真正的值是配置在pom的profile中,但是未生效。
後來找到原因,原來是pom中少了一段程式碼:
<build>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
<resource>
<directory>${project.basedir}/bin</directory>
<targetPath>/bin</targetPath>
<filtering>true</filtering>
</resource>
</resources>
</build>
關於profile的詳細介紹參見如下:
使用maven管理專案有一個好處是就是可以針對不同的環境使用不同的編譯打包設定,方便了多環境下的打包部署,一般我們開發專案都會有至少開發環境和正式環境兩個,針對這兩個環境的配置資訊也會有所不同,比如資料庫的配置等。我們可以使用maven的profile定義來進行區分,比如我們在專案的pom檔案中定義如下片段:
-
<project>
-
<modelVersion>4.0.0</modelVersion>
-
<groupId>cc.mzone</groupId>
-
<artifactId>myjar</artifactId>
-
<version>0.1</version>
-
<packaging>jar</packaging>
-
<build>
-
<resources>
-
<resource>
-
<directory>src/main/resources</directory>
-
<includes>
-
<include>*.*</include>
-
</includes>
-
<filtering>true</filtering>
-
</resource>
-
</resources>
-
</build>
-
-
<properties>
-
<jdbc.url>jdbc:mysql://localhost:3306/abc</jdbc.url>
-
<jdbc.username>root</jdbc.username>
-
<jdbc.password>root</jdbc.password>
-
</properties>
-
-
<profiles>
-
<profile>
-
<id>product</id>
-
<properties>
-
<jdbc.url>jdbc:mysql://localhost:3306/abc123</jdbc.url>
-
<jdbc.username>rootuser</jdbc.username>
-
<jdbc.password>rootpwd</jdbc.password>
-
</properties>
-
</profile>
-
</profiles>
-
</project>
這裡我們在pom檔案中定義了資料庫的相關配置,同時定義了一個profile,其id為product,同時在這個profile中也定義了資料庫的相關配置。這樣我們使用mvn package命令時就可以使用預設的jdbc設定,當我們使用mvn package -P product時maven就會自動使用id為product的profile中的資料庫配置,這個是maven讀取屬性配置檔案的覆蓋。
然後再看pom檔案中的resources段的配置:
-
<resources>
-
<resource>
-
<directory>src/main/resources</directory>
-
<includes>
-
<include>*.*</include>
-
</includes>
-
<filtering>true</filtering>
-
</resource>
-
</resources>
其中最重要的是<filtering>true</filtering>這段,這個配置的意思是過濾上面指定屬性檔案中的佔位符,佔位符是${變數名稱}這樣的形式,maven會自動讀取配置檔案,然後解析其中的佔位符,使用上面pom檔案中定義的屬性進行替換。我們可以在src/main/resources下定義一個jdbc.properties配置檔案,內容如下:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=${jdbc.url}
jdbc.username=${jdbc.username}
jdbc.password=${jdbc.password}
執行的效果如下:
## 使用預設的配置資訊
mvn clean package
## 使用product環境的配置資訊
mvn clean package -P product
分兩次執行上面的命令後,然後到專案的target目錄下檢視打包後的結果,可以看到jdbc.properties檔案的內容隨著打包的引數不同而變化了,從而也就實現了我們多環境的配置自動打包了。