Maven-POM

357 阅读2分钟

什么是POM

全称:Project Object Model,项目对象模型,是Maven的基本工作单元。存在形式是一个XML格式的文件,这个文件里包含了Maven构建项目时所需的信息。

Super POM

在Maven中,所有的POM都继承一个基础的POM,这个POM称为Super POM(传送门)。

默认配置

Super POM中,有很多默认的配置,对于我们理解Maven的一些构建行为很有帮助。

1)基本信息

...
    //构建输出目录
    <directory>${project.basedir}/target</directory>
    //源代码编译产生的class文件输出路径
    <outputDirectory>${project.build.directory}/classes</outputDirectory>
    //打包之后的文件名称
    <finalName>${project.artifactId}-${project.version}</finalName>
    //测试代码编译产生的class文件输出路径
    <testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
    //源代码存放路径
    <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
    //源脚本存放路径
    <scriptSourceDirectory>${project.basedir}/src/main/scripts</scriptSourceDirectory>
    //单元测试代码存放路径
    <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
...

2)资源文件
${project.basedir}/src/main/resources下的资源文件在项目编译之后会被复制一份到${project.build.directory}/classes。测试相关的资源文件类似。

    <resources>
      <resource>
        <directory>${project.basedir}/src/main/resources</directory>
      </resource>
    </resources>
    <testResources>
      <testResource>
        <directory>${project.basedir}/src/test/resources</directory>
      </testResource>
    </testResources>

3)仓库管理
默认情况下,Maven从https://repo.maven.apache.org/maven2获取依赖和插件。

  <repositories>
    <repository>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>
 
  <pluginRepositories>
    <pluginRepository>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <releases>
        <updatePolicy>never</updatePolicy>
      </releases>
    </pluginRepository>
  </pluginRepositories>

...

以上的默认配置,都可以在子POM中覆盖。

最小份POM

POM中至少包含以下元素,如下例子

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

POM之间的关系

继承

继承可以复用配置,Super POM即为继承的一个典例,下面给出2种不同项目结构的继承实现。

1)例子1

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

my-module如果想继承parent的pom,如下

<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>

2)例子2

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

my-module如果想继承parent的pom,这是需要使用到relativePath

<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>

聚合

聚合可以实现多模块构建,要想使用聚合需要执行以下2个步骤

  1. 修改父POM的pacakaging=pom
  2. 在父pom种指定modules

比如,项目模块如下

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

parent如果想聚合mly-module,那么配置如下

<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>

同理继承,指定模块时可以使用相对路径

.
 |-- my-module
 |   `-- pom.xml
 `-- parent
     `-- pom.xml
     
<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项目存在相同的配置,那么可以通过继承重构这些项目,复用相同的配置。

如果希望多个项目一起构建,那么就可以使用聚合。

继承与聚合不是非此即彼的关系,可以同时使用,具体项目,具体分析,灵活组合。