maven-clean-plugin
該插件只有一個(gè)插件目標(biāo):clean:clean
爱咬,用于嘗試清除項(xiàng)目工作目錄中因構(gòu)建而生成的文件中鼠。默認(rèn)情況下胯究,它會(huì)發(fā)現(xiàn)并刪除在 project.build.directory
色难、project.build.outputDirectory
泼舱、project.build.testOutputDirectory
和 project.reporting.outputDirectory
所配置的目錄。
通過配置 <filesets/>
元素也可以刪除默認(rèn)目錄以外的文件枷莉。
clean:clean
插件目標(biāo)
可選參數(shù)
<excludeDefaultDirectories>
娇昙。刪除時(shí)排除項(xiàng)目的默認(rèn)輸出目錄。如果設(shè)置為true
(默認(rèn)為false
)笤妙,則僅刪除通過<filesets>
元素選擇的文件和目錄冒掌。從 3.0.0 版本開始噪裕,對(duì)應(yīng)的 property 名稱已從clean.excludeDefaultDirectories
變?yōu)?maven.clean.excludeDefaultDirectories
。<failOnError>
股毫。如果在刪除時(shí)出現(xiàn)錯(cuò)誤膳音,是否仍繼續(xù)進(jìn)行構(gòu)建。-
<filesets>
铃诬。指定除默認(rèn)目錄外祭陷,要?jiǎng)h除的文件集列表。例如:<filesets> <fileset> <directory>src/main/generated</directory> <followSymlinks>false</followSymlinks> <useDefaultExcludes>true</useDefaultExcludes> <includes> <include>*.java</include> </includes> <excludes> <exclude>Template*</exclude> </excludes> </fileset> </filesets>
<followSymLinks>
氧急。從項(xiàng)目默認(rèn)輸出目錄中刪除文件時(shí)是否應(yīng)遵循符號(hào)鏈接颗胡。默認(rèn)為false
。不遵循符號(hào)鏈接需要更多 IO 操作和堆內(nèi)存吩坝,而不管符號(hào)鏈接是否實(shí)際存在毒姨。因此,如果項(xiàng)目的輸出目錄很大钉寝,并且故意不包含符號(hào)鏈接弧呐,則可以通過將此參數(shù)設(shè)置為true
來提高性能。從 3.0.0 版本開始嵌纲,該屬性已從clean.followSymLinks
重命名為maven.clean.followSymLinks
俘枫。<retryOnError>
。指示如果第一次嘗試刪除失敗逮走,則是否應(yīng)進(jìn)行再次嘗試(在短暫延遲后)刪除文件鸠蚪。這是為了幫助刪除由第三方工具(如病毒掃描程序或搜索索引)臨時(shí)鎖定的文件。<skip>
师溅。禁用插件的執(zhí)行茅信。從 3.0.0 版本開始,對(duì)應(yīng)的 property 已從clean.skip
重命名為maven.clean.skip
<verbose>
墓臭。設(shè)置插件是否以詳細(xì)模式運(yùn)行蘸鲸。從 2.3 版本開始,默認(rèn)值來自 Maven 的全局 debug 標(biāo)志(命令行開關(guān)-X
)窿锉。從 3.0.0 版本開始酌摇,該 property 已從clean.verbose
重命名為maven.clean.verbose
。
示例
刪除未向 Maven 公開的其他文件
默認(rèn)情況下嗡载,Maven Clean 插件將刪除 ${basedir}/src/target
目錄窑多。您可以將其配置為刪除其他目錄和文件。比如:
<build>
[...]
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<filesets>
<fileset>
<directory>some/relative/path</directory>
<includes>
<include>**/*.tmp</include>
<include>**/*.log</include>
</includes>
<excludes>
<exclude>**/important.log</exclude>
<exclude>**/another-important.log</exclude>
</excludes>
<followSymlinks>false</followSymlinks>
</fileset>
</filesets>
</configuration>
</plugin>
[...]
</build>
注意:文件集中的目錄是項(xiàng)目中的相對(duì)路徑洼滚,換句話說埂息,
<directory>some/relative/path</directory>
相當(dāng)于:
<directory>${basedir}/some/relative/path</directory>
您還可以在父 POM 中定義文件集規(guī)則。
跳過 Clean 的執(zhí)行
要跳過為特定項(xiàng)目的 clean 操作,則請(qǐng)將 skip
property 設(shè)置為 true
耿芹。
<build>
[...]
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
[...]
</build>
通過執(zhí)行以下命令,也可以通過命令行跳過 clean:
mvn clean -Dmaven.clean.skip=true
忽略 Clean 錯(cuò)誤
要在為特定項(xiàng)目運(yùn)行 clean 時(shí)忽略錯(cuò)誤挪哄,請(qǐng)將 failOnError
property 設(shè)置為 false
吧秕。
<build>
[...]
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<failOnError>false</failOnError>
</configuration>
</plugin>
[...]
</build>
您還可以通過執(zhí)行以下命令,通過命令行忽略 clean 時(shí)的錯(cuò)誤:
mvn clean -Dmaven.clean.failOnError=false
maven-resources-plugin
資源插件負(fù)責(zé)將項(xiàng)目資源到輸出目錄迹炼。Maven 項(xiàng)目有兩種不同的資源:主資源和測試資源砸彬。區(qū)別在于,主資源(默認(rèn)在 src/main/resources
目錄)是與主源代碼(位于 src/main/java
目錄下)關(guān)聯(lián)的資源斯入,而測試資源(默認(rèn)在 src/test/resources
目錄)與測試源代碼(位于 src/main/test
目錄下)關(guān)聯(lián)砂碉。從 2.3 版本開始,該插件可以使用 Maven 過濾組件來過濾資源刻两。
資源插件將 resource
元素所指定的文件復(fù)制到輸出目錄增蹭。以下三個(gè)插件目標(biāo)僅在指定資源和輸出目錄的 XML 元素的方式上有所不同。
resources:resources
插件目標(biāo)
該插件目標(biāo)的全稱為 org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources
磅摹,主要負(fù)責(zé)將主源代碼的資源復(fù)制到主輸出目錄滋迈。該目標(biāo)通常自動(dòng)執(zhí)行,因?yàn)樗J(rèn)綁定到 process-resources
生命周期階段户誓。它始終使用project.build.resources
元素來指定資源饼灿,默認(rèn)情況下使用 project.build.outputDirectory
property 來指定輸出目錄。
必選參數(shù)
-
<outputDirectory>
帝美。要將資源復(fù)制到其中的輸出目錄碍彭。默認(rèn)為${project.build.outputDirectory}
property 的值。
可選參數(shù)
-
<addDefaultExcludes>
悼潭。默認(rèn)情況下庇忌,會(huì)排除.gitignore
、.cvsignore
等文件女责,這意味著不會(huì)復(fù)制這些文件漆枚。如果您出于特定原因需要它們,可以通過將此設(shè)置為false
來實(shí)現(xiàn)(默認(rèn)為true
)抵知。這意味著將復(fù)制以下所有文件:- 雜項(xiàng):
**/*~
墙基,**/#*#
,**/.#*
刷喜,**/%*%
残制,**/._*
。 - CVS:
**/CVS
掖疮,**/CVS/**
初茶,**/.cvsignore
。 - RCS:
**/RCS
浊闪,**/RCS/**
- SCCS:
**/SCCS
恼布,**/SCCS/**
螺戳。 - VSSercer:
**/vssver.scc
。 - MKS:
**/project.pj
折汞。 - SVN:
**/.svn
倔幼,**/.svn/**
。 - GNU:
**/.arch-ids
爽待,**/.arch-ids/**
损同。 - Bazaar:
**/.bzr
,**/.bzr/**
鸟款。 - SurroundSCM:
**/.MySCMServerInfo
膏燃。 - Mac:
**/.DS_Store
。 - Serena Dimension:
**/.metadata
何什,**/.metadata/**
组哩。 - Mercurial:
**/.hg
,**/.hg/**
富俄。 - GIT:
**/.git
禁炒,**/.gitignore
,**/.gitattributes
霍比,**/.git/**
幕袱。 - Bitkeeper:
**/BitKeeper
,**/BitKeeper/**
悠瞬,**/ChangeSet
们豌,**/ChangeSet/**
。 - Darcs:
**/_darcs
浅妆,**/_darcs/**
望迎,**/.darcsrepo
,**/.darcsrepo/****/-darcs-backup*
凌外,**/.darcs-temp-mail
辩尊。
- 雜項(xiàng):
-
<delimiters>
。指定在資源中進(jìn)行篩選的表達(dá)式的分隔符康辑。這些分隔符以beginToken*endToken
的形式指定摄欲。如果未給出*
,則假定起始和結(jié)束的分隔符相同疮薇。因此胸墙,可以將默認(rèn)篩選分隔符指定為:<delimiters> <delimiter>${*}</delimiter> <delimiter>@</delimiter> </delimiters>
因?yàn)?
@
分隔符在兩端都是相同的,所以我們不需要指定@*@
(盡管我們可以)按咒。 <encoding>
迟隅。讀取和寫入篩選資源時(shí)要使用的字符編碼。默認(rèn)使用${project.build.sourceEncoding}
property 的值。<escapeString>
智袭。前面帶有此字符串的表達(dá)式將不會(huì)被插值奔缠。在此字符串前面的任何其他內(nèi)容都將原封不動(dòng)地通過。例如吼野,\${foo}
將替換為${foo}
添坊,但如果此參數(shù)已設(shè)置為反斜杠,則\${foo}
將替換為\\value-of-foo
箫锤。<escapeWindowsPaths>
。是否在windows樣式路徑中轉(zhuǎn)義反斜杠和冒號(hào)雨女。默認(rèn)為true
谚攒。<fileNameFiltering>
标捺。支持過濾文件名晒旅、文件夾等。<filters>
名扛。要與 POMbuild/filters
部分中指定的系統(tǒng)屬性讼稚、項(xiàng)目屬性和過濾器屬性一起使用的額外屬性文件列表括儒,這些文件應(yīng)在當(dāng)前 Mojo 執(zhí)行期間用于過濾。通常锐想,這些將在插件的execution
部分進(jìn)行配置帮寻,從而為特定execution
提供一組不同的過濾器。例如赠摇,從 Maven 2.2.0 開始固逗,您可以選擇使用default-resources
和default-testResources
來為兩種不同類型的資源提供不同的配置。通過提供extraFilters
配置藕帜,您可以區(qū)分哪些篩選器用于哪種類型的資源烫罩。<includeEmptyDirs>
。復(fù)制resources
元素中包含的任何空目錄洽故。默認(rèn)為false
贝攒。<mavenFilteringHints>
。實(shí)現(xiàn)了MavenResourcesFiltering.filterResources()
的 plexus 組件提示列表时甚。它們將在資源復(fù)制/篩選后執(zhí)行隘弊。為java.util.List
類型。<nonFilteredFileExtensions>
撞秋。不進(jìn)行過濾的文件擴(kuò)展名列表(已定義為:jpg
长捧、jpeg
、gif
吻贿、bmp
串结、png
)。為java.util.List
類型。<overwrite>
肌割。覆蓋現(xiàn)有文件卧蜓,即使目標(biāo)文件較新。默認(rèn)為false
把敞。<propertiesEncoding>
弥奸。讀取和寫入過濾屬性文件時(shí)要使用的字符編碼。如果未指定奋早,它將默認(rèn)為encoding
參數(shù)的值盛霎。<skip>
。如果需要耽装,可以跳過插件的執(zhí)行愤炸。不推薦使用,但有時(shí)使用起來相當(dāng)方便掉奄。默認(rèn)為false
规个。<supportMultiLineFiltering>
。停止搜索行末尾的endToken
姓建。默認(rèn)為false
诞仓。<useBuildFilters>
。如果為false
速兔,則在處理此 Mojo 執(zhí)行中的資源時(shí)墅拭,不要使用 POM 的build/filters
部分中指定的過濾器。默認(rèn)為true
涣狗。<useDefaultDelimiters>
帜矾。除了自定義分隔符(如果有)之外,還使用默認(rèn)分隔符屑柔。默認(rèn)為true
屡萤。
resources:testResources
插件目標(biāo)
該插件目標(biāo)的全稱為 org.apache.maven.plugins:maven-resources-plugin:3.2.0:test-Resources
,主要負(fù)責(zé)將測試源代碼的資源復(fù)制到測試輸出目錄掸宛。該插件目標(biāo)通常自動(dòng)執(zhí)行死陆,因?yàn)槟J(rèn)情況下它與 process-test-resources
生命周期階段相關(guān)聯(lián)。它總是使用 project.build.testResources
元素指定資源唧瘾,默認(rèn)情況下使用 project.build.testOutputDirectory
property 指定要輸出的目錄措译。
必選元素
-
<outputDirectory>
。要將資源復(fù)制到其中的輸出目錄饰序。默認(rèn)使用${project.build.testOutputDirectory}
property 的值领虹。 -
<resources>
。要轉(zhuǎn)移的資源列表求豫。默認(rèn)使用${project.testResources}
property 的值塌衰。
可選參數(shù)
該插件目標(biāo)支持的可選元素與 resources:resources
插件目標(biāo)支持的可選元素相同诉稍。
resources:copy-resources
插件目標(biāo)
該插件目標(biāo)的全稱為 org.apache.maven.plugins:maven-resources-plugin:3.2.0:copy-resources
,主要負(fù)責(zé)將資源復(fù)制到輸出目錄最疆。此目標(biāo)要求您配置要復(fù)制的資源杯巨,并指定輸出目錄。
必選元素
-
<outputDirectory>
努酸。要將資源復(fù)制到其中的輸出目錄服爷。 -
<resources>
。要轉(zhuǎn)移的資源列表获诈。
可選參數(shù)
該插件目標(biāo)支持的可選元素與 resources:resources
插件目標(biāo)支持的可選元素相同仍源。
示例
指定字符編碼
可以選擇 ASCII、UTF-8 或 UTF-16 等字符編碼方案用于文件的讀寫舔涎。最佳實(shí)踐是通過 ${project.build.sourceEncoding}
property 來定義用于復(fù)制篩選資源的編碼镜会,該 property 應(yīng)在 POM 的 properties
部分中定義,如下所示:
<project ...>
...
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
...
</properties>
..
</project>
通過使用上述 property终抽,maven-resources-plugin
將自動(dòng)使用此編碼。有時(shí)桶至,為了不同的目的昼伴,您需要顯式地更改編碼。這可以通過如下配置定義編碼來實(shí)現(xiàn):
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.2.0</version>
<configuration>
...
<encoding>UTF-8</encoding>
...
</configuration>
</plugin>
</plugins>
...
</build>
...
</project>
指定資源目錄
默認(rèn)情況下镣屹,Maven 將在 src/main/resources
下查找項(xiàng)目的資源:
Project
|-- pom.xml
`-- src
`-- main
`-- resources
但是圃郊,您的所有資源可能不在 src/main/resources
中。因此女蜈,您必須通過向 POM 添加以下內(nèi)容來指定這些目錄持舆。
<project>
...
<build>
...
<resources>
<resource>
<directory>[your folder here]</directory>
</resource>
</resources>
...
</build>
...
</project>
因此,如果您的資源駐留在 src/my-resources
中:
Project
|-- pom.xml
`-- src
`-- my-resources
可以通過執(zhí)行以下操作指定該目錄:
...
<resources>
<resource>
<directory>src/my-resources</directory>
</resource>
</resources>
...
此外伪窖,通過添加多個(gè) <resource>
元素逸寓,您可以擁有多個(gè)目錄:
...
<resources>
<resource>
<directory>resource1</directory>
</resource>
<resource>
<directory>resource2</directory>
</resource>
<resource>
<directory>resource3</directory>
</resource>
</resources>
...
過濾
在資源中可以包含變量。這些由 ${…}
分隔符表示的變量可以來自系統(tǒng)屬性覆山、項(xiàng)目屬性竹伸、過濾器資源和命令行。例如簇宽,如果我們有一個(gè)資源src/main/resources/hello.txt
勋篓,其中包含:
src/main/resources/hello.txt
還有像這樣的 POM:
<project>
...
<name>My Resources Plugin Practice Project</name>
...
<build>
...
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
...
</resources>
...
</build>
...
</project>
通過調(diào)用命令:mvn resources:resources
,這將在 target/classes/hello.txt
中創(chuàng)建一個(gè)包含完全相同文本的資源輸出:
Hello ${name}
但是魏割,如果我們向 POM 添加 <filtering>
元素并將其設(shè)置為 true
譬嚣,如下所示:
...
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
...
我們的 target/classes/hello.txt
文件在調(diào)用 mvn resources:resources
命令之后其內(nèi)容如下:
Hello My Resources Plugin Practice Project
這是因?yàn)?name
變量被替換為項(xiàng)目名稱的值(在 POM 中指定)。此外钞它,我們還可以使用 -D
選項(xiàng)通過命令行來指定該值拜银。例如殊鞭,要將變量名的值更改為“world”,只需調(diào)用命令:mvn resources:resources -Dname="world"
盐股。則 target/classes/hello.txt
中的輸出為:
Hello world
此外钱豁,我們不限于使用預(yù)定義的項(xiàng)目變量。我們可以在 <properties>
元素中指定自己的變量及其值疯汁。例如牲尺,如果要將變量從“name”更改為“your.name”,可以通過在 <properties>
元素中添加 <your.name>
元素來實(shí)現(xiàn)幌蚊。如下所示:
<project>
...
<properties>
<your.name>world</your.name>
</properties>
...
</project>
但是為了組織項(xiàng)目谤碳,您可能希望將所有變量及其值放在一個(gè)單獨(dú)的文件中,這樣您就不必重寫 POM溢豆,也不必在每次構(gòu)建時(shí)始終設(shè)置它們的值蜒简。這可以通過添加過濾器來實(shí)現(xiàn)。
<project>
...
<name>My Resources Plugin Practice Project</name>
...
<build>
...
<filters>
<filter>[a filter property]</filter>
</filters>
...
</build>
...
</project>
例如漩仙,我們可以通過指定包含以下內(nèi)容的篩選文件 my-filter-values.properties
將“your.name”與 POM 分開:
your.name = world
并將該文件路徑添加到我們的 POM 中:
...
<filters>
<filter>my-filter-values.properties</filter>
</filters>
...
注意:不要過濾含有二進(jìn)制內(nèi)容的文件搓茬,如圖像文件,這極有可能損壞這些二進(jìn)制文件队他!卷仑。
如果同時(shí)有文本文件和二進(jìn)制文件作為資源,建議使用兩個(gè)單獨(dú)的文件夾麸折。一個(gè)文件夾 src/main/resources
(默認(rèn))用于未篩選的資源锡凝,另一個(gè)文件夾src/main/resources-filtered
用于篩選的資源。
<project>
...
<build>
...
<resources>
<resource>
<directory>src/main/resources-filtered</directory>
<filtering>true</filtering>
</resource>
...
</resources>
...
</build>
...
</project>
現(xiàn)在垢啼,您可以將不應(yīng)過濾的文件放入 src/main/resources
目錄中窜锯,將其他文件放入需要過濾的 src/main/resources-filtered
目錄中。如前所述芭析,過濾圖像锚扎、pdf 等二進(jìn)制文件可能損壞這些二進(jìn)制文件。為了防止此類問題馁启,您可以配置不會(huì)被過濾的文件擴(kuò)展名工秩。
過濾 properties 文件
在篩選資源時(shí),如果要篩選 properties 文件进统,則必須特別小心助币。如果篩選的屬性文件包含非 ASCII 字符,并且 project.build.sourceEncoding
設(shè)置為 ISO-8859-1
以外的任何其他值螟碎,則可能會(huì)受到影響眉菱。Maven 資源插件在 3.2.0 版本之前默認(rèn)在過濾資源時(shí)使用 project.build.sourceEncoding
property 的值作為編碼。因此掉分,除非您在 Maven 資源插件中顯式配置了 encoding
參數(shù)來覆蓋 project.build.sourceEncoding
property 的值來作為編碼俭缓。
當(dāng) Properties 類用于讀取和寫入 properties 文件時(shí)克伊,它們要求 properties 文件使用 ISO-8859-1 編碼。Java11 的情況仍然如此华坦,如 Properties 類的 API 文檔所示愿吹。因此,以這種方式使用的 properties 文件需要使用 ISO-8859-1 編碼惜姐。
當(dāng) properties 文件用作 ResourceBundle(屬性資源包)時(shí)犁跪,不同版本的 Java 所需的編碼不同。在 Java 8 之前(包括 Java 8)歹袁,這些文件需要使用 ISO-8859-1 編碼坷衍。從 Java 9 開始,對(duì)于屬性資源包条舔,首選的編碼是 UTF-8枫耳。它可能與 ISO-859-1 一起使用,但是正如在 JDK 9 的國際化增強(qiáng)文檔中所示的孟抗,您應(yīng)該考慮將屬性資源包轉(zhuǎn)換成 UTF-8 編碼迁杨。
您需要做兩件事:
- 根據(jù)在項(xiàng)目中使用 properties 文件的方式,決定對(duì) properties 文件使用哪種編碼凄硼。
- 使用 3.2.0 版本中引入的
propertiesEncoding
配置參數(shù)顯式地相應(yīng)地配置 Maven 資源插件铅协。
在大多數(shù)情況下,它看起來是這樣的:
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.2.0</version>
<configuration>
...
<propertiesEncoding>ISO-8859-1</propertiesEncoding>
...
</configuration>
</plugin>
</plugins>
...
</build>
...
</project>
包括和排除文件和目錄
指定資源目錄時(shí)帆喇,可能不需要用到該目錄中的所有文件。因此亿胸,我們可能只需要指定要包含的文件或只需要排除的文件坯钦。要包含資源,我們只需要添加 <includes>
元素侈玄。
<project>
...
<name>My Resources Plugin Practice Project</name>
...
<build>
...
<resources>
<resource>
<directory>[your directory]</directory>
<includes>
<include>[resource file #1]</include>
<include>[resource file #2]</include>
<include>[resource file #3]</include>
...
<include>[resource file #n]</include>
</includes>
</resource>
...
</resources>
...
</build>
...
</project>
要排除資源婉刀,我們只需要添加一個(gè) <excludes>
元素。
<project>
...
<name>My Resources Plugin Practice Project</name>
...
<build>
...
<resources>
<resource>
<directory>[your directory]</directory>
<excludes>
<exclude>[non-resource file #1]</exclude>
<exclude>[non-resource file #2]</exclude>
<exclude>[non-resource file #3]</exclude>
...
<exclude>[non-resource file #n]</exclude>
</excludes>
</resource>
...
</resources>
...
</build>
...
</project>
例如序仙,如果我們希望包含 src/my-resources
目錄下以及其所有子目錄下的 txt 和 rtf 文件突颊,我們可以執(zhí)行以下操作:
<project>
...
<name>My Resources Plugin Practice Project</name>
...
<build>
...
<resources>
<resource>
<directory>src/my-resources</directory>
<includes>
<include>**/*.txt</include>
<include>**/*.rtf</include>
</includes>
</resource>
...
</resources>
...
</build>
...
</project>
此外,如果我們想包括位圖潘悼、JPEG 和 GIF 以外的所有內(nèi)容律秃,我們可以通過以下方式排除它們:
<project>
...
<name>My Resources Plugin Practice Project</name>
...
<build>
...
<resources>
<resource>
<directory>src/my-resources</directory>
<excludes>
<exclude>**/*.bmp</exclude>
<exclude>**/*.jpg</exclude>
<exclude>**/*.jpeg</exclude>
<exclude>**/*.gif</exclude>
</excludes>
</resource>
...
</resources>
...
</build>
...
</project>
當(dāng)然,我們也可以同時(shí)擁有 <include>
和 <excludes>
元素治唤。例如棒动,如果我們想要包含文件名中不包含單詞“test”的所有文本文件。
<project>
...
<name>My Resources Plugin Practice Project</name>
...
<build>
...
<resources>
<resource>
<directory>src/my-resources</directory>
<includes>
<include>**/*.txt</include>
</includes>
<excludes>
<exclude>**/*test*.*</exclude>
</excludes>
</resource>
...
</resources>
...
</build>
...
</project>
轉(zhuǎn)義過濾
您可以使用可配置特定的轉(zhuǎn)義字符串(默認(rèn)為反斜杠)來轉(zhuǎn)義過濾宾添。這意味著前面的表達(dá)式 ${}
和 @@
將替換為表達(dá)式船惨。比如柜裸,\${java.home}
過濾之后為 ${java.home}
,\@java.home@
過濾之后為 @java.home@
粱锐,而不會(huì)進(jìn)行插值疙挺。
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.2.0</version>
<configuration>
...
<escapeString>\</escapeString>
...
</configuration>
</plugin>
</plugins>
...
</build>
...
</project>
復(fù)制資源
您可以使用 copy-resources 插件目標(biāo)來復(fù)制不在默認(rèn) Maven 布局中或未在 build/resources
元素中聲明的資源,并將其附加到一個(gè)生命周期階段:
<project>
...
<build>
<plugins>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<id>copy-resources</id>
<!-- here the phase you need -->
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/extra-resources</outputDirectory>
<resources>
<resource>
<directory>src/non-packaged-resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
...
</build>
...
</project>
二進(jìn)制文件過濾
該插件默認(rèn)將防止對(duì)文件擴(kuò)展名為 jpg
怜浅、jpeg
铐然、gif
、bmp
和 png
的二進(jìn)制文件進(jìn)行過濾海雪。如果您想添加補(bǔ)充文件擴(kuò)展名锦爵,只需使用如下配置即可實(shí)現(xiàn):
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.2.0</version>
<configuration>
...
<nonFilteredFileExtensions>
<nonFilteredFileExtension>pdf</nonFilteredFileExtension>
<nonFilteredFileExtension>swf</nonFilteredFileExtension>
</nonFilteredFileExtensions>
...
</configuration>
</plugin>
</plugins>
...
</build>
...
</project>
自定義資源過濾器
使用 2.5 版,您現(xiàn)在可以構(gòu)建自定義的資源過濾器奥裸。自定義資源過濾器類必須實(shí)現(xiàn) org.apache.maven.shared.filtering.MavenResourcesFiltering
险掀。
自定義資源篩選器類必須標(biāo)記為 Plexus 組件。下面是一個(gè)帶有 roleHint
itFilter
的示例湾宙。
/**
* @plexus.component role="org.apache.maven.shared.filtering.MavenResourcesFiltering"
* role-hint="itFilter"
*/
public class ItFilter implements MavenResourcesFiltering
然后樟氢,您必須在構(gòu)建中激活 mojo,它將掃描 javadoc 注釋侠鳄,以將這些注釋轉(zhuǎn)換為 Plexus 組件元數(shù)據(jù)埠啃。
<plugin>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-component-metadata</artifactId>
<version>1.7.1</version>
<executions>
<execution>
<goals>
<goal>generate-metadata</goal>
</goals>
</execution>
</executions>
</plugin>
您的類必須在 maven-resources-plugin 類路徑中可用,這可以通過將您的工件添加到插件依賴項(xiàng)來完成伟恶。
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.2.0</version>
<configuration>
...
</configuration>
<dependencies>
<dependency>
<groupId>custom resources filters artifact groupId</groupId>
<artifactId>custom resources filters artifact artifactId</artifactId>
<version>custom resources filters artifact version</version>
</dependency>
</dependencies>
</plugin>
</plugins>
...
</build>
...
</project>
現(xiàn)在必須在插件中聲明自定義過濾器碴开。mavenFilteringHint
必須遵守與 Plexus 組件 roleHint
相同的語法。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.2.0</version>
<configuration>
...
<mavenFilteringHints>
<mavenFilteringHint>itFilter</mavenFilteringHint>
</mavenFilteringHints>
</configuration>
...
</configuration>
</plugin>
maven-compiler-plugin
該插件用于編譯項(xiàng)目的源代碼博秫。從 3.0 開始潦牛,默認(rèn)編譯器是 javax.tools.JavaCompiler
(如果使用的是 java 1.6),用于編譯 java 源代碼挡育。如果要強(qiáng)制該插件使用 javac
巴碗,必須為該插件配置 forceJavacCompilerUse
選項(xiàng)。
還要注意即寒,目前默認(rèn)的 source
值為 1.6橡淆,默認(rèn)的 target
值為 1.6,與運(yùn)行 Maven 的 JDK 無關(guān)母赵。強(qiáng)烈建議您通過設(shè)置 Java 編譯器的 -source
和 -target
中所述的 source
和 target
來更改這些默認(rèn)值逸爵。可以使用 javac
以外的其他編譯器凹嘲,有些編譯器已經(jīng)在 AspectJ痊银、.NET 和 C# 上可以使用了。
該插件有兩個(gè)插件目標(biāo)施绎。兩者都已經(jīng)綁定到 Maven 生命周期中的適當(dāng)階段溯革,因此會(huì)在各自的階段自動(dòng)執(zhí)行贞绳。
compiler:compile
插件目標(biāo)
可選參數(shù)
該插件目標(biāo)全名為 org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile
,用于編譯 Maven 項(xiàng)目主目錄下 java 子目錄中的源代碼致稀。默認(rèn)綁定在 compile
生命周期階段冈闭。
-
<annotationProcessorPaths>
。用作注解處理器路徑類路徑元素抖单。如果指定萎攒,編譯器將僅在這些類路徑元素中檢測注解處理器。如果省略矛绘,則使用默認(rèn)的類路徑用于檢測注解處理器耍休。檢測本身取決于annotationProcessors
的配置。每個(gè)類路徑元素都是使用它們的 Maven 坐標(biāo)(groupId
货矮、artifactId
羊精、version
、classifier
囚玫、type
)指定的喧锦。可傳遞依賴項(xiàng)將自動(dòng)添加抓督。示例如下 :<configuration> <annotationProcessorPaths> <path> <groupId>org.sample</groupId> <artifactId>sample-annotation-processor</artifactId> <version>1.2.3</version> </path> <!-- ... more ... --> </annotationProcessorPaths> </configuration>
<annotationProcessors>
燃少。要運(yùn)行的注解處理器的名稱。僅適用于 JDK 1.6+铃在,如果未設(shè)置阵具,則使用默認(rèn)的注解處理器發(fā)現(xiàn)進(jìn)程。-
<compilerArgs>
定铜。如果fork
設(shè)置為true
阳液,則設(shè)置要傳遞給編譯器的參數(shù)。例子:<compilerArgs> <arg>-Xmaxerrs</arg> <arg>1000</arg> <arg>-Xlint</arg> <arg>-J-Duser.language=en_us</arg> </compilerArgs>
<compilerArgument>
宿稀。如果fork
設(shè)置為true
趁舀,則設(shè)置要傳遞給編譯器的未格式化單個(gè)參數(shù)的字符串赖捌。要傳遞多個(gè)參數(shù)(例如-Xmaxerrs 1000
祝沸,實(shí)際上是兩個(gè)參數(shù)),則必須使用compilerArgs
越庇。這是因?yàn)閭鬟f給 Java 編譯器的有效參數(shù)列表因編譯器版本而異罩锐。<compilerId>
。要使用的編譯器 id卤唉,不同的編譯器 id 代表使用不同的編譯器涩惑。默認(rèn)使用maven.compiler.compilerId
property 的值。默認(rèn)值為javac
桑驱。有關(guān)使用不同編譯器更多信息竭恬,請(qǐng)參閱這里跛蛋。-
<compilerReuseStrategy>
。重新使用創(chuàng)建的Javacc
類的策略:-
reuseCreated
(默認(rèn)):將重用已創(chuàng)建的痊硕,但在多線程構(gòu)建的情況下赊级,每個(gè)線程將有自己的實(shí)例。默認(rèn)使用${reuseCreated}
的值岔绸。 -
reuseSame
:即使對(duì)于多線程構(gòu)建理逊,每次編譯也將使用相同的Javacc
類。 -
alwaysNew
:將為每個(gè)編譯創(chuàng)建一個(gè)新的Javacc
類盒揉。
注意:此參數(shù)值取決于您使用的操作系統(tǒng)和 JDK晋被,但默認(rèn)值應(yīng)適用于大多數(shù)環(huán)境。
-
<compilerVersion>
刚盈。如果fork
設(shè)置為true
羡洛,則指定要使用的編譯器版本,例如1.3
扁掸、1.5
磺陡。默認(rèn)使用maven.compiler.compilerVersion
property 值脚线。<debug>
。設(shè)置為true
(默認(rèn)值)以在編譯的類文件中包含調(diào)試信息。默認(rèn)使用maven.compiler.debug
property 值摄悯。<debuglevel>
。要附加到-g
命令行開關(guān)的關(guān)鍵字列表稠集。合法值為無或以下關(guān)鍵字的逗號(hào)分隔列表:lines
撮执、vars
和source
。如果未指定該參數(shù)沙兰,默認(rèn)情況下氓奈,-g
后不會(huì)追加任何內(nèi)容。如果未啟用調(diào)試鼎天,則將忽略此屬性舀奶。默認(rèn)使用maven.compiler.debuglevel
property 的值。<excludes>
斋射。編譯器的排除篩選器列表育勺。<executable>
。設(shè)置當(dāng)fork
為true
時(shí)要使用的編譯器的可執(zhí)行文件罗岖。默認(rèn)使用maven.compiler.executable
property 的值涧至。<failOnError>
。指示即使存在編譯錯(cuò)誤桑包,構(gòu)建是否仍將繼續(xù)南蓬。默認(rèn)為true
。<failOnWarning>
。指示即使存在編譯警告赘方,構(gòu)建是否仍將繼續(xù)烧颖。默認(rèn)為false
。<fileExtensions>
窄陡。需要檢查時(shí)間戳的文件擴(kuò)展名以用于增量構(gòu)建倒信,默認(rèn)僅包含.class
。<forceJavacCompilerUse>
泳梆。編譯器如今可以使用javax.tools
(如果在當(dāng)前 JDK 中可用)鳖悠,可以使用-Dmaven.compiler.forceJavacCompilerUse=true
或在插件中進(jìn)行配置來禁用此功能。默認(rèn)為false
优妙。<fork>
乘综。允許在不同的進(jìn)程中運(yùn)行編譯器。如果為false
(默認(rèn))套硼,則使用內(nèi)置編譯器卡辰,如果為true
,則使用可執(zhí)行文件來作為編譯器邪意。默認(rèn)使用maven.compiler.fork
property 的值九妈。<generatedSourcesDirectory>
。指定放置由注解處理所創(chuàng)建的源文件的位置雾鬼。僅適用于 JDK1.6+萌朱。默認(rèn)使用${project.build.directory}/generated-sources/annotations
property 的值。<includes>
策菜。編譯器的包含篩選器列表晶疼。<jdkToolchain>
。指定此 JDK toolchain 的所需的參數(shù)又憨。這將否決maven-toolchain-plugin
插件選擇的 toolchain翠霍。<maxmem>
。設(shè)置內(nèi)存分配池的最大大写垒骸(以 MB 為單位)寒匙,例如128
、128m
(如果fork
設(shè)置為true
)躏将。默認(rèn)使用maven.compiler.maxmem
property 的值锄弱。<meminitial>
。內(nèi)存分配池的初始大兴市(以 MB 為單位)棵癣,例如64
辕翰、64m
(如果fork
設(shè)置為true
)夺衍。默認(rèn)使用maven.compiler.meminitial
property 的值。<multiReleaseOutput>
喜命。當(dāng)設(shè)置為true
時(shí)沟沙,類將被放置在META-INF/versions/${release}
中河劝。必須設(shè)置release
值,否則插件將失敗矛紫。<outputFileName>
赎瞎。將一組源文件編譯為單個(gè)文件時(shí),設(shè)置輸出文件的名稱颊咬。expression="${project.build.finalName}"
务甥。<parameters>
。設(shè)置為true
以生成元數(shù)據(jù)以反射方法參數(shù)喳篇。默認(rèn)為false
敞临。默認(rèn)使用maven.compiler.parameters
property 的值。-
<proc>
麸澜。設(shè)置是否執(zhí)行注解處理挺尿。僅適用于 JDK 1.6+,如果未設(shè)置炊邦,編譯和注解處理將同時(shí)執(zhí)行编矾。允許的值為:-
none
:不執(zhí)行任何注解處理。 -
only
:僅完成注解處理馁害,不進(jìn)行編譯窄俏。
-
<showDeprecation>
。設(shè)置是否顯示使用已棄用 API 的源位置碘菜。默認(rèn)為false
裆操。默認(rèn)使用maven.compiler.showDeprecation
property 的值。<showWarnings>
炉媒。設(shè)置為true
(默認(rèn)為false
)以顯示編譯警告踪区。默認(rèn)使用maven.compiler.showWarnings
property 的值。<skipMain>
吊骤。將該參數(shù)設(shè)置為true
以繞過 main 源代碼的編譯缎岗。不推薦使用,但有時(shí)使用起來相當(dāng)方便白粉。默認(rèn)使用maven.main.skip
property 的值传泊。<skipMultiThreadWarning>
。默認(rèn)使用maven.compiler.skipMultiThreadWarning
property 的值鸭巴,默認(rèn)為 false眷细。<encoding>
。指定傳遞給編譯器的-encoding
參數(shù)鹃祖,表示按哪種編碼格式讀取源代碼文件溪椎。默認(rèn)使用${project.build.sourceEncoding}
property 的值。<source>
。指定傳遞給編譯器的-source
參數(shù)校读,表示按哪個(gè) JDK 版本的語法讀取源代碼沼侣。默認(rèn)使用maven.compiler.source
property 的值,默認(rèn)為 1.6歉秫。<target>
蛾洛。指定傳遞給編譯器的-target
參數(shù),表示生成適用于哪個(gè) JDK 版本的編譯文件雁芙。默認(rèn)使用maven.compiler.target
property 的值轧膘,默認(rèn)為 1.6。<release>
兔甘。Java 編譯器的-release
參數(shù)扶供,自 Java 9 以來一直受支持。默認(rèn)使用maven.compiler.release
property 的值裂明。<staleMillis>
椿浓。根據(jù)上次修改時(shí)間之后經(jīng)過多少毫秒數(shù)來測試源文件是否需要重新編譯。默認(rèn)使用lastModGranularityMs
property 的值闽晦,默認(rèn)為0
扳碍。<useIncrementalCompilation>
。設(shè)置是否啟用增量編譯功能仙蛉。默認(rèn)使用maven.compiler.useIncrementalCompilation
property 的值笋敞,默認(rèn)為true
。<verbose>
荠瘪。設(shè)置為true
以顯示有關(guān)編譯器正在執(zhí)行的操作的消息夯巷。默認(rèn)使用maven.compiler.verbose
property 的值,默認(rèn)為false
哀墓。
compiler:testCompile
插件目標(biāo)
可選參數(shù)
該插件目標(biāo)全名為 org.apache.maven.plugins:maven-compiler-plugin:3.8.1:testCompile
趁餐,用于編譯 Maven 項(xiàng)目主目錄下 test
子目錄中的源代碼。默認(rèn)綁定在 test-compile
生命周期階段篮绰。
compiler:testCompile
插件目標(biāo)不但包含了 compiler:compile
插件目標(biāo)的所有可選參數(shù)后雷,此外,該插件目標(biāo)還可以使用參數(shù)參數(shù):
-
<testCompilerArgument>
吠各。如果fork
參數(shù)設(shè)置為true
臀突,則設(shè)置要傳遞給測試編譯器的未格式化的單個(gè)參數(shù)字符串。這是因?yàn)閭鬟f給 Java 編譯器的有效參數(shù)列表因編譯器版本而異贾漏。 -
<testCompilerArguments>
候学。如果fork
參數(shù)設(shè)置為true
,則設(shè)置要傳遞給測試編譯器的多個(gè)參數(shù)(在破折號(hào)之前)纵散。這是因?yàn)閭鬟f給 Java 編譯器的有效參數(shù)列表因編譯器版本而異梳码。 -
<testExcludes>
隐圾。編譯器的排除篩選器列表。 -
<testIncludes>
边翁。編譯器的包含篩選器列表。 -
<testRelease>
硕盹。測試 Java 編譯器的-release
參數(shù)符匾。默認(rèn)使用maven.compiler.testRelease
property 的值。 -
<testSource>
瘩例。測試 Java 編譯器的-source
參數(shù)啊胶,表示按哪個(gè) JDK 版本來讀取測試源代碼。默認(rèn)使用maven.compiler.testSource
property 的值垛贤。 -
<testTarget>
焰坪。測試 Java 編譯器的-target
參數(shù),表示生成適用于哪個(gè) JDK 版本的編譯測試文件聘惦。默認(rèn)使用maven.compiler.testTarget
property 的值某饰。
示例
使用不同的 JDK 編譯源代碼
使用 Maven Toolchain
使用不同 JDK 的更好方法是使用 toolchain 機(jī)制。在項(xiàng)目構(gòu)建過程中善绎,Maven 在沒有 toolchain 的情況下黔漂,將使用 JDK 執(zhí)行各種步驟,如編譯 Java 源代碼禀酱、生成Javadoc炬守、運(yùn)行單元測試或?qū)?JAR 進(jìn)行簽名。這些插件中的每一個(gè)都需要 JDK 的一個(gè)工具來操作:javac
剂跟、javadoc
减途、jarsigner
等等。toolchain 是一個(gè)以集中的方式指定 JDK 路徑的方法曹洽、獨(dú)立于運(yùn)行 Maven 自身的 JDK 的插件鳍置。
要進(jìn)行設(shè)置,請(qǐng)參閱 toolchain 指南送淆。使用 maven-toolchains-plugin
墓捻,您可以為所有相關(guān)的 Maven 插件配置一個(gè)默認(rèn) JDK toolchain。由于 Maven 編譯器插件 3.6.0 在與 Maven 3.3.1+ 一起使用時(shí)坊夫,也可以為該編譯插件提供自己的 toolchain砖第,這在每個(gè)執(zhí)行塊調(diào)用不同 JDK 的情況下非常有用。例如环凿,與 main 目錄中的源代碼相比梧兼,test 中的測試源代碼需要不同的編譯器。
配置編譯插件
在 toolchain 之外智听,仍然可以告訴編譯器插件在編譯期間要使用的特定 JDK羽杰。請(qǐng)注意渡紫,這樣的配置是特定于該插件的,并且不會(huì)影響其他插件考赛。compilerVersion
參數(shù)可用于指定插件將使用的編譯器版本惕澎。當(dāng)然,您還需要將 fork
設(shè)置為 true
颜骤,這樣才能工作唧喉。例如:
<project>
[...]
<build>
[...]
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<verbose>true</verbose>
<fork>true</fork>
<executable><!-- path-to-javac --></executable>
<compilerVersion>1.3</compilerVersion>
</configuration>
</plugin>
</plugins>
[...]
</build>
[...]
</project>
為了避免硬編碼可執(zhí)行文件的文件系統(tǒng)路徑,可以使用屬性忍抽。例如:
<executable>${JAVA_1_4_HOME}/bin/javac</executable>
然后八孝,每個(gè)開發(fā)人員在 settings.xml 中定義該屬性,或設(shè)置一個(gè)環(huán)境變量鸠项,以便構(gòu)建保持可移植性干跛。
<settings>
[...]
<profiles>
[...]
<profile>
<id>compiler</id>
<properties>
<JAVA_1_4_HOME>C:\Program Files\Java\j2sdk1.4.2_09</JAVA_1_4_HOME>
</properties>
</profile>
</profiles>
[...]
<activeProfiles>
<activeProfile>compiler</activeProfile>
</activeProfiles>
</settings>
如果使用不同的 JDK 進(jìn)行構(gòu)建,則可能需要自定義 jar 文件清單祟绊。
設(shè)置 Java 編譯器的 -source
和 -target
有時(shí)楼入,您可能需要將某個(gè)項(xiàng)目編譯為與當(dāng)前使用的版本不同的版本。javac
可以使用 -source
和 -target
接受這樣的命令牧抽。編譯器插件也可以配置為在編譯期間提供這些選項(xiàng)浅辙。例如,如果您希望使用 Java 8 語言功能(-source 1.8
)阎姥,并且還希望編譯的類與 JVM 1.8(-target 1.8
)兼容记舆,則可以添加以下兩個(gè)屬性,它們是插件參數(shù)的默認(rèn)屬性名稱:
<project>
[...]
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
[...]
</project>
或者直接配置插件:
<project>
[...]
<build>
[...]
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
[...]
</build>
[...]
</project>
僅僅設(shè)置 target
選項(xiàng)并不能保證您的代碼在具有指定版本的 JRE 上一定可以運(yùn)行呼巴。這個(gè)缺陷是無意中使用了只存在于后續(xù)版本的 JRE 中的 API泽腮,這會(huì)導(dǎo)致代碼在運(yùn)行時(shí)失敗,并出現(xiàn)鏈接錯(cuò)誤衣赶。為了避免這個(gè)問題诊赊,您可以配置編譯器的啟動(dòng)類路徑來匹配目標(biāo) JRE,或者使用 Animal Sniffer Maven 插件來驗(yàn)證您的代碼沒有使用意外的API府瞄。同樣碧磅,設(shè)置 source
選項(xiàng)也不能保證代碼在具有指定版本的 JDK 上編譯。要使用特定的 JDK 版本編譯代碼(不同于用于啟動(dòng) Maven 的版本)遵馆,請(qǐng)參考使用不同 JDK 示例編譯代碼鲸郊。
使用增強(qiáng)內(nèi)存分配功能
編譯器插件接受 meminitial
和 maxmem
的配置。您可以按照以下示例將初始內(nèi)存大小設(shè)置為 128MB货邓,最大內(nèi)存使用量設(shè)置為 512MB:
<project>
[...]
<build>
[...]
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<fork>true</fork>
<meminitial>128m</meminitial>
<maxmem>512m</maxmem>
</configuration>
</plugin>
</plugins>
[...]
</build>
[...]
</project>
傳入編譯參數(shù)
有時(shí)秆撮,您需要傳遞其他編譯參數(shù),這些參數(shù)不是由編譯器插件本身處理的换况,而是由所選編譯器 ID 支持的职辨。對(duì)于此類參數(shù)盗蟆,請(qǐng)使用編譯器插件的 compilerArgs
參數(shù)。以下示例將編譯器參數(shù)傳遞給 javac
編譯器:
<project>
[...]
<build>
[...]
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<compilerArgs>
<arg>-verbose</arg>
<arg>-Xlint:all,-options,-path</arg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
[...]
</build>
[...]
</project>
使用不同編譯器
編譯器插件本身并不編譯項(xiàng)目的源代碼舒裤,而是使用另一個(gè)類來編譯它們喳资。參數(shù) compilerId
確定將使用哪個(gè)類。目前腾供,編譯器插件自帶了 artifactId
為 plexus-compiler-javac
的 javac
編譯器仆邓,這可以看作是編譯器插件的 POM 中聲明的依賴項(xiàng)之一。Plexus 編譯器組件在名為 org.codehaus.plexus
的 groupId
下有一些其他編譯器 ID 可用:
-
aspectj
台腥,artifactId
為plexus-compiler-aspectj
宏赘。 -
csharp
绒北,artifactId
為plexus-compiler-csharp
黎侈。 -
eclipse
,artifactId
為plexus-compiler-eclipse
闷游。 -
jikes
峻汉,artifactId
為plexus-compiler-jikes
。
使用其他 Plexus 編譯器
要使用任何非 javac
編譯器脐往,您需要在編譯器插件運(yùn)行時(shí)使對(duì)應(yīng)的編譯器工件在類路徑中可用休吠。這可以通過在項(xiàng)目的 pom.xml 中聲明插件時(shí)添加依賴項(xiàng)來實(shí)現(xiàn)。下面的示例顯示了如何使用 csharp
編譯器:
<project>
[...]
<build>
[...]
<plugins>
[...]
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<compilerId>csharp</compilerId>
</configuration>
<dependencies>
<dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-compiler-csharp</artifactId>
<version>1.6</version>
</dependency>
</dependencies>
</plugin>
[...]
</project>
包含 module-info 的舊項(xiàng)目
對(duì)于希望與舊版本的 Java(即 1.8 或更低版本)兼容业簿,但又希望為 Java 9 提供 module-info.Java
的項(xiàng)目瘤礁,項(xiàng)目必須知道它們需要調(diào)用 javac
兩次:module-info.java
必須使用 release=9
編譯,而其余的源代碼必須使用較低版本的 source/target
編譯梅尤。
實(shí)現(xiàn)這一點(diǎn)的首選方法是使用下面描述的 2 個(gè)執(zhí)行塊柜思。JDK9 只支持 Java6 及以上版本的編譯,因此想要與 Java5 或以下版本兼容的項(xiàng)目需要使用兩種不同的 JDK巷燥。使用 toolchain 很容易實(shí)現(xiàn)這一點(diǎn)赡盘。請(qǐng)注意,至少需要 Maven 3.3.1 才能在插件配置中指定自定義 jdkToolchain
缰揪。您可以添加一個(gè) jdkToolchain
來執(zhí)行基本編譯執(zhí)行塊陨享,也可以參考 JDK 5。
<project>
[...]
<build>
[...]
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<executions>
<execution>
<id>default-compile</id>
<configuration>
<!-- compile everything to ensure module-info contains right entries -->
<!-- required when JAVA_HOME is JDK 8 or below -->
<jdkToolchain>
<version>9</version>
</jdkToolchain>
<release>9</release>
</configuration>
</execution>
<execution>
<id>base-compile</id>
<goals>
<goal>compile</goal>
</goals>
<!-- recompile everything for target VM except the module-info.java -->
<configuration>
<excludes>
<exclude>module-info.java</exclude>
</excludes>
</configuration>
</execution>
</executions>
<!-- defaults for compile and testCompile -->
<configuration>
<!-- jdkToolchain required when JAVA_HOME is JDK 9 or above -->
<jdkToolchain>
<version>[1.5,9)</version>
</jdkToolchain>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
[...]
</build>
[...]
</project>
如果您希望項(xiàng)目與 Java 6 兼容钝腺,最簡單的方法是對(duì)兩個(gè)執(zhí)行塊都使用 Java 9抛姑。您可以使用 Maven toolchain 插件指定共享 JDK(自 Maven 2.0.9 以來支持)或自定義 jdkToolchain
(自 Maven 3.3.1 以來支持),并參考系統(tǒng)上的 JDK 9 安裝艳狐⊥窘洌或者通過設(shè)置 JAVA_HOME=/path/to/jdk-9
來簡單地使用 Java9 作為 Maven 的運(yùn)行時(shí)。
<project>
[...]
<build>
[...]
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<executions>
<execution>
<id>default-compile</id>
<configuration>
<!-- compile everything to ensure module-info contains right entries -->
<release>9</release>
</configuration>
</execution>
<execution>
<id>base-compile</id>
<goals>
<goal>compile</goal>
</goals>
<!-- recompile everything for target VM except the module-info.java -->
<configuration>
<excludes>
<exclude>module-info.java</exclude>
</excludes>
</configuration>
</execution>
</executions>
<!-- defaults for compile and testCompile -->
<configuration>
<!-- Only required when JAVA_HOME isn't at least Java 9 and when haven't configured the maven-toolchains-plugin -->
<jdkToolchain>
<version>9</version>
</jdkToolchain>
<release>6</release>
</configuration>
</plugin>
</plugins>
[...]
</build>
[...]
</project>
maven-install-plugin
該插件用于在 install
生命周期階段將工件添加到本地倉庫僵驰。該插件使用 POM 中的信息(groupId
喷斋、artifactId
唁毒、version
)來確定工件在本地倉庫中的正確位置。本地倉庫是項(xiàng)目構(gòu)建所需的所有工件的本地緩存星爪。默認(rèn)情況下浆西,它位于用戶的 home 目錄中(~/.m2/repository
),但可以使用 <localRepository>
元素在~/.m2/settings.xml
中配置該位置顽腾。
該插件有三個(gè)插件目標(biāo)近零。
install:install
插件目標(biāo)
該插件目標(biāo)的全稱為 org.apache.maven.plugins:maven-install-plugin:3.0.0-M1:install
,用于將項(xiàng)目的主工件以及生命周期中其他插件附加的任何其他工件安裝到本地倉庫抄肖。默認(rèn)綁定在 install
生命周期階段久信。
可選參數(shù)
-
<installAtEnd>
。每個(gè)項(xiàng)目是否應(yīng)在其自身的install
生命周期階段或在多模塊構(gòu)建結(jié)束時(shí)安裝漓摩。如果設(shè)置為true
且構(gòu)建失斎故俊(默認(rèn)為false
),則不會(huì)安裝任何項(xiàng)目(實(shí)驗(yàn)性)管毙。默認(rèn)使用installAtEnd
property 的值腿椎。 -
<skip>
。將此設(shè)置為true
(默認(rèn)為false
)以繞過工件安裝夭咬。對(duì)于不需要安裝在本地存儲(chǔ)庫中的工件啃炸,請(qǐng)使用此選項(xiàng)。默認(rèn)使用maven.install.skip
property 的值卓舵。
install:install-file
插件目標(biāo)
該插件目標(biāo)的全稱為 org.apache.maven.plugins:maven-install-plugin:3.0.0-M1:install-file
南用,用于將文件安裝到本地倉庫。
必選元素
-
<file>
掏湾。要安裝在本地倉庫中的文件裹虫。默認(rèn)使用file
property 的值。
可選元素
-
<groupId>
忘巧。要安裝的工件的GroupId
恒界。如果指定了 POM 文件,則從 POM 文件中檢索砚嘴;如果可用十酣,則從 jar 中的 pom.xml 中提取。默認(rèn)使用groupId
property 的值际长。 -
<artifactId>
耸采。要安裝的工件的ArtifactId
。如果指定了 POM 文件工育,則從 POM 文件中檢索虾宇;如果可用,則從 jar 文件中的 pom.xml 中提取如绸。默認(rèn)使用artifactId
property 的值嘱朽。 -
<version>
旭贬。要安裝的工件的版本。如果指定了 POM 文件搪泳,則從 POM 文件中檢索稀轨;如果可用,則從 jar 中的 pom.xml 中提取岸军。默認(rèn)使用version
property 的值奋刽。 -
<classifier>
。要安裝的工件的classifier
類型艰赞。例如佣谐,sources
或javadoc
蓉冈。默認(rèn)為無乖杠,這意味著這是項(xiàng)目的主要工件。默認(rèn)使用classifier
property 的值匹涮。 -
<generatePom>
吁断。如果通過參數(shù)pomFile
未提供 POM趁蕊,則為該工件生成最小 POM坞生。如果本地倉庫中還沒有已存在的 POM仔役,則默認(rèn)為true
。默認(rèn)使用generatePom
property 的值是己。 -
<javadoc>
又兵。與工件一起綁定的 API 文檔。默認(rèn)使用javadoc
property 的值卒废。 -
<localRepositoryPath>
沛厨。工件要安裝到的本地倉庫的路徑。如果未指定摔认,將使用 Maven 設(shè)置中配置的本地倉庫路徑逆皮。默認(rèn)使用localRepositoryPath
property 的值。 -
<packaging>
参袱。要安裝的工件的包類型电谣。如果指定了 POM 文件,則從 POM 文件中檢索抹蚀;如果可用剿牺,則從 jar 中的 pom.xml 中提取。默認(rèn)使用packaging
property 的值环壤。 -
<pomFile>
晒来。要與主工件一起安裝的現(xiàn)有 POM 文件的位置,由file
參數(shù)給出郑现。 -
<sources>
湃崩。與工件一起綁定的source
荧降。默認(rèn)使用sources
property 的值。
install:help
插件目標(biāo)
該插件目標(biāo)主要用于顯示 maven-install-plugin
的幫助信息攒读,不再詳細(xì)介紹誊抛。
示例
使用自定義 POM 安裝工件
Apache Maven install 插件可以包括一個(gè)預(yù)構(gòu)建的自定義 POM,該 POM 帶有本地存儲(chǔ)庫中的工件整陌。只需將 pomFile
參數(shù)的值設(shè)置為自定義 POM 的路徑拗窃。
mvn org.apache.maven.plugins:maven-install-plugin:3.0.0-M1:install-file -Dfile=path-to-your-artifact-jar -DpomFile=path-to-pom
如果 JAR 是由 Apache Maven 構(gòu)建的,那么它將在 META-INF 目錄的子文件夾中包含一個(gè) pom.xml泌辫,默認(rèn)情況下會(huì)讀取它随夸。在這種情況下,您需要做的就是:
mvn org.apache.maven.plugins:maven-install-plugin:3.0.0-M1:install-file -Dfile=<path-to-file>
注意:通過使用目標(biāo)的完全限定路徑震放,可以確保使用 Maven 安裝插件的首選版本宾毒。使用 mvn install:install
文件時(shí),其版本取決于 pom 中的規(guī)范或 Apache Maven 版本殿遂。
生成泛型 POM
有時(shí)需要將沒有 POM 的第三方工件添加到 Maven 項(xiàng)目使用诈铛,比如,需要為非 Maven 工具創(chuàng)建的 jar 包墨礁,或從網(wǎng)絡(luò)下載的幢竹、且中央倉庫中不存在的 jar 包添加 POM 并安裝本地倉庫中。在這種情況下恩静,install 插件可以創(chuàng)建一個(gè)通用 POM焕毫,其中包含 Maven 所需的最小 POM 元素集,例如 groupId
驶乾、artifactId
邑飒、version
和 package
。您告訴 Maven 通過將 generatePom
參數(shù)設(shè)置為 true
來生成 POM级乐。
mvn org.apache.maven.plugins:maven-install-plugin:3.0.0-M1:install-file -Dfile=path-to-your-artifact-jar \
-DgroupId=your.groupId \
-DartifactId=your-artifactId \
-Dversion=version \
-Dpackaging=jar \
-DgeneratePom=true
注意:通過使用插件目標(biāo)的完全限定路徑疙咸,可以確保使用 Maven install 插件的首選版本。當(dāng)使用 mvn install:install
來安裝第三方工件的 jar 包文件時(shí)风科,對(duì)應(yīng)的 install 插件版本取決于 pom 中的規(guī)范或 Apache Maven 版本撒轮。
更新項(xiàng)目的發(fā)布信息
更新發(fā)布信息意味著強(qiáng)制更新項(xiàng)目元數(shù)據(jù),將工件設(shè)置為發(fā)布版本丐重。它在安裝從源代碼構(gòu)建的插件時(shí)最有用腔召,這樣其他項(xiàng)目就可以使用它,而無需明確要求最新的快照版本扮惦。安裝時(shí)臀蛛,可通過將 updateReleaseInfo
參數(shù)設(shè)置為 true
來激活此選項(xiàng)。
mvn install -DupdateReleaseInfo=true
將工件安裝到特定的本地倉庫路徑
默認(rèn)情況下,Apache Maven install 插件使用 settings.xml 中定義的本地存儲(chǔ)庫來安裝工件浊仆。通過在安裝時(shí)設(shè)置 localRepositoryPath
參數(shù)客峭,可以在特定的本地倉庫上安裝工件。
mvn org.apache.maven.plugins:maven-install-plugin:3.0.0-M1:install-file -Dfile=path-to-your-artifact-jar \
-DgroupId=your.groupId \
-DartifactId=your-artifactId \
-Dversion=version \
-Dpackaging=jar \
-DlocalRepositoryPath=path-to-specific-local-repo
注意:通過使用插件目標(biāo)的完全限定路徑抡柿,可以確保使用 Maven install 插件的首選版本舔琅。當(dāng)使用 mvn install:install
來安裝第三方工件的 jar 包文件時(shí),對(duì)應(yīng)的 install 插件版本取決于 pom 中的規(guī)范或 Apache Maven 版本洲劣。
安裝輔助工件
有時(shí)备蚓,您需要在本地倉庫中安裝主工件之后安裝輔助工件。要安裝輔助工件囱稽,需要使用 classifier
參數(shù)對(duì)輔助工件進(jìn)行分類郊尝。假設(shè)您想要安裝一個(gè)舊工件的源代碼,比如 commons-logging-1.0.3战惊。對(duì)于該版本流昏,中央存儲(chǔ)庫只有主工件和 -javadoc
工件。將源代碼打包到本地磁盤上的 JAR 文件中吞获,然后運(yùn)行以下命令:
mvn org.apache.maven.plugins:maven-install-plugin:3.0.0-M1:install-file -Dfile=path-to-commons-logging-sources.jar \
-DgroupId=commons-logging \
-DartifactId=commons-logging \
-Dversion=1.0.3 \
-Dpackaging=jar \
-Dclassifier=sources
注意:通過使用插件目標(biāo)的完全限定路徑况凉,可以確保使用 Maven install 插件的首選版本。當(dāng)使用 mvn install:install
來安裝第三方工件的 jar 包文件時(shí)各拷,對(duì)應(yīng)的 install 插件版本取決于 pom 中的規(guī)范或 Apache Maven 版本刁绒。
maven-deploy-plugin
deploy 插件主要在 deploy 生命周期階段使用,用于將工件添加到遠(yuǎn)程倉庫撤逢,以便與其他開發(fā)人員和項(xiàng)目共享膛锭。這通常在集成或發(fā)布環(huán)境中完成粮坞。它還可用于部署特定工件(例如蚊荣,第三方 jar)。由于倉庫包含的不僅僅是工件莫杈,還有諸如 POM互例、元數(shù)據(jù)、MD5 和 SHA1 哈希等文件筝闹,因此部署不僅意味著復(fù)制工件媳叨,還意味著確保所有這些信息都得到正確更新。這是 deploy 插件的責(zé)任关顷。
部署需要以下信息才能工作:
- 關(guān)于倉庫的信息:其位置糊秆、用于訪問倉庫的傳輸方式(FTP、SCP议双、SFTP…)以及可選的特定于用戶的帳戶信息痘番。
- 有關(guān)工件的信息:
groupId
、artifactId
、version
汞舱、packageing
伍纫、classifier
等。 - 部署者:實(shí)際執(zhí)行部署的方法昂芜。這可以實(shí)現(xiàn)為裝箱傳輸(使其跨平臺(tái))莹规,或使用特定于系統(tǒng)的方法。
信息將從隱含(或指定)的 pom 和命令行中獲取泌神。還可以解析 settings.xml
文件以檢索用戶憑證良漱。
該插件包含兩個(gè)插件目標(biāo)。
deploy:deploy
插件目標(biāo)
該插件目標(biāo)的全稱為 org.apache.maven.plugins:maven-deploy-plugin:3.0.0-M1:deploy
欢际,用于將工件部署到遠(yuǎn)程倉庫债热。默認(rèn)綁定在 deploy
生命周期階段。
可選參數(shù)
-
<altDeploymentRepository>
幼苛。指定項(xiàng)目工件應(yīng)部署到的替代倉庫(在<distributionManagement>
中指定的倉庫除外)窒篱。
格式:id::layout::url
。其中舶沿,id
可用于從 settings.xml 中獲取正確的憑證墙杯,url
為倉庫的地址。從 3.0.0 開始括荡,layout
部分已被刪除高镐。默認(rèn)使用altDeploymentRepository
property 的值。 -
<altReleaseDeploymentRepository>
畸冲。當(dāng)項(xiàng)目有最終版本時(shí)要使用的替代倉庫嫉髓。默認(rèn)使用altReleaseDeploymentRepository
property 的值。 -
<altSnapshotDeploymentRepository>
邑闲。當(dāng)項(xiàng)目具有快照版本時(shí)要使用的替代倉庫算行。默認(rèn)使用altSnapshotDeploymentRepository
property 的值。 -
<deployAtEnd>
苫耸。每個(gè)項(xiàng)目是應(yīng)該在自己的deploy
生命周期階段部署州邢,還是應(yīng)該在多模塊構(gòu)建結(jié)束時(shí)部署。如果設(shè)置為true
(默認(rèn)為false
)且構(gòu)建失敗褪子,則不會(huì)部署任何項(xiàng)目(實(shí)驗(yàn)性)量淌。默認(rèn)使用altSnapshotDeploymentRepository
property 的值。 -
<retryFailedDeploymentCount>
嫌褪。在部署失敗時(shí)嘗試重新部署的次數(shù)呀枢。如果指定的值超出范圍 1-10,則該值將被拉至范圍 1-10 內(nèi)最近的值笼痛。默認(rèn)使用retryFailedDeploymentCount
property 的值裙秋。默認(rèn)為1
。 -
<skip>
。將其設(shè)置為true
以跳過該插件目標(biāo)的執(zhí)行残吩。默認(rèn)使用maven.deploy.skip
property 的值财忽。默認(rèn)為false
。
deploy:deploy-file
插件目標(biāo)
該插件目標(biāo)的全稱為 org.apache.maven.plugins:maven-deploy-plugin:3.0.0-M1:deploy
泣侮,用于將工件部署到遠(yuǎn)程倉庫即彪。
必選參數(shù)
-
<file>
。要部署的文件活尊。默認(rèn)為file
property 的值隶校。 -
<repositoryId>
。要映射到settings.xml
的<server>
部分下的<id>
的服務(wù)器 Id蛹锰。在大多數(shù)情況下深胳,身份驗(yàn)證需要此參數(shù)。默認(rèn)使用remote-repository
property 的值铜犬。 -
<url>
舞终。將在其中部署工件的 URL。例如:file:///C:/m2-repo or scp://host.com/path/to/repo
癣猾。默認(rèn)為url
property 的值敛劝。
可選參數(shù)
-
<groupId>
。要部署的工件的groupId
纷宇。如果指定夸盟,則從 POM 文件檢索。默認(rèn)使用groupId
property 的值像捶。 -
<artifactId>
上陕。要部署的工件的artifactId
。如果指定拓春,則從 POM 文件檢索释簿。默認(rèn)使用artifactId
property 的值。 -
<version>
痘儡。要部署的工件的版本辕万。如果指定了 POM 文件,則從 POM 文件中檢索沉删;如果可用,則從 jar 中的 pom.xml 中提取醉途。默認(rèn)使用version
property 的值矾瑰。 -
<types>
。要部署的每個(gè)輔助工件的類型的逗號(hào)分隔列表隘擎。如果files
或types
中的條目數(shù)不匹配殴穴,則會(huì)引發(fā)錯(cuò)誤。默認(rèn)使用types
property 的值。 -
<sources>
采幌。與工件一起綁定的source
劲够。默認(rèn)使用sources
property 的值。 -
<javadoc>
休傍。與工件集成在一起的 API 文檔征绎。默認(rèn)使用javadoc
property 的值。 -
<classifier>
磨取。將classifier
添加到工件中人柿。默認(rèn)使用classifier
property 的值。 -
<classifiers>
忙厌。一個(gè)逗號(hào)分隔的classifier
列表凫岖,用于每個(gè)要部署的額外輔助工件。如果files
或types
中的條目數(shù)不匹配逢净,則會(huì)引發(fā)錯(cuò)誤哥放。默認(rèn)使用classifiers
property 的值。 -
<description>
爹土。傳遞到生成的 POM 文件的描述(如果generatePom=true
)婶芭。默認(rèn)使用generatePom.description
property 的值。 -
<files>
着饥。以逗號(hào)分隔的文件列表犀农,用于每個(gè)要部署的附加工件。如果files
或types
中的條目數(shù)不匹配宰掉,則會(huì)引發(fā)錯(cuò)誤呵哨。默認(rèn)使用files
property 的值。 -
<generatePom>
轨奄。上傳此工件的 POM孟害。如果pomFile
參數(shù)未提供任何 POM,則將生成默認(rèn) POM挪拟。默認(rèn)使用classifiers
property 的值挨务。默認(rèn)為false
。 -
<packaging>
玉组。要部署的工件的類型谎柄。如果指定了 POM 文件,則從 POM 文件的<packaging>
元素檢索惯雳。如果未通過命令行或 POM 指定朝巫,則默認(rèn)為文件擴(kuò)展名。Maven 使用兩個(gè)術(shù)語來引用此數(shù)據(jù):整個(gè) POM 的<packaging>
元素和依賴項(xiàng)規(guī)范中的<type>
元素石景。默認(rèn)使用packaging
property 的值劈猿。 -
<pomFile>
拙吉。要與主工件一起部署的現(xiàn)有 POM 文件的位置,由${file}
參數(shù)給出揪荣。默認(rèn)使用pomFile
property 的值筷黔。 -
<retryFailedDeploymentCount>
。在部署失敗時(shí)嘗試重新部署的次數(shù)仗颈。如果指定的值超出范圍 1-10佛舱,則該值將被拉至范圍 1-10 內(nèi)最近的值。默認(rèn)使用retryFailedDeploymentCount
property 的值揽乱。默認(rèn)為1
名眉。
示例
使用 FTP 部署工件
為了使用 FTP 部署工件,您必須首先在 POM 的 distributionManagement
元素中指定 FTP 服務(wù)器的使用凰棉,并在構(gòu)建元素中指定一個(gè)擴(kuò)展损拢,該擴(kuò)展將引入使用FTP 部署所需的 FTP 工件:
<project>
...
<distributionManagement>
<repository>
<id>ftp-repository</id>
<url>ftp://repository.mycompany.com/repository</url>
</repository>
</distributionManagement>
<build>
<extensions>
<!-- Enabling the use of FTP -->
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ftp</artifactId>
<version>1.0-beta-6</version>
</extension>
</extensions>
</build>
...
</project>
您的 settings.xml 將包含一個(gè)服務(wù)器元素,其中該元素的 id 與上面 POM 中指定的 FTP 倉庫的 id 匹配:
<settings>
...
<servers>
<server>
<id>ftp-repository</id>
<username>user</username>
<password>pass</password>
</server>
</servers>
...
</settings>
當(dāng)然撒犀,在嘗試使用 Maven 進(jìn)行部署之前福压,您應(yīng)該確保可以手動(dòng)登錄到指定的 FTP 服務(wù)器或舞。一旦您確認(rèn)所有設(shè)置都正確荆姆,現(xiàn)在就可以使用 Maven 部署您的工件:
mvn deploy
在外部 SSH 命令中部署工件
為了使用 SSH 部署工件,必須首先在 POM 的 distributionManagement
元素中指定 SSH 服務(wù)器的使用映凳,并在 build
元素中指定一個(gè)擴(kuò)展胆筒,該擴(kuò)展將引入使用SSH 部署所需的 SSH 工件:
<project>
...
<distributionManagement>
<repository>
<id>ssh-repository</id>
<url>scpexe://repository.mycompany.com/repository</url>
</repository>
</distributionManagement>
<build>
<extensions>
<!-- Enabling the use of SSH -->
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ssh-external</artifactId>
<version>1.0-beta-6</version>
</extension>
</extensions>
</build>
..
</project>
如果您是從 Unix 部署或安裝了 Cygwin,則不需要在 settings.xml 文件中進(jìn)行任何其他配置诈豌,因?yàn)樗袃?nèi)容都將從環(huán)境中獲取仆救。但是,如果您使用的是 Windows矫渔,并且使用的是類似于 plink 的東西彤蔽,那么您將需要以下東西:
<settings>
...
<servers>
<server>
<id>ssh-repository</id>
<username>your username in the remote system if different from local</username>
<privateKey>/path/to/your/private/key</privateKey> <!-- not needed if using pageant -->
<configuration>
<sshExecutable>plink</sshExecutable>
<scpExecutable>pscp</scpExecutable>
<sshArgs>other arguments you may need</sshArgs>
</configuration>
</server>
</servers>
...
</settings>
當(dāng)然,在嘗試使用 Maven 進(jìn)行部署之前庙洼,您應(yīng)該確倍倩荆可以手動(dòng)登錄到指定的 SSH 服務(wù)器。一旦您確認(rèn)所有設(shè)置都正確油够,現(xiàn)在就可以使用 Maven 部署您的工件:
mvn deploy
有時(shí)蚁袭,您在部署時(shí)可能會(huì)遇到權(quán)限問題,如果是這樣叠聋,您可以按如下方式設(shè)置文件和目錄權(quán)限:
<settings>
...
<servers>
<server>
<id>ssh-repository</id>
<!--
|
| Change default file/dir permissions
|
-->
<filePermissions>664</filePermissions>
<directoryPermissions>775</directoryPermissions>
<configuration>
<sshExecutable>plink</sshExecutable>
<scpExecutable>pscp</scpExecutable>
</configuration>
</server>
</servers>
...
</settings>
注意:如果您使用 Putty撕阎,它將期望私鑰為 PPK 格式而不是標(biāo)準(zhǔn)格式,因此請(qǐng)確保使用 puttygen
將 openssh
格式密鑰轉(zhuǎn)換為 PPK 格式或生成另一個(gè)碌补。Windows 用戶可以在 Putty 下載頁面上找到 Putty 工具虏束。
禁用 pom 的生成
默認(rèn)情況下,如果在部署第三方工件期間未指定 pom厦章,將生成一個(gè)通用 pom镇匀,其中包含 pom 所需的最少元素。要禁用它袜啃,請(qǐng)將 generatePom
參數(shù)設(shè)置為false
汗侵。
mvn org.apache.maven.plugins:maven-deploy-plugin:3.0.0-M1:deploy-file -Durl=file:///C:/m2-repo \
-DrepositoryId=some.id \
-Dfile=path-to-your-artifact-jar \
-DgroupId=your.groupId \
-DartifactId=your-artifactId \
-Dversion=version \
-Dpackaging=jar \
-DgeneratePom=false
注意:通過使用插件目標(biāo)的完全限定路徑,可以確保使用 maven deploy 插件的首選版本群发。使用 mvn deploy:deploy
文件時(shí)晰韵,其版本取決于 pom 中的規(guī)范或Apache Maven 的版本。
使用定制的 pom 部署工件
如果已經(jīng)存在一個(gè) pom熟妓,并且希望它與第三方工件一起部署雪猪,那么將 pomFile
參數(shù)設(shè)置為 pom.xml 的路徑。
mvn org.apache.maven.plugins:maven-deploy-plugin:3.0.0-M1:deploy-file -Durl=file:///C:/m2-repo \
-DrepositoryId=some.id \
-Dfile=path-to-your-artifact-jar \
-DpomFile=path-to-your-pom.xml
請(qǐng)注意起愈,groupId
只恨、artifactId
、version
和 package
信息是從給定 pom 自動(dòng)檢索的抬虽。
注意:通過使用插件目標(biāo)的完全限定路徑官觅,可以確保使用 deploy 插件的首選版本。使用 mvn deploy:deploy-file
時(shí)阐污,其版本取決于 pom 中的規(guī)范或 Apache Maven 的版本休涤。
使用 classifier 部署工件
除了主工件之外,還有附加到 Maven 項(xiàng)目的其他文件笛辟。這樣的附加字段可以被其 classifier 識(shí)別和訪問功氨。
例如:從以下工件名稱中,classifier 位于工件的版本名和擴(kuò)展名之間隘膘。
-
artifact-name-1.0.jar
疑故。主 jar,其中包含編譯時(shí)沒有調(diào)試信息(如行號(hào))的類弯菊。 -
artifact-name-1.0-debug.jar
纵势。分類的 jar,它包含使用調(diào)試信息編譯的類管钳,因此會(huì)更小钦铁。 -
artifact-name-1.0-site.pdf
。包含站點(diǎn)文檔導(dǎo)出的 pdf才漆。
您可以在一次運(yùn)行中部署主工件和 classified 工件牛曹。假設(shè)文檔的原始文件名為 site.pdf:
mvn org.apache.maven.plugins:maven-deploy-plugin:3.0.0-M1:deploy-file -Durl=http://localhost:8081/repomanager/ \
-DrepositoryId=some.id \
-Dfile=path/to/artifact-name-1.0.jar \
-DpomFile=path-to-your-pom.xml \
-Dfiles=path/to/artifact-name-1.0-debug.jar,path/to/site.pdf \
-Dclassifiers=debug,site \
-Dtypes=jar,pdf
如果您只想部署調(diào)試 jar 并想保留分類器,那么可以像下面這樣執(zhí)行部署文件:
mvn org.apache.maven.plugins:maven-deploy-plugin:3.0.0-M1:deploy-file -Durl=http://localhost:8081/repomanager/ \
-DrepositoryId=some.id \
-Dfile=path-to-your-artifact-jar \
-DpomFile=path-to-your-pom.xml \
-Dclassifier=bin
注意:通過使用插件目標(biāo)的完全限定路徑醇滥,可以確保使用 deploy 插件的首選版本黎比。使用 mvn deploy:deploy-file
時(shí)超营,其版本取決于 pom 中的規(guī)范或 Apache Maven 的版本。
部署 sources
和 javadoc
的 jar
一個(gè)項(xiàng)目可能包括一個(gè)主 jar 和相關(guān)的 sources
jar 以及 javadoc
jar阅虫。
artifact-name-1.0.jar
artifact-name-1.0-sources.jar
artifact-name-1.0-javadoc.jar
sources
jar 包含 Java 源代碼演闭,javadoc
jar 包含生成的 javadoc
。要在部署中包含這些文件颓帝,請(qǐng)將 sources
和 javadoc
參數(shù)設(shè)置為指向 sources
jar 和 javadoc
jar 文件的路徑米碰。
mvn org.apache.maven.plugins:maven-deploy-plugin:3.0.0-M1:deploy-file -Durl=file:///home/me/m2-repo \
-DrepositoryId=some.repo.id \
-Dfile=./path/to/artifact-name-1.0.jar \
-DpomFile=./path/to/pom.xml \
-Dsources=./path/to/artifact-name-1.0-sources.jar \
-Djavadoc=./path/to/artifact-name-1.0-javadoc.jar
注意:通過使用插件目標(biāo)的完全限定路徑,可以確保使用 deploy 插件的首選版本购城。使用 mvn deploy:deploy-file
時(shí)吕座,其版本取決于 pom 中的規(guī)范或 Apache Maven 的版本。
在傳統(tǒng)(Legacy)布局中部署工件
“Legacy” 是 Maven 1 倉庫中使用的布局瘪板,而 Maven 2 使用“default”吴趴。它們?cè)谀夸浗Y(jié)構(gòu)、默認(rèn)快照的時(shí)間戳和默認(rèn)元數(shù)據(jù)文件的存在方面有所不同篷帅。
-
傳統(tǒng)布局目錄結(jié)構(gòu):
groupId |--artifactId |--jars `--artifact
-
默認(rèn)布局目錄結(jié)構(gòu):
groupId |--artifactId |--version | `---artifact |---metadata
為了能夠在倉庫的傳統(tǒng)布局中部署工件史侣,請(qǐng)將 repositoryLayout
參數(shù)設(shè)置為 legacy
。
mvn org.apache.maven.plugins:maven-deploy-plugin:3.0.0-M1:deploy-file -Durl=file:///C:/m2-repo \
-DrepositoryId=some.id \
-Dfile=your-artifact-1.0.jar \
-DpomFile=your-pom.xml \
-DrepositoryLayout=legacy
注意:通過使用插件目標(biāo)的完全限定路徑魏身,可以確保使用 deploy 插件的首選版本惊橱。使用 mvn deploy:deploy-file
時(shí),其版本取決于 pom 中的規(guī)范或 Apache Maven 的版本箭昵。