一、Mavenfiltering概述
Mavenfiltering是Maven的一個重要插件,主要用於過濾文件(過濾資源文件、過濾屬性文件等)。Mavenfiltering已被廣泛應用於各種項目中,使開發更加高效、優雅。下面我們來進一步了解Mavenfiltering的使用。
二、Mavenfiltering使用方法
1. 基本使用方法
Mavenfiltering的基本使用方法是在一個項目的pom.xml文件中添加以下配置:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> <executions> <execution> <id>copy-resources</id> <phase>validate</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory>${project.build.directory}</outputDirectory> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> <filtering> <filters> <filter>src/main/filters/filter.properties</filter> </filters> </filtering> </configuration> </execution> </executions> </plugin> </plugins> </build>
其中,主要配置信息如下:
- resources:指定要過濾的資源文件路徑
- directory:指定要過濾的資源文件所在目錄
- filtering:設為true,表示開啟過濾機制
- filters:指定要用到的過濾器文件
2. 過濾器
Mavenfiltering提供了幾種過濾器,常用的有以下三種:
- properties:將${xxx}形式的屬性變數替換為定義的屬性值
- tokens:將@變數@替換為定義的變數值 或 context(maven .properties, pom values, environment variables, execution properties, resource file entries)中的值
- XML:將${xxx}形式的屬性值替換,並能支持XML編碼及其它一些編碼格式
過濾器配置方法如下:
<filter> <skipExistingFilters>true</skipExistingFilters> <files> <file>src/main/filters/filter.properties</file> </files> </filter>
3. 過濾資源文件
過濾資源文件是Mavenfiltering的一大特色。
Mavenfiltering支持多種類型的資源文件,包括HTML、CSS、JavaScript、XML、Java源代碼以及屬性文件等。例如,可以指定一些屬性文件,並在編譯時將其中的屬性替換為相應的值。
<resources> <resource> <directory>${basedir}/src/resources/</directory> <filtering>true</filtering> <includes> <include>*.properties</include> </includes> </resource> </resources>
4. 使用Mavenfiltering處理jar包
Mavenfiltering還可以被用於處理jar包中的文件。 將Maven project打包成jar(包含主類等等信息),並創建一個jar-only的artifact供項目依賴使用,可使用maven-jar-plugin和maven-dependency-plugin。
配置方法如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <executions> <execution> <id>prepare-jar-exploded</id> <phase>package</phase> <goals> <goal>jar</goal> </goals> </execution> </executions> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>com.a.b.Main</mainClass> </manifest> <manifestEntries> <Properties-Overwrite>true</Properties-Overwrite> </manifestEntries> </archive> </configuration> </plugin>
5. 通過maven-assembly插件打包文件
maven-assembly插件可以將多個jar文件打包成一個jar文件,並且可以指定多個依賴包或者資源文件。
使用maven-assembly插件配置Mavenfiltering的方法如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.3.0</version> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <finalName>simpleApp</finalName> <appendAssemblyId>false</appendAssemblyId> <descriptors> <descriptor>src/main/resources/assembly.xml</descriptor> </descriptors> </configuration> </execution> </executions> </plugin>
三、Mavenfiltering應用場景
1. 多環境部署
在開發中,經常會遇到多環境問題。不同的環境分別對應不同的配置文件,例如資料庫連接、緩存伺服器等,這時就需要用到Mavenfiltering。
2. 引用資源
對於一些外部引用的資源文件,如Spring配置文件、Hibernate配置文件等,可以在這些文件中使用${xxx}的形式進行變數引用,然後通過Mavenfiltering進行替換。
3. 動態生成軟體版本號
可以通過Mavenfiltering來動態生成軟體版本號。例如在pom.xml中添加以下配置:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-filtering</artifactId> <version>3.0.2</version> <executions> <execution> <id>filter-version</id> <phase>generate-resources</phase> <goals> <goal>filter</goal> </goals> <configuration> <filters> <filter>${basedir}/src/main/filters/versions.properties</filter> </filters> <delimiters> <delimiter>@</delimiter> </delimiters> <outputDirectory>${project.build.directory}/${project.artifact}</outputDirectory> <overwrite>true</overwrite> </configuration> </execution> </executions> </plugin> </plugins> </build>
關於versions.properties的內容如下:
version=@pom.version@
4. 靈活替換pom.xml內容
在運行時,可以通過-MPACKAGE參數來替換pom.xml文件中的屬性值。
mvn -DappName=test -Dversion=1.0 -DMPACKAGE="-Dappname=test -Dversion=1.0" package
四、Mavenfiltering注意事項
1. 避免屬性名與文件名和文件路徑產生衝突
當需要在filter.xml文件中定義的環境變數與文件名和文件路徑產生衝突時,標籤中的prefix屬性可用於解決該問題。
<filter> <prefix>env3_</prefix> <files> <file>src/main/filters/filter.properties</file> </files> </filter>
2. 複製屬性到MANIFEST文件中
為確保MANIFEST.MF文件中使用的屬性正確,內部Maven過程將另存儲所有與環境相關的屬性,並在存檔時覆蓋MANIFEST.MF,而無需再次查詢環境。 此過程將忽略任何以pom.*或project.*為前綴的屬性文件,因為它們已在該pom.xml文件中。 任何寫入系統屬性的插件也需要自己處理這種情況。
3. 不要過度使用過濾器
為了避免過度使用過濾器造成的疑難問題,建議您僅對確實需要過濾的文件使用它。
原創文章,作者:GXPGC,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/371082.html