今天遇到一個問題,就是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文件的內容隨着打包的參數不同而變化了,從而也就實現了我們多環境的配置自動打包了。
