《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>
相关文章
|
3月前
|
Java Maven 数据安全/隐私保护
弄懂maven仓库 & 仓库优先级 & settings & pom配置关系及差异
弄懂maven仓库 & 仓库优先级 & settings & pom配置关系及差异
503 1
|
3月前
|
SQL Java 数据库连接
Mybatis之Mybatis简介、搭建Mybatis相关步骤(开发环境、maven、核心配置文件、mapper接口、映射文件、junit测试、log4j日志)
【1月更文挑战第2天】 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下,iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)
203 3
Mybatis之Mybatis简介、搭建Mybatis相关步骤(开发环境、maven、核心配置文件、mapper接口、映射文件、junit测试、log4j日志)
|
24天前
|
Java Maven
maven:the pom for XXX is missing, no dependency information available
maven:the pom for XXX is missing, no dependency information available
17 0
|
3月前
|
IDE Java Maven
解决 idea maven项目启动项目不编译target 文件问题
解决 idea maven项目启动项目不编译target 文件问题
107 2
|
3月前
|
Java Maven
IDEA Maven SpringBoot配置POM文件
IDEA Maven SpringBoot配置POM文件
37 0
|
3月前
|
Java Maven Spring
pom.xml文件中spring-boot-maven-plugin爆红的原因
pom.xml文件中spring-boot-maven-plugin爆红的原因
46 1
|
4月前
|
SQL druid Java
三步实现maven工程集成logback日志框架(日志按天滚动生成文件)并附源码
三步实现maven工程集成logback日志框架(日志按天滚动生成文件)并附源码
81 0
|
18天前
|
Java Maven Windows
一个命令解决maven依赖下载失败后无法重新下载依赖的问题-批量删除repository库目录下所有后缀名是.lastUpdated的文件
一个命令解决maven依赖下载失败后无法重新下载依赖的问题-批量删除repository库目录下所有后缀名是.lastUpdated的文件
88 0
|
1月前
|
Java Maven
手把手教你搭建Maven项目
手把手教你搭建Maven项目
31 0
|
2月前
|
Java Maven
java修改当前项目的maven仓库地址为国内
修改当前项目的maven仓库地址为国内

热门文章

最新文章

推荐镜像

更多