Maven 结构解析

Maven 结构解析

本文将简单介绍如何解析 Maven 的 目录结构和 POM 文件结构。

目录结构

Maven 有一套默认的目录结构,这篇 文章已经总结的很好了,我们当然不用硬记住每一项的名字用处,因为这本身就是约定俗成的。程序员最喜欢打破常规,即使是键盘也要自定义映射整成全平台统一。不过如果真有厂商 ALL IN ONE 了,我们又会出于安全考虑 DIY 一份。当然我也知道为了方便大家理解,名字就是用处,但是也有例外,比如 it 表示集成测试,这个我真是第一次见。言归正传,总之就是不要硬背了,但至少要明白 targetsrc/main/javasrc/test/java

POM 结构

Maven 更重要的是配 POM(Project Object Model)文件,它利用 XML 将项目的依赖项构建方式开发者信息等组织起来。其中,最重要的属性是 groupIdartifactIdversion

不同 POM 文件之间的组织关系可以分为项目聚合项目继承两类,也就是说两个 POM 之间既可以分上下级(父子关系),也可以并列(聚合模块)。

继承关系示例代码

com.mycompany.app:my-module:1 的 POM 文件

1
2
3
4
5
6
7
8
9
10
11
<project> 
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
</parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-module</artifactId>
<version>1</version>
</project>

如果和父 POM 的版本、组织绑定,那 com.mycompany.app:my-module:1 的 POM 文件也可以简写为

1
2
3
4
5
6
7
8
9
<project> 
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
</parent>
<artifactId>my-module</artifactId>
</project>

com.mycompany.app:my-app:1 的 POM 文件

1
2
3
4
5
6
<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 的 POM 文件

1
2
3
4
5
6
<project> 
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-module</artifactId>
<version>1</version>
</project>

com.mycompany.app:my-app:1 的 POM 文件

1
2
3
4
5
6
7
8
9
10
<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-app:1 的 POM

1
2
3
4
5
6
7
8
9
10
<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 的 POM

1
2
3
4
5
6
7
8
9
10
<project> 
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
<artifactId>my-module</artifactId>
</project>

项目插值

项目插值可以通过形如 ${variable} 来引用某个变量的值,减少代码冗余。这里的变量又分三类,一种很好理解,就是 xml 标签对应的值,比如 ${project.groupId}${project.version}${project.build.sourceDirectory} 等。第二种是 Properties,需要我们自己定义,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<project> 
...
<properties>
<mavenVersion>3.0</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-core</artifactId>
<version>${mavenVersion}</version>
</dependency>
</dependencies>
...
</project>

第三种是特殊变量,包括:

  1. project.basedir 当前项目所在的目录。
  2. project.baseUri 当前项目所在的目录,表示为 URI
  3. maven.build.timestamp 表示构建开始时的时间戳(使用协调世界时 UTC)。

我们甚至可以利用 Properties 指定 maven.build.timestamp 的格式:

1
2
3
4
5
6
7
<project> 
...
<properties>
<maven.build.timestamp.format>yyyy-MM-dd'T'HH:mm:ss'Z'</maven.build.timestamp.format>
</properties>
...
</project>

参考

【1】Introduction to the POM

【2】Maven 学习 - 目录结构

作者

zion h4

发布于

2023-05-28

更新于

2024-09-08

许可协议

评论