关于maven:Maven-POM配置-译文

POM原文: https://maven.apache.org/guid…

构建我的项目

开发Java的过程中可能会应用很多依赖包,来自第三方的或者由本人搭建的Maven仓库。依赖包之间的版本兼容治理是开发中一个辣手的问题。Maven将所有依赖无关的信息记录在pom.xml文件上,而后主动地下载和构建这些依赖包。

什么是POM

POM全称Project Object Model(我的项目对象模型),是Maven的根本单元。这个XML文件蕴含了所有对于我的项目配置的信息,这些信息将用于Maven构建我的项目。它蕴含了一些默认值,target文件夹是build目录,src/main/java文件夹是源代码目录,src/test/java是测试目录。运行Maven时,Maven会首先寻找POM所在的文件夹,而后获取其中的配置信息,最初执行它将要做的工作。

Super POM

POM文件之间能够有依赖关系,一个POM文件能够应用它继承的POM文件的配置信息。所有的POM文件都隐式地继承于super-POM,super-POM的内容可见:https://maven.apache.org/ref/…

Minimal POM (最小POM)

一个最小的无效POM文件须要蕴含以下的配置信息

project:配置信息的根

modelVersion:设置为4.0.0

groupId:我的项目的组id

artifactId:我的项目的id

version:我的项目的版本

以下是一个示例

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

组id,id和版本组成一个我的项目残缺的非法名称,例如组id为com.xich.app,我的项目id为super-teacher,版本号为1.0.0.RELEASE。那么一个非法的残缺的项目名称为com.xich.app:super-teacher:1.0.0.RELEASE

下面的最小POM配置没有告知Maven要执行什么指标(goal),那么Maven就会执行默认的指标(记住,这些默认的配置来自POM文件继承的super-POM)。默认指标就是将目前这个我的项目打包为一个jar包。

最小POM配置也没有阐明Maven仓库的地址,super-POM中申明了仓库为https://repo.maven.apache.org/maven2,那么它就会从这个仓库中下载所需的包。

我的项目继承

POM中可被合并的元素包含:

dependencies:依赖

developers and contributors:开发者和贡献者

plugin lists:插件列表

plugin executions with matching ids:带有id的插件执行

plugin configuration:插件配置

resources:资源

你能够应用parent元素申明继承。

例子

以最小POM中的POM为例子,即com.mycompany.app:my-app:1,咱们引入另一个我的项目:com.mycompany.app:module-alpha:1

我的项目的目录构造:

.
    |--module-alpha
    |    --pom.xml
    --pom.xml

能够看到module-alpha.pom.xmlcom.mycompany.app:module-alpha:1的POM配置。

当初,咱们想让com.mycompany.app:my-app:1作为父我的项目,那么module-alphapom.xml应该为

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

其中relativePath指定了POM的所在位置

我的项目整合 (Project Aggregation)

我的项目整合相似我的项目继承,但它不是指定模块的POM作为父级POM,而是指定父级POM中的模块进行整合。这样,父级我的项目就晓得它的模块有哪些,如果一个Maven指令在父我的项目中执行,那么Maven指令同样会执行在父我的项目的模块中。

具体用法:

  1. 将父级POM打包进pom
  2. 在父级POM中指定其子模块的目录
例子

仍然是取下面的两个POM作为示例

位于.\pom.xmlcom.mycompany.app:my-app:1

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

位于.\module-alpha\pom.xmlcom.mycompany.app:module-alpha:1

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

要把module-alpha整合进my-app中,就要批改my-app的POM配置为:

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

下面的POM没有申明module-alpha的门路,是因为个别状况下,模块的POM在父级POM的下一级目录,且目录名称个别为模块名称。如果模块的门路不合乎上述标准,那么module元素中应该表明模块的门路,例如:

<modules>
    <module>../my-module</module>
</modules>

变量

POM有预约义变量和自定义变量。例如版本号元素versionproject元素上的子元素,那么能够通过以下形式复用这个变量。

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

变量是在继承后处理的。因而,如果在POM中定义了某个父级POM中已有的变量,那么父级POM中的变量就会被笼罩掉。

非凡变量

project.basedir:以后我的项目的目录

project.baseUri:以后我的项目的url目录

maven.build.timestamp:我的项目构建的工夫戳

工夫戳的格局能够用以下形式进行自定义:

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

自定义工夫戳格局的语法可见:https://docs.oracle.com/javas…

自定义变量能够应用properties元素,示例:

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

以上例子中在properties定义了mavenVersion,在dependencies中引入两个都应用了这个变量作为版本号,调用变量的语法为${变量名}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理