閱讀993 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《Maven官方文檔》POM文件(二)

工程繼承

POM中可配置的元素如下:

  • 依賴 (dependencies)
  • 開發者和貢獻者 (developers and contributors)
  • 插件列表,包括報告 (plugin lists, including reports)
  • 相應id的插件執行 (plugin executions with matching ids)
  • 插件配置 (plugin configuration)
  • 資源 (resources)

Super POM就是一個工程繼承的例子。你也可以通過在POM中指定parent element來引入你自己的POM作為基礎。就像下麵的例子:

Example 1

情景

在這個例子中,我們還是沿用com.mycompany.app:my-app:1這個名稱。現在讓我們引入另一個工件,com.mycompany.app:my-module:1.

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-module</artifactId>
  <version>1</version>
</project>

指定它們的目錄結構如下:

.
|-- my-module
| `-- pom.xml
`-- pom.xml

注意: my-module/pom.xml 是com.mycompany.app:my-module:1 的POM文件,而 pom.xml 是com.mycompany.app:my-app:1的POM文件。

解決方案

現在,如果我們將com.mycompany.app:my-app:1指定為com.mycompany.app:my-module:1的父工件(parent artifact),我們需要修改com.mycompany.app:my-module:1的POM文件如下:

<project>
  <parent>
    <groupId>com.mycompany.app</groupId>
    <artifactId>my-app</artifactId>
    <version>1</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-module</artifactId>
  <version>1</version>
</project>

注意,我們需要添加一個parent結點,這個結點允許我們指定當前POM的父POM。通過指定父POM的完整名稱(即groupId,artifactId,version這三個標簽),我們的模塊(module)就能夠繼承父POM中的屬性了。

另外,如果我們希望groupId和模塊的version和他們的parents相同,你可以移除當前模塊POM中的groupId和version標簽。

<project>
  <parent>
    <groupId>com.mycompany.app</groupId>
    <artifactId>my-app</artifactId>
    <version>1</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <artifactId>my-module</artifactId>
</project>

這樣做可以讓當前模塊集成父POM的groupid和version。

Example 2

情景

在父工程已經安裝在本地倉庫或指定目錄結構(父POM是模塊POM的上一級目錄)中時,這樣做是可以得。

但是如果父工程沒有安裝或者是像這樣的目錄機構呢?

.
|-- my-module
|   `-- pom.xml
`-- parent
`-- pom.xml

解決方案

為了修正這個目錄結構,我們將在parent結點中添加<relativePath>元素。

<project>
  <parent>
    <groupId>com.mycompany.app</groupId>
    <artifactId>my-app</artifactId>
    <version>1</version>
    <relativePath>../parent/pom.xml</relativePath>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <artifactId>my-module</artifactId>
</project>

顧名思義,這個元素指定了從模塊POM到其父POM的相對路徑。

工程聚合

工程聚合和工程繼承很相似,但不是從子模塊指定父POM,而是從父POM指定子模塊。這樣做的話,父工程就知道子模塊的存在了,而且如果Maven命令從父工程調用,在子模塊中也能順利執行。工程聚合要求如下做法:

  • 將父POM的packageing屬性設為”pom”
  • 在父POM中指定模塊的目錄(子POM)

Example 3

情景

還是上次的POM和目錄結構

com.mycompany.app:my-app:1’s POM

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1</version>
</project>

com.mycompany.app:my-module:1’s POM

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-module</artifactId>
  <version>1</version>
</project>

directory structure

.
|-- my-module
|   `-- pom.xml
`-- pom.xml

解決方案

如果我們準備將my-module聚合進my-app中,我們隻需要修改my-app。

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1</version>
  <packaging>pom</packaging>
 
  <modules>
    <module>my-module</module>
  </modules>
</project>

在修改後的POM中,增加了packaging部分和模塊部分,packaging的值設為”pom”,模塊部分增加了<module>my-module</module>。<module>的值是com.mycompany.app:my-app:1到com.mycompany.app:my-module:1的POM的相對路徑(練習中,我們用模塊的artifactId作為目錄名稱)。

現在,當Maven命令在com.mycompany.app:my-app:1中執行時,同樣的明明也會在com.mycompany.app:my-module:1中執行。此外,有些命令(goals soecifically)以不同的方式處理工程聚合的情況。

Example 4

情景

如果我們將目錄結構改成這樣

.
|-- my-module
|   `-- pom.xml
`-- parent
`-- pom.xml

父POM又該如何指定子模塊呢?

解決方案

答案是 – 跟Example 3一樣,指定路徑就好了。

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1</version>
  <packaging>pom</packaging>
 
  <modules>
    <module>../my-module</module>
  </modules>
</project>

工程繼承與工程聚合

如果你有好幾個Maven 工程,並且這些工程有著相似的配置,你可以通過將相同的配置放到一個父工程中來重構。這樣的話,你所要做的就是讓你的Maven工程繼承這個父工程,這些配置就能在所有的工程中通用了。

如果你有一組工程一起構建和運行,你可以創建一個父工程,並在父工程中聲明這些工程為它的模塊,這樣做,你隻要構建父工程,子工程也會隨之構建。

當然,你可以同時做工程繼承和工程聚合。這意味著,你可以為你的所有模塊指定一個父工程,同時,父工程中可以指定其餘的Maven工程為它的子模塊。你隻需要應用這三條規則:

  • 在所有子POM中指定它們的父POM。
  • 將父POM的packaging元素的值設為”pom”。
  • 在父POM中指定子模塊(子POM)的目錄。

Example 5

情景

還是上次的POM,

com.mycompany.app:my-app:1’s POM

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1</version>
</project>

com.mycompany.app:my-module:1’s POM

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-module</artifactId>
  <version>1</version>
</project>

目錄結構

.
|-- my-module
|   `-- pom.xml
`-- parent
`-- pom.xml

解決方案

同時做工程繼承和工程聚合,你隻要應用三條法則。

com.mycompany.app:my-app:1’s POM

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1</version>
  <packaging>pom</packaging>
 
  <modules>
    <module>../my-module</module>
  </modules>
</project>

com.mycompany.app:my-module:1’s POM

<project>
  <parent>
    <groupId>com.mycompany.app</groupId>
    <artifactId>my-app</artifactId>
    <version>1</version>
    <relativePath>../parent/pom.xml</relativePath>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <artifactId>my-module</artifactId>
</project>

注意:配置繼承的策略與POM繼承的策略相同

工程改寫和變量

Maven鼓勵的做法是不要做重複的工作(don’t repeat yourself)。但總有在不同的地方使用相同屬性的情況。為了確保屬性值指定一次,Maven允許你在POM使用你自己的變量或者預先定義的變量。

舉個例子,為了使用project.version這個變量,你可以這樣引用:

<version>${project.version}</version>

要注意的是這些變量在繼承之後才會被處理。這意味著如果一個父工程使用了一個變量,它們在子工程中的定義與在父工程中的定義會不一樣,是最後使用的那個。

可用的變量

工程模型變量

一個Model的任何字段都是一個單獨的可以做為變量引用的值元素。例如,${project.groupId}, ${project.version},${project.build.sourceDirectory} 等等。參考POM reference 列舉的全部屬性。這些變量都用”project”前綴來引用。你可以看看pom references. 作為前綴,或者完全省略前綴 – 這些形式現在已經廢棄不再使用了。

特殊變量

project.basedir 當前工程所在的目錄
project.baseUri 當前工程所在的目錄,表示為一個URI,Maven 2.1.0之後
maven.build.timestamp 時間戳,表示開始構建的時間,Maven 2.1.0-M1之後

構建時間戳的格式可以在maven.build.timestamp.format屬性中自定義,示例如下:

<project>
  ...
  <properties>
    <maven.build.timestamp.format>yyyy-MM-dd'T'HH:mm:ss'Z'</maven.build.timestamp.format>
  </properties>
  ...
</project>

格式化模式必須遵守API文檔中給出的規則。如果這個屬性不存在,默認值就是示例中給出的值

屬性

你同樣可以將任何在工程中定義的屬性作為變量引用,看看下麵的例子:

<project>
  ...
  <properties>
    <mavenVersion>2.1</mavenVersion>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-artifact</artifactId>
      <version>${mavenVersion}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-project</artifactId>
      <version>${mavenVersion}</version>
    </dependency>
  </dependencies>
  ...
</project>

轉載自 並發編程網 - ifeve.com

最後更新:2017-05-19 16:38:02

  上一篇:go  《maven官方文檔》5分鍾開始Maven
  下一篇:go  《Maven官方文檔》POM文件(一)