在資源文件中能夠使用${...}
來表示變量。變量的定義能夠爲系統屬性,項目中屬性,篩選的資源以及命令。html
例如: 在 src/main/resources/hello.txt
中包含如下內容:spring
Hello ${name}
複製代碼
而且pom.xml文件中代碼以下:apache
<project>
...
<name>My Resources Plugin Practice Project</name>
...
<build>
...
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
...
</resources>
...
</build>
...
</project>
複製代碼
執行 mvn resources:resources
產生的 target
文件夾中 生成的 target/classes/hello.txt
文件和src/main/resources/hello.txt
文件有着同樣的內容:bash
Hello ${name}
複製代碼
然而,在pom 文件<resource>
標籤下加入<filtering>
標籤 而且 設置爲 true
:框架
...
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
...
複製代碼
執行 mvn resources:resources
命令後,target/classes/hello.txt
文件內容發生了變化:maven
hello My Resources Plugin Practice Project
複製代碼
這是由於定義在 pom 中的 <name>
標籤中的值替換了 hello.txt
文件中 name
變量。spring-boot
此外,也能夠使用「-D」
後面加上聲明的命令行的方式來指定內容,例如: mvn resources:resources -Dname="world"
命令執行後,target/classes/hello.txt
文件內容爲:ui
hello world
複製代碼
更近一步,不只能夠使用預先定義的項目變量,也能夠使用在<properties>
標籤下自定義變量。例如:spa
在 src/main/resources/hello.txt
文件中將文件內容更改成:插件
Hello ${your.name}
複製代碼
在pom中<properties>
標籤下定義自定義變量 your.name
:
<project>
...
<properties>
<your.name>world</your.name>
</properties>
...
</project>
複製代碼
若是在 pom 文件中繼承了 spring-boot-starter-parent
pom文件,那麼maven-resources-plugins的 Filtering 默認的過濾符號就從 ${*}
改成 @...@
(i.e. @maven.token@ instead of ${maven.token})來防止與 spring 中的佔位符衝突。點擊 這裏 查看文檔
爲了管理項目,能夠將全部變量和 其對應的值 寫入一個獨立的文件,這樣就不須要重寫pom文件或者每次構建都設置值。爲此能夠增長一個 filter
:
<project>
...
<name>My Resources Plugin Practice Project</name>
...
<build>
...
<filters>
<filter>[a filter property]</filter>
</filters>
...
</build>
...
</project>
複製代碼
例如: 新建文件 my-filter-values.properties
內容爲:
your.name = world
複製代碼
在pom中增長filter:
...
<filters>
<filter>my-filter-values.properties</filter>
</filters>
...
複製代碼
注:不要過濾二進制內容的文件(如:圖像)!會致使輸出損壞。
有文本和二進制資源文件狀況下,推薦使用兩個獨立的文件夾。文件夾 src/main/resources (默認)
中存放不須要過濾的資源文件,src/main/resources-filtered
文件夾存放須要過濾的資源文件。
<project>
...
<build>
...
<resources>
<resource>
<directory>src/main/resources-filtered</directory>
<filtering>true</filtering>
</resource>
...
</resources>
...
</build>
...
</project>
複製代碼
注:正如前面所提到的,過濾圖像、pdf等二進制文件可能致使損壞的輸出。爲了防止這樣的問題,能夠配置文件擴展名不會被過濾。
該插件將阻止二進制文件過濾,而無需爲如下文件擴展名添加一些排除配置:
jpg, jpeg, gif, bmp 以及 png
複製代碼
若是想要添加補充文件擴展名,能夠使用如下配置簡單地實現
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<configuration>
...
<nonFilteredFileExtensions>
<nonFilteredFileExtension>pdf</nonFilteredFileExtension>
<nonFilteredFileExtension>swf</nonFilteredFileExtension>
</nonFilteredFileExtensions>
...
</configuration>
</plugin>
</plugins>
...
</build>
...
</project>
複製代碼
在單獨文件中定義變量以及值,而且將值對 resiurce文件夾下hello.txt文件中的變量定義符號進行替換。 文件結構:
├─ src
│ └─ main
│ ├─ resources
│ │ └─ hello.txt
│ └─ resources-filtered
│ └─ my-filter-values.properties
└─ pom.xml
複製代碼
hello.txt
hello ${your.name}
複製代碼
my-filter-values.properties
your.name = nomiracle
複製代碼
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>test</artifactId>
<version>1.0</version>
<name>My Resources Plugin Practice Project</name>
<build>
<filters>
<filter>src/main/resources-filtered/my-filter-values.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
複製代碼
執行 mvn clean resources:resources
命令,生成的 target 文件夾目錄結構爲:
target
└─ classes
└─ hello.txt
複製代碼
其中 hello.txt 文件中變量已經被替換:
hello nomiracle
複製代碼