什么是POM?

POM代表“项目对象模型”。 它是Maven工程的XML表示形式,保存在一个名为pom. XML的文件中。Maven的开发人员说项目不仅仅是包含代码的文件集合。一个项目包含配置文件,以及所涉及的开发人员和他们所扮演的角色,缺陷跟踪系统,组织和许可,项目所在的URL,项目的依赖关系,以及所有其他能够发挥作用使代码具有生命力的小部分。这是一个一站式的项目。事实上,在Maven世界中,项目根本不需要包含任何代码,只需包含一个pom.xml即可。

快速预览

这是一个直接在POM的元素下面的元素列表。注意,modelVersion包含4.0.0。这是目前唯一支持的POM版本,并且始终是必需的。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
 
  <!-- The Basics -->
  <groupId>...</groupId>
  <artifactId>...</artifactId>
  <version>...</version>
  <packaging>...</packaging>
  <dependencies>...</dependencies>
  <parent>...</parent>
  <dependencyManagement>...</dependencyManagement>
  <modules>...</modules>
  <properties>...</properties>
 
  <!-- Build Settings -->
  <build>...</build>
  <reporting>...</reporting>
 
  <!-- More Project Information -->
  <name>...</name>
  <description>...</description>
  <url>...</url>
  <inceptionYear>...</inceptionYear>
  <licenses>...</licenses>
  <organization>...</organization>
  <developers>...</developers>
  <contributors>...</contributors>
 
  <!-- Environment Settings -->
  <issueManagement>...</issueManagement>
  <ciManagement>...</ciManagement>
  <mailingLists>...</mailingLists>
  <scm>...</scm>
  <prerequisites>...</prerequisites>
  <repositories>...</repositories>
  <pluginRepositories>...</pluginRepositories>
  <distributionManagement>...</distributionManagement>
  <profiles>...</profiles>
</project>

最基本的pom.xml

POM包含关于项目的所有必要信息,以及在构建过程中使用的插件的配置。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
 
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>my-project</artifactId>
  <version>1.0</version>
</project>

maven坐标(Maven Coordinates)

上面定义的POM是Maven允许的最小配置。 groupId:artifactId:version都是必选字段(不过,如果groupId和version是从父类继承来的,则不需要显式定义)。 这三个字段很像地址和时间戳的组合。 这标记了存储库中的特定位置,Maven项目的坐标系统:

  • groupId:这通常是一个组织或项目中唯一的。例如,所有核心的Maven工件都位于groupId: org.apache.maven之下。组ID不一定使用点符号,例如junit项目。请注意,点标记的groupId不必对应于项目包含的包结构。然而,这是一个很好的实践。在存储库中存储时,组的行为与操作系统中的Java打包结构非常相似。圆点被特定于操作系统的目录分隔符(如Unix中的'/')取代,它成为来自基本存储库的相对目录结构。在给出的示例中,org.codehaus.mojo组位于$M2_REPO/org/codehaus/mojo目录中。

  • artifactId: artifactId通常是项目的名称。尽管groupId很重要,但是小组内的人很少在讨论中提到groupId(他们通常都是相同的ID,例如MojoHaus项目groupId: org.codehaus.mojo)。它和groupId一起创建了一个键,将这个项目与世界上其他所有项目分开。artifactId与groupId一起,artifactId完全定义了构件在存储库中的地址。

  • version:artifactId表示单个项目,但它不能描述项目的哪个化身。我们是想要junit: 2018年的junit(版本4.12),还是2007年的junit(版本3.8.2)?简而言之:代码更改,应该对这些更改进行版本控制,并且此元素保持这些版本一致。version还在工件的存储库中用于将版本彼此分离。my-project version 1.0文件位于目录结构$M2_REPO/org/codehaus/mojo/my-project/1.0中。

上面给出的三个元素指向一个项目的特定版本,让Maven知道我们在和谁打交道,以及在它的软件生命周期中什么时候需要它们。

包装;打包(packaging)

现在我们已经有了groupId:artifactId:version的地址结构,还有一个标准标签可以给我们一个真正完整的东西:这就是项目的包装。在我们的例子中,上面定义的org.codehaus.mojo:my-project:1.0的示例POM将被打包为一个jar。我们可以通过宣布一个不同的包装来让它变成一个war:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <packaging>war</packaging>
  ...
</project>

当没有声明打包时,Maven假定默认打包为:jar。当前的核心打包值是:pom、jar、maven-plugin、ejb、war、ear、rar。

POM的关系(POM Relationships)

Maven的一个强大方面是它对项目关系的处理:这包括依赖关系、传递依赖关系、继承和聚合(多模块项目)。Maven会创建一个公共的本地存储库,从该存储库可以正确地链接项目、版本和所有项目。

POM的依赖(Dependencies)

跳转

POM聚合

跳转

最终

Maven POM很大。然而,它的大小也证明了它的多功能性。至少可以说,将项目的所有方面抽象为单个工件的能力是强大的。关于每个单独的项目有几十个不同的构建脚本和分散的文档的日子已经一去不复返了。随着Maven的其他恒星的Maven星系——一个定义良好的构建生命周期,易于编写和维护的插件,集中存储库,系统和基于用户的配置,以及越来越多的工具使开发人员的工作更容易维护复杂的项目- POM是大,但是明亮的中心。

posted on 2021-07-22 10:56  哑吧  阅读(128)  评论(0)    收藏  举报