一、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-hant/n/371082.html
微信掃一掃
支付寶掃一掃