maven中filter的使用方法

1 Filtering 的使用

1.1 使用項目中屬性

在資源文件中能夠使用${...}來表示變量。變量的定義能夠爲系統屬性,項目中屬性,篩選的資源以及命令。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

1.2 使用命令行

此外,也能夠使用「-D」後面加上聲明的命令行的方式來指定內容,例如: mvn resources:resources -Dname="world" 命令執行後,target/classes/hello.txt 文件內容爲:ui

hello world
複製代碼

1.2 使用自定義屬性

更近一步,不只能夠使用預先定義的項目變量,也能夠使用在<properties>標籤下自定義變量。例如:spa

src/main/resources/hello.txt 文件中將文件內容更改成:插件

Hello ${your.name}
複製代碼

在pom中<properties>標籤下定義自定義變量 your.name

<project>
  ...
  <properties>
    <your.name>world</your.name>
  </properties>
  ...
</project>
複製代碼

1.3 spring boot框架 與 Filtering 的使用

若是在 pom 文件中繼承了 spring-boot-starter-parent pom文件,那麼maven-resources-plugins的 Filtering 默認的過濾符號就從 ${*} 改成 @...@ (i.e. @maven.token@ instead of ${maven.token})來防止與 spring 中的佔位符衝突。點擊 這裏 查看文檔

2 filter 的使用

爲了管理項目,能夠將全部變量和 其對應的值 寫入一個獨立的文件,這樣就不須要重寫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等二進制文件可能致使損壞的輸出。爲了防止這樣的問題,能夠配置文件擴展名不會被過濾。

3 Binary filtering

該插件將阻止二進制文件過濾,而無需爲如下文件擴展名添加一些排除配置:

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>
複製代碼

4 練習

在單獨文件中定義變量以及值,而且將值對 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
複製代碼
相關文章
相關標籤/搜索