502 Maven-标准目录&Profile&POM

Maven标准目录

${basedir}
|-- pom.xml
|-- src
|   |-- main
|   |   `-- java
|   |   `-- resources
|   |   `-- filters
|   |   `-- webapp
|   `-- test
|   |   `-- java
|   |   `-- resources
|   |   `-- filters
|   `-- it
|   `-- assembly
|   `-- site
|-- target
`-- LICENSE.txt
`-- NOTICE.txt
`-- README.txt

常用目录

  • src/main/java 源代码
  • src/main/resources 资源文件
  • src/main/filters 资源过滤文件
  • src/main/webapp web应用的源码,例如web.xml
  • src/test/java 测试代码
  • src/test/resources 测试相关资源文件
  • src/test/filters 测试相关资源过滤文件
  • target 项目构建后的文件,例如jar包,class文件

不常用目录

  • src/it 集成测试代码
  • src/assembly 组件(Assembly)
  • src/site 站点文件
  • LICENSE.txt 项目的许可文件
  • NOTICE.txt 注意事项
  • README.txt readme

POM文件内容

POM全称Project Object Model。是Maven工作时的基本组件。

POM包含了关于工程基本配置,依赖,目标,插件扥等各种配置细节的信息,Maven使用这些信息构建工程。

Minimal POM

项目中的POM文件,至少需要包含以下信息。

  • project root - 项目根信息
  • modelVersion - Maven的model version,当前默认4.0。
  • groupId - 工程分组ID
  • artifactId - 工程名称
  • version - 工程版本号

示例:

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.wt</groupId>
    <artifactId>maven-share</artifactId>
    <version>1.0-SNAPSHOT</version>
</project>

SUPER POM

所有的 POM 都继承自一个父POM(无论是否显式定义了这个父 POM)。父POM也被称作 Super POM,它包含了一些可以被继承的默认设置,例如Maven默认的中央仓库。

SUPER POM路径:maven-model-builder-{version}.jar包的org/apache/maven/model中的pom-4.0.0.xml

Project Inheritance

除了SUPER POM,我们可以在POM文件中通过标签,继承指定模块下的POM文件。

例如,项目目录结构如下。

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

my-module/pom.xml是com.child:child:1的POM文件,而pom.xml是com.parent:parent:1的POM文件。

com.child:child:1的配置信息如下。

<project>
  <parent>
    <groupId>com.parent</groupId>
    <artifactId>parent</artifactId>
    <version>1</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.child</groupId>
  <artifactId>child</artifactId>
  <version>1</version>
</project>

Project Aggregation

Project Aggregation与Project Inheritance作用类似,只是配置方式不同。

我们不需要再子POM中通过标签指定父POM,而是在父POM中通过指定子POM。

还是以com.child:child:1和com.parent:parent:1为例,项目目录结构不变,采用Project Aggregation的配置方式如下。

<!-- com.child:child:1 -->
<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.child</groupId>
  <artifactId>child</artifactId>
  <version>1</version>
</project>
<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.parent</groupId>
  <artifactId>parent</artifactId>
  <version>1</version>
  <packaging>pom</packaging>
 
  <modules>
    <module>child</module>
  </modules>
</project>

Project Inheritance VS Project Aggregation

如果你有一些配置信息再很多Project中是通用的,那么建议将通用信息配置到一个父POM中,然后采用Project Inheritance的方式继承。

如果你有多个Project需要一起构建,例如一个系统下区分了很多子模块,那么建议采用Project Aggregation的方式,定义一个父POM,在其中指明包含的子POM。

POM标签

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
                      http://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 Reference: https://maven.apache.org/pom.html

Maven Profile

Profile是一组标签集合,定义在标签中。我们可以在下面三个位置定义Profile信息。

类型 位置 说明
Per Project 工程POM文件中 对当前项目生效
Per User %USER_HOME%/.m2/settings.xml 对当前用户生效
Global %M2_HOME%/conf/settings.xml 全局生效

profile优先级

  • settings.xml高于pom.xml
  • Per User高于Global

profile示例

<profiles>
  <profile>
    <id>sfprofile</id>
    <properties>
      <maven.repository.url>https://pkgs.dev.azure.com/anteraja/_packaging/JV-Artifacts/maven/v1</maven.repository.url>   
    </properties>
    <repositories>
      <repository>
        <id>releases</id>
        <name>Nexus Release Repository</name>
        <url> http://nexus.sf-express.com/nexus/content/groups/public/</url>
      </repository>
    </repositories>
  </profile>
</profiles>

完整标签及详细说明请参考官网: https://maven.apache.org/guides/introduction/introduction-to-profiles.html

学习资料

[1] Introduction to the POM http://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Minimal_POM [2] Introduction to Build Profiles https://maven.apache.org/guides/introduction/introduction-to-profiles.html

上篇502 Maven-构建生命周期
下篇002-数据结构与算法-树