pom.xml结构分析

POM 项目对象模型
pom是Maven项目保存在名为的文件中的XML表示形式pom.xml。在Maven人士在场的情况下,谈论项目是从哲学的意义上讲,而不仅仅是包含代码的文件集合。一个项目包含配置文件,以及所涉及的开发人员及其扮演的角色,缺陷跟踪系统,组织和许可证,项目所在的URL,项目的依存关系以及所涉及的所有其他小部分玩以赋予代码生命。它是与该项目有关的所有事情的一站式服务。实际上,在Maven世界中,一个项目根本不需要包含任何代码,只需包含一个pom.xml。

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

Maven 坐标(Coordinates)

  • 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一起创建了一个密钥,该密钥将该项目与世界上其他所有项目分开(至少,它应该:))。与groupId一起,artifactId完全定义了存储库中工件的居住区。对于上述项目,my-project在$M2_REPO/org/codehaus/mojo/my-project。
  • version:这是命名难题的最后一部分。groupId:artifactId表示一个项目,但无法描述我们正在谈论的那个项目的具体化身。我们要junit:junit2018年版(4.12版)还是2007年版(3.8.2版)?简而言之:代码更改,应该对这些更改进行版本控制,并且此元素使这些版本保持一致。它还在工件的存储库中使用,以将版本彼此分开。my-project版本1.0文件位于目录结构中$M2_REPO/org/codehaus/mojo/my-project/1.0。

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
                      http://maven.apache.org/xsd/maven-4.0.0.xsd“ >
  ...
  <packaging>war</ packaging>
  ...
</ project>

Dependencies
POM的基础是其依赖项列表。大多数项目都依赖于其他项目来正确构建和运行。如果Maven为您所做的全部工作就是管理此列表,那么您会收获很多。Maven下载并链接了对编译以及依赖它们的其他目标的依赖。作为一个额外的好处,Maven引入了那些依赖项(传递性依赖项)的依赖项,使您的列表可以仅专注于项目所需的依赖项。

  • groupId,artifactId:直接依赖项的对应坐标,
  • version:依赖版本要求规范,用于计算依赖的有效版本。
    1.0:1.0的软要求。如果没有其他版本出现在依赖关系树中,请使用1.0。
    [1.0]:1.0的严格要求。仅使用1.0和1.0。
    (,1.0]:任何<= 1.0版本的硬性要求。
    [1.2,1.3]:严格要求1.2和1.3之间的任何版本。
    [1.0,2.0):1.0 <= x <2.0; 硬性要求介于1.0到2.0之间的任何版本。
    [1.5,):大于或等于1.5的任何版本的硬性要求。
    (,1.0],[1.2,):对于小于或等于1.0或大于或等于1.2而不是1.1的任何版本的硬性要求。多个要求用逗号分隔。
    (,1.1),(1.1,):除1.1以外的任何版本的硬性要求;例如,因为1.1具有严重漏洞。
    Maven选择每个项目的最高版本,该版本可以满足该项目依赖项的所有严格要求。如果没有任何版本可以满足所有严格要求,则构建将失败。
  • classifier:分类器区分从相同POM构建但内容不同的工件。它是一些可选的任意字符串,如果存在,则在版本号之后附加到工件名称。例如,考虑一个提供针对Java 11的工件的项目,同时提供仍支持Java 1.8的工件。第一个工件可以配备分类器jdk11,第二个工件可以配备分类器,jdk8以便客户可以选择使用哪个分类器。
  • type:对应于所选的依赖类型。默认为jar。尽管它通常表示依赖项文件名的扩展名,但并非总是如此:可以将类型映射到其他扩展名和分类器。类型通常对应于所使用的包装,value(type,pom,jar,test-jar,maven-plugin,ejb,ejb-client,war,ear,rar,java-source,javadoc)
  • scope:该元素引用手头任务的类路径(编译和运行时,测试等),以及如何限制依赖项的可传递性。
    1.compile -这是默认范围,如果未指定则使用。编译依赖项在所有类路径中均可用。此外,这些依赖项会传播到相关项目。
    2 provided -这很像编译,表明JDK或容器在运行时提供它。它仅在编译和测试类路径上可用,并且不可传递。
    3.runtime -此作用域指示依赖关系不是编译所必需的,而是执行所必需的。它在运行时和测试类路径中,而不在编译类路径中。
    4.test -此范围表明依赖关系对于正常使用应用程序不是必需的,并且仅在测试编译和执行阶段可用。它不是可传递的。
    5.system -此范围类似于,provided除了必须提供显式包含它的JAR之外,并且不会在存储库中查找。
  • systemPath:仅当依赖项为system才使用。否则,如果设置了此元素,构建将失败。该路径必须是绝对路径,因此建议使用属性来指定机器特定的路径(在下面有更多说明)。由于假定系统范围依赖项是先验安装的,因此Maven不会检查项目的存储库,而是会检查以确保文件存在。如果不是,Maven将使构建失败,并建议您手动下载并安装它。scopesystemproperties${java.home}/lib
  • optional:当此项目本身是依赖项时,将依赖项标记为可选。例如,假设有一个项目A依赖于项目B来编译一部分可能在运行时未使用的代码,那么我们可能不需要B所有项目的项目。因此,如果项目X将项目添加A为自己的依赖项,那么Maven根本不需要安装项目B。象征性地,if =>表示必需的依赖项,并且–>表示可选的,尽管A=>B在构建A时可能是这种情况,而在构建时X=>A–>B可能是这种情况X。
    简而言之,optional让其他项目知道,当您使用此项目时,不需要此依赖关系即可正常工作。
  • 排除项告诉Maven不要包括作为该依赖项的依赖项(即,其传递性依赖项)的指定项目。例如,maven-embedderrequire maven-core和我们不希望使用它依赖的其他jar,那么我们将其添加为exclusion。
  • import仅pom在本dependencyManagement节中的类型依赖项上支持此作用域。它指示将在指定的POM dependencyManagement部分中将依赖关系替换为有效的依赖关系列表。由于已替换它们,因此范围为的依赖项import实际上不会参与限制依赖项的可传递性。
 <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">
      ...
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.12</version>
          <type>jar</type>
          <scope>test</scope>
          <optional>true</optional>
          <exclusions>
            <exclusion>
              <groupId>org.apache.maven</groupId>
              <artifactId>maven-core</artifactId>
            </exclusion>
         </exclusions>
        </dependency>
        <dependencies>
    <dependency>
      <groupId>javax.sql</groupId>
      <artifactId>jdbc-stdext</artifactId>
      <version>2.0</version>
      <scope>system</scope>
      <systemPath>${java.home}/lib/rt.jar</systemPath>
    </dependency>
  </dependencies>
        ...
      </dependencies>
      ...
    </project>

DependencyManagement:POM使用它来帮助管理其所有子级中的依赖项信息。如果my-parent项目用于dependencyManagement在上定义依赖项junit:junit:4.12,则从该继承项继承的POM可以仅通过groupId= junit和artifactId= 设置其依赖项,junit而Maven将由version父项填充该集合。这种方法的好处是显而易见的。可以在一个中央位置设置依赖项详细信息,该位置会传播到所有继承的POM。
注意,如果统一个依赖在多个parent出现,那么它将继承最近的parent中dependencyManagement的version,pom可以继承parent的dependencyManagement,也可以导入其他pom的dependencyManagement

<!--依赖管理,用于管理spring-cloud的依赖-->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley.M8</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.33</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.11</version>
        </dependency>
    </dependencies>
</dependencyManagement>

Properties
属性是了解POM基础知识的最后必需的部分。Maven属性是值占位符,就像Ant中的属性一样。通过使用记号${X},X该属性可以在POM中的任何位置访问它们的值。或者它们可以被插件用作默认值,例如:

   <project>
      ...
      <properties>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
      </properties>
      ...
    </project>

它们有五种不同的样式:

  • env.X:在变量前加上“ env”。将返回外壳的环境变量。例如, e n v . P A T H 包 含 P A T H 环 境 变 量 。 注 意 : 虽 然 环 境 变 量 本 身 在 W i n d o w s 上 不 区 分 大 小 写 , 但 属 性 的 查 找 区 分 大 小 写 。 换 句 话 说 , 尽 管 W i n d o w s S h e l l 为 {env.PATH}包含PATH环境变量。 注意:虽然环境变量本身在Windows上不区分大小写,但属性的查找区分大小写。换句话说,尽管Windows Shell为%PATH%和返回相同的值%Path%,但Maven区分了 env.PATHPATHWindowsWindowsShell{env.PATH}和${env.Path}。为了可靠起见,将环境变量的名称标准化为全部大写。
  • project.x:POM中带点号(.)的路径将包含相应元素的值。例如:1.0可通过访问${project.version}。
  • settings.x:中的点号(.)表示的路径settings.xml将包含相应元素的值。例如:false可通过访问${settings.offline}。
  • Java系统属性:所有可通过java.lang.System.getProperties()访问的属性都可以作为POM属性使用,例如${java.home}。
  • x:在POM中的元素内设置。的值value可以用作${someVar}。

Modules
具有模块的项目称为多模块或聚合器项目。模块是此POM列出的项目,并作为一个组执行。一个pom包装的项目可以通过它们列为模块,这是对目录或这些项目的POM文件的相对路径聚集了一组项目的构建。
列出模块时,您无需自己考虑模块间的依赖关系。也就是说,POM给定的模块顺序并不重要。Maven将对模块进行拓扑排序,以便始终在依赖模块之前构建依赖关系。
要查看实际的聚合,请查看基于MavenMaven Core Plugins的 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-parent</artifactId>
      <version>2.0</version>
      <packaging>pom</packaging>
     
      <modules>
        <module>my-project</module>
        <module>another-project</module>
        <module>third-project/pom-example.xml</module>
      </modules>
    </project>

Base build
build元素的另一个功能是指定项目中资源的位置。资源不是(通常)代码。它们不是经过编译的,而是要捆绑在项目中或用于各种其他原因(例如代码生成)的项目。
如项目需要一个configuration.xml文件(该文件指定容器的组件配置)才能位于META-INF/plexus目录中。尽管我们可以很容易地将该文件放入其中src/main/resources/META-INF/plexus,但我们希望给Plexus自己的目录src/main/plexus。为了使JAR插件正确捆绑资源,您可以指定类似于以下内容的资源

<build>
    <!--项目源码目录,该路径是相对于pom.xml的相对路径。-->
    <sourceDirectory/>
    <!--项目脚本源码目录,该目录和源码目录不同:绝大多数情况下,该目录下的内容 会被拷贝到输出目录,如发布脚本-->
    <scriptSourceDirectory/>
    <!--单元测试使用的源码目录,当测试项目的时候,该路径是相对于pom.xml的相对路径。-->
    <testSourceDirectory/>
    <!--被编译过的应用程序class,resource文件存放的目录。-->
    <outputDirectory/>
    <!--被编译过的测试class,resource文件存放的目录。-->
    <testOutputDirectory/>
    <!-- 项目的一系列构建扩展,它们是一系列build过程中要使用的产品,会包含在running bulid‘s classpath里面。
        他们可以开启extensions,也可以通过提供条件来激活plugins。
        简单来讲,extensions是在build过程被激活的产品--> 
    <extensions>
        <!--描述使用到的构建扩展。-->
        <extension>
            <!--构建扩展的groupId-->
            <groupId/>
            <!--构建扩展的artifactId-->
            <artifactId/>
            <!--构建扩展的版本-->
            <version/>
        </extension>
    </extensions>
    <!--如果未给出目标或阶段,则默认执行。如果给出了目标,则应按命令行中的定义(例如jar:jar)-->
    <defaultGoal/>
    <!--所有资源路径列表,例如和项目相关的属性文件,这些资源被包含在最终的打包文件里。-->
    <resources>
        <!--这个元素描述了项目相关或测试相关的所有资源路径-->
        <resource>
            <!-- 资源编译后存放的目录。该目录默认target/classes目录(例如${project.build.outputDirectory})-->
            <targetPath/>
            <!--true,false是否使用参数值代替参数名,参数值取自pom.xml的properties元素或filter文件列表里配置的属性,pom.xml里的属性高于filter文件,也就是如果统一变量在pom.xm的properties和filter文件同时配置,那么proeperties的值将被使用-->
            <filtering/>
            <!--资源的源文件存放目录,该路径相对POM路径-->
            <directory/>
            <!--包含的文件列表,例如**/*.xml.-->
            <includes/>
            <!--排除的文件列表,例如**/*.xml-->
            <excludes/>
        </resource>
    </resources>
    <!--单元测试资源文件目录,例如和单元测试相关的属性文件。-->
    <testResources>
        <testResource>
            <targetPath/>
            <filtering/>
            <directory/>
            <includes/>
            <excludes/>
        </testResource>
    </testResources>
    <!--构建产生的所有文件存放的目录,默认target-->
    <directory/>
    <!--产生的构件的文件名,默认值是${project.artifactId}-${project.version}-->
    <finalName/>
    <!--当filtering开关打开时,使用到的过滤器属性文件列表-->
    <filters/>
    <!--子项目可以引用的默认插件信息。该插件配置项直到被引用时才会被解析或绑定到生命周期。给定插件的任何本地配置都会覆盖这里的配置-->
    <pluginManagement>
        <!--使用的插件列表 。-->
        <plugins>
            <!--plugin元素包含描述插件所需要的信息。-->
            <plugin>
                <!--插件在仓库里的group ID-->
                <groupId/>
                <!--插件在仓库里的artifact ID-->
                <artifactId/>
                <!--被使用的插件的版本(或版本范围)-->
                <version/>
                <!--true,false是否从该插件下载Maven扩展(例如打包和类型处理器),由于性能原因,只有在真需要下载时,该元素才被设置成enabled。-->
                <extensions/>
                <!--在构建生命周期中执行一组目标的配置。每个目标可能有不同的配置。-->
                <executions>
                    <!--execution元素包含了插件执行需要的信息-->
                    <execution>
                        <!--执行目标的标识符,用于标识构建过程中的目标,或者匹配继承过程中需要合并的执行目标-->
                        <id/>
                        <!--绑定了目标的构建生命周期阶段,如果省略,目标会被绑定到源数据里配置的默认阶段-->
                        <phase/>
                        <!--执行目标-->
                        <goals/>
                        <!--配置是否被传播到子POM-->
                        <inherited/>
                        <!--作为DOM对象的配置-->
                        <configuration/>
                    </execution>
                </executions>
                <!--插件引入插件所需要的额外依赖-->
                <dependencies>
                    <!--参见dependencies/dependency元素-->
                    <dependency>
                        ......
                    </dependency>
                </dependencies>
                <!--任何配置是否被传播到子项目-->
                <inherited/>
                <!--作为DOM对象的配置-->
                <configuration/>
            </plugin>
        </plugins>
    </pluginManagement>
    <!--使用的插件列表-->
    <plugins>
        <!--参见build/pluginManagement/plugins/plugin元素-->
        <plugin>
            <groupId/>
            <artifactId/>
            <version/>
            <extensions/>
            <executions>
                <execution>
                    <id/>
                    <phase/>
                    <goals/>
                    <inherited/>
                    <configuration/>
                </execution>
            </executions>
            <dependencies>
                <!--参见dependencies/dependency元素-->
                <dependency>
                    ......
                </dependency>
            </dependencies>
            <goals/>
            <inherited/>
            <configuration/>
        </plugin>
    </plugins>
</build>

Repository
是遵循Maven存储库目录布局的工件集合。为了成为Maven存储库工件,POM文件必须存在于结构中 B A S E R E P O / g r o u p I d / a r t i f a c t I d / v e r s i o n / a r t i f a c t I d − v e r s i o n . p o m 。 BASE_REPO/groupId/artifactId/version/artifactId-version.pom。 BASEREPO/groupId/artifactId/version/artifactIdversion.pomBASE_REPO可以是本地(文件结构)或远程(基本URL);其余布局将相同。存储库是收集和存储工件的地方。只要项目依赖工件,Maven就会首先尝试使用指定工件的本地副本。如果本地存储库中不存在该工件,则它将尝试从远程存储库下载。POM中的存储库元素指定要搜索的那些备用存储库。
该存储库是Maven社区最强大的功能之一。默认情况下,Maven在https://repo.maven.apache.org/maven2/中搜索中央存储库。可以在pom.xmlrepositories元素中配置其他存储库。

  1. releases,snapshots:这些是每种工件,Release或snapshot的策略。通过这两组,POM可以更改单个存储库中每种类型的策略,而与另一种类型无关。例如,可能出于开发目的而决定仅启用快照下载。
  2. enabled:true或者false是否针对相应的类型(releases或snapshots)启用了此存储库。
  3. updatePolicy:此元素指定应该尝试进行更新的频率。Maven会将本地POM的时间戳(存储在存储库的maven-metadata文件中)与远程进行比较。选项包括:always,daily(默认),interval:X(其中X是分钟内的整数)或never。
  4. checksumPolicy:当Maven将文件部署到存储库时,它还会部署相应的校验和文件。你的选择是ignore,fail或者warn在丢失或不正确的校验。
  5. layout:在以上对存储库的描述中,提到它们都遵循相同的布局。这基本上是正确的。Maven 2引入的布局是Maven 2和3使用的存储库的默认布局。但是,Maven 1.x具有不同的布局。使用此元素可以指定是default还是legacy。
 <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">
  ...
  <pluginRepositories>
     <repository>
      <releases>
        <enabled>false</enabled>
        <updatePolicy>always</updatePolicy>
        <checksumPolicy>warn</checksumPolicy>
      </releases>
      <snapshots>
        <enabled>true</enabled>
        <updatePolicy>never</updatePolicy>
        <checksumPolicy>fail</checksumPolicy>
      </snapshots>
      <name>Nexus Snapshots</name>
      <id>snapshots-repo</id>
      <url>https://oss.sonatype.org/content/repositories/snapshots</url>
      <layout>default</layout>
    </repository>
  </pluginRepositories>
  ...
</project>

pluginRepositories
是两种主要类型的工件的所在地。第一个是用作其他工件依赖项的工件。这些是位于中央的大部分工件。另一种工件是插件。Maven插件本身就是一种特殊的工件。因此,插件存储库可能与其他存储库分开了(尽管我还没有听到有说服力的说法)。无论如何,pluginRepositories元素块的结构与元素相似repositories。在pluginRepository每个元素指定的地方Maven可以找到新的插件远程位置。

<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">
  ...
  <pluginRepositories>
     <repository>
      <releases>
        <enabled>false</enabled>
        <updatePolicy>always</updatePolicy>
        <checksumPolicy>warn</checksumPolicy>
      </releases>
      <snapshots>
        <enabled>true</enabled>
        <updatePolicy>never</updatePolicy>
        <checksumPolicy>fail</checksumPolicy>
      </snapshots>
      <name>Nexus Snapshots</name>
      <id>snapshots-repo</id>
      <url>https://oss.sonatype.org/content/repositories/snapshots</url>
      <layout>default</layout>
    </repository>
  </pluginRepositories>
  ...
</project>

distributionManagement
mvn install 会将项目生成的构件安装到本地Maven仓库,mvn deploy 用来将项目生成的构件分发到远程Maven仓库。本地Maven仓库的构件只能供当前用户使用,在分发到远程Maven仓库之后,所有能访问该仓库的用户都能使用你的构件。

  • downloadUrl:其它的Maven项目可以通过该URL下载并引用当前Maven项目的构件.
  • status:其它的Maven项目可以通过该URL下载并引用当前Maven项目的构件.
    none:无特殊状态。这是POM的默认设置。
    convert:存储库的经理将此POM从较早版本转换为Maven 2。
    partner:此工件已与伙伴存储库同步。
    deployed:该Maven项目的构件是通过Maven 2或Maven 3发布的,最常用的值
    verified:该项目已经过验证,应视为已完成。
<project xmlns = “ http://maven.apache.org/POM/4.0.0” 
  xmlns:xsi = “ http://www.w3.org/001/XMLSchema-instance”
  xsi:schemaLocation = “ http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd“ >
  ...
  <distributionManagement>
    ...
    <downloadUrl> http://mojo.codehaus.org/my-project </ downloadUrl>
    <status> 部署</ status>
  </ distributionManagement>
  ...
</ project>
 <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">
      ...
      <distributionManagement>
        <repository>
          <uniqueVersion>false</uniqueVersion>
          <id>corp1</id>
          <name>Corporate Repository</name>
          <url>scp://repo/maven2</url>
          <layout>default</layout>
        </repository>
        <snapshotRepository>
          <uniqueVersion>true</uniqueVersion>
          <id>propSnap</id>
          <name>Propellors Snapshots</name>
          <url>sftp://propellers.net/maven</url>
          <layout>legacy</layout>
        </snapshotRepository>
        ...
      </distributionManagement>
      ...
    </project>

distributionManagement
repository元素在POM中指定了Maven可以下载远程项目以供当前项目使用的位置和方式,而distributionManagement指定了该项目在部署时将在何处(以及如何)到达远程仓库。如果未定义snapshotRepository,则存储库元素将用于快照分发。

  • id,name:id用于在许多存储库中唯一标识该存储库,并且name是易于阅读的形式。
  • uniqueVersion:唯一版本采用true或false值来表示部署到此存储库的工件应获取唯一生成的版本号,还是使用定义为地址一部分的版本号。
  • url:这是存储库元素的核心。它指定了位置和用于将构建的工件(以及POM文件和校验和数据)传输到存储库的传输协议。
  • layout:这些类型和用途与存储库元素中定义的layout元素相同。他们是default和legacy。
<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">
      ...
      <distributionManagement>
        <repository>
          <uniqueVersion>false</uniqueVersion>
          <id>corp1</id>
          <name>Corporate Repository</name>
          <url>scp://repo/maven2</url>
          <layout>default</layout>
        </repository>
        <snapshotRepository>
          <uniqueVersion>true</uniqueVersion>
          <id>propSnap</id>
          <name>Propellors Snapshots</name>
          <url>sftp://propellers.net/maven</url>
          <layout>legacy</layout>
        </snapshotRepository>
        ...
      </distributionManagement>
      ...
    </project>

Site
除了分发到存储库外,distributionManagement它还负责定义如何部署项目的站点和文档。

  • id,name,url:这些元素与元素中上面的对应元素相似distributionManagement repository。
 <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“ >
  ...
  <distributionManagement>
    ...
    <site>
      <id> mojo.website </ id>
      <name> Mojo site</ name>
      <url> scp://beaver.codehaus.org/home/projects/mojo/public_html/ </ url>
    </ site>
    ...
  </ distributionManagement>
  ...
</ project>

Relocation
如果构件有了新的group ID和artifact ID(构件移到了新的位置),这里列出构件的重定位信息。 可能需要重新发布到新的库。可以将当前Maven项目以新的构件的形式发布到另一个库。

<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">
  ...
  <distributionManagement>
    ...
    <relocation>
      <groupId>org.apache</groupId>
      <artifactId>my-project</artifactId>
      <version>1.0</version>
      <message>We have moved the Project under Apache</message>
    </relocation>
    ...
  </distributionManagement>
  ...
</project>

profile
POM 4.0的一项新功能是项目可以根据其构建环境来更改设置。它将根据不同条件对pom组件进行扩展,如添加一些dependency,build,repositories, profile元件同时包含一个可选的活化(轮廓触发器)和设定变化的向POM制成如果所选择的文档已被激活。例如,为测试环境构建的项目可能指向与最终部署不同的数据库。或者可以根据使用的JDK版本从不同的存储库中提取依赖项。概要文件的元素如下:

<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">
  ...
  <profiles>
    <profile>
      <id>test</id>
      <activation>...</activation>
      <build>...</build>
      <modules>...</modules>
      <repositories>...</repositories>
      <pluginRepositories>...</pluginRepositories>
      <dependencies>...</dependencies>
      <reporting>...</reporting>
      <dependencyManagement>...</dependencyManagement>
      <distributionManagement>...</distributionManagement>
    </profile>
  </profiles>
</project>

activation
profile的activation是配置文件的关键。配置文件的强大之处在于它仅在某些情况下才可以修改基本POM。这些情况是通过activation元素指定的。
在Maven 3.2.2之前,激活已满足一个或多个指定条件。遇到第一个肯定结果时,处理将停止并将配置文件标记为活动状态。从Maven 3.2.2开始,在满足所有指定条件时发生激活。
此外activation元素不是profile激活a的唯一方法。该settings.xml文件的activeProfile元素可以包含个人资料的id。也可以在命令行后通过-P标记后的逗号分隔列表显式激活它们(例如-P codecoverage),
要查看将在特定版本中激活的配置文件,请使用 maven-help-plugin。

  • jdk:activation在jdk元素中具有以Java为中心的内置检查。如果测试在与给定前缀匹配的jdk版本号下运行,则将激活此功能。在上面的示例中,1.5.0_06将匹配。也支持范围。有关受支持范围的更多详细信息,请参见maven-enforcer-plugin。
  • os:os元素可以定义上面显示的某些操作系统特定的属性。有关OS值的更多详细信息,请参见maven-enforcer-plugins RequireOS规则
  • property:profile如果Maven检测到${name}相应name=value对的属性(可以在POM中通过取消引用的值),它将激活。
  • file:最后,给定的文件名可能会profile通过existence文件的或激活文件的missing。注意:此元素的插值限于${basedir},系统属性和请求属性。
<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">
  ...
  <profiles>
    <profile>
      <id>test</id>
      <activation>
        <activeByDefault>false</activeByDefault>
        <jdk>1.5</jdk>
        <os>
          <name>Windows XP</name>
          <family>Windows</family>
          <arch>x86</arch>
          <version>5.1.2600</version>
        </os>
        <property>
          <name>sparrow-type</name>
          <value>African</value>
        </property>
        <file>
          <exists>${basedir}/file2.properties</exists>
          <missing>${basedir}/file1.properties</missing>
        </file>
      </activation>
      ...
    </profile>
  </profiles>
</project>

Reporting
包含专门针对site生成阶段的元素。某些Maven插件可以生成在报表元素下定义和配置的报表,例如:生成Javadoc报表。就像构建元素配置插件的功能一样,报告命令也具有相同的功能。明显的区别在于,报表不是在执行块内对插件目标进行细粒度的控制,而是在reportSet元素内配置目标。和微妙的区别是,元素configuration下的插件reporting可以用作build插件configuration,尽管事实并非如此(build插件configuration不会影响reporting插件)。
可能是该reporting元素下唯一对理解该build元素的人不熟悉的项目是Boolean excludeDefaults元素。此元素表示网站生成器排除默认情况下通常生成的报告。通过site构建周期生成站点时,“ 项目信息”部分将放置在左侧菜单中,其中充满了各种报告,例如“ 项目团队”报告或“ 依赖项”列表报告。这些报告目标由生成maven-project-info-reports-plugin。作为任何其他插件,也可以通过以下更详细的方式将其删除,从而有效地关闭项目信息报告。

    <project>
      ...
      <reporting>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-project-info-reports-plugin</artifactId>
            <version>2.6</version>
            <reportSets>
              <reportSet>
                <reports><!-- select reports -->
                  <report>index</report>
                </reports>
              </reportSet>
            </reportSets>
          </plugin>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <version>2.9</version>
            <reportSets>
              <reportSet><!-- by default, id = "default" -->
                <reports><!-- select non-aggregate reports -->
                  <report>javadoc</report>
                  <report>test-javadoc</report>
                </reports>
              </reportSet>
              <reportSet><!-- aggregate reportSet, to define in poms having modules -->
                <id>aggregate</id>
                <inherited>false</inherited><!-- don't run aggregate in child modules -->
                <reports>
                  <report>aggregate</report>
                </reports>
              </reportSet>
            </reportSets>
          </plugin>
        </plugins>
      </reporting>
      ...
    </project>

Licenses
是定义如何使用和何时使用项目(或项目的一部分)的法律文件。请注意,项目应仅列出可直接应用于此项目的许可证,而不列出适用于此项目的依赖项的许可证。Maven目前除了在已生成的站点上显示它们之外,几乎不处理这些文档。但是,有一种说法是灵活使用不同类型的许可证,迫使用户接受某些类型(非开源)项目的许可证协议。
name,url和comments:自我解释,并且以前以其他身份遇到过。建议使用SPDX标识符作为许可证名称。第四个许可证元素是:
发行:描述如何合法地分发项目。声明的两种方法是repo(可以从Maven存储库下载)或手动(必须手动安装)

<licenses>
  <license>
    <name>Apache License, Version 2.0</name>
    <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
    <distribution>repo</distribution>
    <comments>A business-friendly OSS license</comments>
  </license>
</licenses>

Organization 大多数项目由某种组织(业务,私人团体等)运行。这是设置最基本信息的地方。

 <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">
      ...
      <organization>
        <name>Codehaus Mojo</name>
        <url>http://mojo.codehaus.org</url>
      </organization>
    </project>

Developers
所有项目都包含一个人有时创建的文件。像围绕项目的其他系统一样,与项目相关的人员也要参与项目。开发人员大概是项目核心开发的成员。请注意,尽管组织可能有许多开发人员(程序员)作为成员,但这并不是将所有人员都列为开发人员,而是仅列出直接对代码负责的人员的好形式。一个好的经验法则是,如果不应该就此项目与该人联系,则无需在此处列出他们。

  1. id,name,email:这些对应于开发人员的ID(大概是整个组织中的某些唯一ID),开发人员的姓名和电子邮件地址。
  2. organisation,organizationUrl:您可能已经猜到了,它们分别是开发人员的组织名称和URL。
  3. roles:A role应指定人员负责的标准动作。就像一个人可以戴很多帽子一样,一个人可以戴多个帽子roles。
  4. timezone:一个有效的时区ID等America/New_York或Europe/Berlin,或从UTC其中显影剂的生活,例如,数值以小时(和分数)偏移-5或+1。首选时区ID,因为它们不受DST和时区偏移的影响。有关官方时区数据库和Wikipedia中的列表,请参阅IANA。
  5. properties:此元素是有关此人的其他任何属性的去向。例如,指向个人图像或即时Messenger句柄的链接。不同的插件可以使用这些属性,或者它们可能仅适用于阅读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">
  ...
  <developers>
    <developer>
      <id>jdoe</id>
      <name>John Doe</name>
      <email>jdoe@example.com</email>
      <url>http://www.example.com/jdoe</url>
      <organization>ACME</organization>
      <organizationUrl>http://www.example.com</organizationUrl>
      <roles>
        <role>architect</role>
        <role>developer</role>
      </roles>
      <timezone>America/New_York</timezone>
      <properties>
        <picUrl>http://www.example.com/jdoe/pic</picUrl>
      </properties>
    </developer>
  </developers>
  ...
</project>

Contributors
贡献者就像开发人员一样,在项目的生命周期中扮演着辅助角色。也许贡献者发送了错误修复程序,或添加了一些重要的文档。一个健康的开源项目可能比开发人员拥有更多的贡献者。

<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">
  ...
  <contributors>
    <contributor>
      <name>Noelle</name>
      <email>some.name@gmail.com</email>
      <url>http://noellemarie.com</url>
      <organization>Noelle Marie</organization>
      <organizationUrl>http://noellemarie.com</organizationUrl>
      <roles>
        <role>tester</role>
      </roles>
      <timezone>America/Vancouver</timezone>
      <properties>
        <gtalk>some.name@gmail.com</gtalk>
      </properties>
    </contributor>
  </contributors>
  ...
</project>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 IntelliJ IDEA 中查看 Maven 项目的依赖树结构,可以使用 Maven 插件来实现。以下是一种常见的方法: 1. 打开 Maven 项目:在 IntelliJ IDEA 中,打开包含 pom.xml 文件的 Maven 项目。 2. 打开 Maven 工具窗口:点击底部的 "Maven" 工具窗口按钮,或者选择 "View" -> "Tool Windows" -> "Maven" 菜单来打开 Maven 工具窗口。 3. 选择要分析的项目:在 Maven 工具窗口中,展开你的项目,然后找到 "Lifecycle" 节点。右键单击 "Lifecycle" 节点,并选择 "dependency:tree"。 4. 运行命令并查看结果:在弹出的对话框中,输入 "dependency:tree",然后点击运行按钮。Maven 将执行命令并生成依赖树结果。 5. 查看冲突信息:在运行命令后,Maven 将在控制台窗口中显示依赖树结果。你可以通过滚动和查找的方式来查看依赖树结构,并寻找标志为 "[WARNING]" 或 "[ERROR]" 的行,这些行通常表示存在冲突。 6. 定位冲突位置:依赖树中的冲突信息通常会显示冲突的依赖项和引发冲突的原因。通过查找冲突的依赖项,你可以定位到冲突发生的位置,并进一步分析和解决冲突。 需要注意的是,依赖树可能会比较庞大,特别是在复杂的项目中。你可以使用 Ctrl+F 或 Command+F 来搜索特定的依赖项,以快速定位到你感兴趣的部分。 另外,也可以使用其他的 Maven 可视化工具(例如 Maven Dependency Plugin 的图形化界面)来更直观地查看依赖树。这些工具可以生成图形化的依赖关系图,并更清晰地显示冲突和依赖关系。 希望这些步骤能帮助你在 IntelliJ IDEA 中查看和分析 Maven 项目的依赖树结构,并找到冲突的位置和原因。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值