Maven 核心插件詳解

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.testOutputDirectoryproject.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辩尊。
  • <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>名扛。要與 POM build/filters 部分中指定的系統(tǒng)屬性讼稚、項(xiàng)目屬性和過濾器屬性一起使用的額外屬性文件列表括儒,這些文件應(yīng)在當(dāng)前 Mojo 執(zhí)行期間用于過濾。通常锐想,這些將在插件的 execution 部分進(jìn)行配置帮寻,從而為特定 execution 提供一組不同的過濾器。例如赠摇,從 Maven 2.2.0 開始固逗,您可以選擇使用 default-resourcesdefault-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长捧、jpeggif吻贿、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铐然、gifbmppng 的二進(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 中所述的 sourcetarget 來更改這些默認(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羊精、versionclassifier囚玫、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撮执、varssource。如果未指定該參數(shù)沙兰,默認(rèn)情況下氓奈,-g 后不會(huì)追加任何內(nèi)容。如果未啟用調(diào)試鼎天,則將忽略此屬性舀奶。默認(rèn)使用 maven.compiler.debuglevel property 的值。

  • <excludes>斋射。編譯器的排除篩選器列表育勺。

  • <executable>。設(shè)置當(dāng) forktrue 時(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 為單位)寒匙,例如 128128m(如果 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)存分配功能

編譯器插件接受 meminitialmaxmem 的配置。您可以按照以下示例將初始內(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è)類。目前腾供,編譯器插件自帶了 artifactIdplexus-compiler-javacjavac 編譯器仆邓,這可以看作是編譯器插件的 POM 中聲明的依賴項(xiàng)之一。Plexus 編譯器組件在名為 org.codehaus.plexusgroupId 下有一些其他編譯器 ID 可用:

  • aspectj台腥,artifactIdplexus-compiler-aspectj宏赘。
  • csharp绒北,artifactIdplexus-compiler-csharp黎侈。
  • eclipseartifactIdplexus-compiler-eclipse闷游。
  • jikes峻汉,artifactIdplexus-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 類型艰赞。例如佣谐,sourcesjavadoc蓉冈。默認(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邑飒、versionpackage。您告訴 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)工件的信息:groupIdartifactIdversion汞舱、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)分隔列表隘擎。如果 filestypes 中的條目數(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è)要部署的額外輔助工件。如果 filestypes 中的條目數(shù)不匹配逢净,則會(huì)引發(fā)錯(cuò)誤哥放。默認(rèn)使用 classifiers property 的值。
  • <description>爹土。傳遞到生成的 POM 文件的描述(如果 generatePom=true)婶芭。默認(rèn)使用 generatePom.description property 的值。
  • <files>着饥。以逗號(hào)分隔的文件列表犀农,用于每個(gè)要部署的附加工件。如果 filestypes 中的條目數(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)確保使用 puttygenopenssh 格式密鑰轉(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只恨、artifactIdversionpackage 信息是從給定 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 的版本。

部署 sourcesjavadoc 的 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)將 sourcesjavadoc 參數(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 的版本箭昵。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末税朴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子家制,更是在濱河造成了極大的恐慌正林,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颤殴,死亡現(xiàn)場離奇詭異觅廓,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)涵但,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門杈绸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人矮瘟,你說我怎么就攤上這事瞳脓。” “怎么了澈侠?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵劫侧,是天一觀的道長。 經(jīng)常有香客問我,道長烧栋,這世上最難降的妖魔是什么写妥? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮劲弦,結(jié)果婚禮上耳标,老公的妹妹穿的比我還像新娘醇坝。我一直安慰自己邑跪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布呼猪。 她就那樣靜靜地躺著画畅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宋距。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音句占,去河邊找鬼岛杀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛壶唤,可吹牛的內(nèi)容都是我干的雳灵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼闸盔,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼悯辙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起迎吵,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤躲撰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后击费,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拢蛋,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年蔫巩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谆棱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡批幌,死狀恐怖础锐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情荧缘,我是刑警寧澤皆警,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站截粗,受9級(jí)特大地震影響信姓,放射性物質(zhì)發(fā)生泄漏鸵隧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一意推、第九天 我趴在偏房一處隱蔽的房頂上張望豆瘫。 院中可真熱鬧,春花似錦菊值、人聲如沸外驱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昵宇。三九已至,卻和暖如春儿子,著一層夾襖步出監(jiān)牢的瞬間瓦哎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國打工柔逼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蒋譬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓愉适,卻偏偏與公主長得像犯助,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子儡毕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • WAR 插件負(fù)責(zé)收集 Web 應(yīng)用程序的所有依賴項(xiàng)也切、類和資源,并將它們打包到 WAR 包中腰湾,僅包含 scope 為...
    rosy_dawn閱讀 6,826評(píng)論 0 0
  • maven-jar-plugin 該插件提供了構(gòu)建 JAR 包的功能雷恃。如果您喜歡對(duì) JAR 包簽名,請(qǐng)使用 Mav...
    rosy_dawn閱讀 3,407評(píng)論 0 0
  • Maven 生命周期及其階段 Maven 基于生命周期的核心概念费坊。有三個(gè)內(nèi)置的生命周期: clean:負(fù)責(zé)清理項(xiàng)目...
    rosy_dawn閱讀 574評(píng)論 0 0
  • 簡介 該插件提供了將工件打包成 Uber jar 的功能倒槐,包括其依賴項(xiàng),并對(duì)某些依賴項(xiàng)的包進(jìn)行處理附井。Shade 插...
    rosy_dawn閱讀 19,159評(píng)論 0 8
  • POM 代表“Project Object Model”讨越。它是 Maven 項(xiàng)目的 XML 表示形式,保存在名為 ...
    rosy_dawn閱讀 1,884評(píng)論 0 1