本文参考于:https://blog.csdn.net/qq_47759220/article/details/119079757

一、maven项目的目录结构

pom文件定于了一个maven项目的maven配置,一般pom文件的放在项目或者模块的根目录下。

maven的遵循约定大于配置,约定了如下的目录结构:

二、pom文件详解

1、根元素和必要配置

<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.0http://maven.apache.org/xsd/maven-4.0.0.xsd"><!-- 模型版本 --><modelVersion>4.0.0</modelVersion><!-- 公司或者组织的唯一标志,也是打包成jar包路径的依据 --><!-- 例如com.companyname.project-group,maven打包jar包的路径:/com/companyname/project-group --><groupId>com.companyname.project-group</groupId><!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 --><artifactId>project</artifactId><!-- 项目当前版本,格式为:主版本.次版本.增量版本-限定版本号 --><version>1.0</version><!--项目产生的构件类型,包括jar、war、ear、pom等 --><packaging>jar</packaging>
</project>
  • project:整个pom配置文件的根元素,所有的配置都是写在project元素里面的;
  • modelVersion:指定了当前POM模型的版本,对于Maven2及Maven 3来说,它只能是4.0.0;
  • groupId:组织名,通常为公司域名的倒叙
  • artifactId:这是项目的标识,通常是工程的名称,它在一个项目组(group)下是唯一的。
  • version:这是项目的版本号,用来区分同一个artifact的不同版本。
  • packaging:这是项目产生的构件类型,即项目通过maven打包的输出文件的后缀名,包括jar、war、ear、pom等。

2、父项目和parent元素

    <!--父项目的坐标,坐标包括group ID,artifact ID和version。 --><!--如果项目中没有规定某个元素的值,那么父项目中的对应值即为项目的默认值 --><parent><!--被继承的父项目的构件标识符 --><artifactId>com.companyname.project-group</artifactId><!--被继承的父项目的全球唯一标识符 --><groupId>base-project</groupId><!--被继承的父项目的版本 --><version>1.0.1-RELEASE</version><!-- 父项目的pom.xml文件的相对路径,默认值是../pom.xml。 --><!-- 寻找父项目的pom:构建当前项目的地方--)relativePath指定的位置--)本地仓库--)远程仓库 --><relativePath>../pom.xml</relativePath></parent>

parent元素可以指定父pom。用户可以通过增加parent元素来自定义一个父pom,从而继承该pom的配置。parent元素中包含一些子元素,用来定位父项目和父项目的pom文件位置。

3、项目构建需要的信息

和项目构建相关的配置放在 build 标签下

1)路径管理

       <!--------------------- 路径管理(在遵循约定大于配置原则下,不需要配置) ---------------------><!--项目源码目录,当构建项目的时候,构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径。 --><sourceDirectory /><!--该元素设置了项目单元测试使用的源码目录。该路径是相对于pom.xml的相对路径 --><testSourceDirectory /><!--被编译过的应用程序class文件存放的目录。 --><outputDirectory /><!--被编译过的测试class文件存放的目录。 --><testOutputDirectory />        <!--项目脚本源码目录,该目录下的内容,会直接被拷贝到输出目录,因为脚本是被解释的,而不是被编译的 --><scriptSourceDirectory />

2)资源管理

        <!--------------------- 资源管理 ---------------------><!--这个元素描述了项目相关的所有资源路径列表,例如和项目相关的属性文件,这些资源被包含在最终的打包文件里。 --><resources><!--这个元素描述了项目相关或测试相关的所有资源路径 --><resource><!-- 描述了资源的目标输出路径。该路径是相对于target/classes的路径 --><!-- 如果是想要把资源直接放在target/classes下,不需要配置该元素 --><targetPath /><!--是否使用参数值代替参数名。参数值取自文件里配置的属性,文件在filters元素里列出 --><filtering /><!--描述打包前的资源存放的目录,该路径相对POM路径 --><directory /><!--包含的模式列表,例如**/*.xml,只有符合条件的资源文件才会在打包的时候被放入到输出路径中 --><includes /><!--排除的模式列表,例如**/*.xml,符合的资源文件不会在打包的时候会被过滤掉 --><excludes /></resource></resources><!--这个元素描述了单元测试相关的所有资源路径,例如和单元测试相关的属性文件。 --><testResources><!--这个元素描述了测试相关的所有资源路径,子元素说明参考build/resources/resource元素的说明 --><testResource><targetPath /><filtering /><directory /><includes /><excludes /></testResource></testResources>

3)插件管理

插件管理相关的元素有两个,包括pluginManagement和plugins。pluginManagement中有子元素plugins,它和project下的直接子元素plugins的区别是,pluginManagement主要是用来声明子项目可以引用的默认插件信息,这些插件如果只写在pluginManagement中是不会被引入的。project下的直接子元素plugins中定义的才是这个项目中真正需要被引入的插件。

        <!--------------------- 插件管理 ---------------------><!-- 子项目可以引用的默认插件信息。pluginManagement中的插件直到被引用时才会被解析或绑定到生命周期 --><!-- 这里只是做了声明,并没有真正的引入。给定插件的任何本地配置都会覆盖这里的配置--><pluginManagement><!-- 可使用的插件列表 --><plugins><!--plugin元素包含描述插件所需要的信息。 --><plugin><!--插件定位坐标三元素:groupId + artifactId + version --><groupId /><artifactId /><version /><!-- 是否使用这个插件的Maven扩展(extensions),默认为false --><!-- 由于性能原因,只有在真需要下载时,该元素才被设置成enabled --><extensions /><!--在构建生命周期中执行一组目标的配置。每个目标可能有不同的配置。 --><executions><!--execution元素包含了插件执行需要的信息 --><execution><!--执行目标的标识符,用于标识构建过程中的目标,或者匹配继承过程中需要合并的执行目标 --><id /><!--绑定了目标的构建生命周期阶段,如果省略,目标会被绑定到源数据里配置的默认阶段 --><phase /><!--配置的执行目标 --><goals /><!--配置是否被传播到子POM --><inherited /><!--作为DOM对象的配置 --><configuration /></execution></executions><!--项目引入插件所需要的额外依赖,参见dependencies元素 --><dependencies>......</dependencies><!--任何配置是否被传播到子项目 --><inherited /><!--作为DOM对象的配置 --><configuration /></plugin></plugins></pluginManagement><!--使用的插件列表,这里是真正的引入插件。参见build/pluginManagement/plugins元素 --><plugins>......</plugins>

4)构建扩展

5)其他配置

build中还有一些配置,如下:

        <!--------------------- 其他配置 ---------------------><!--当项目没有规定目标(Maven2 叫做阶段)时的默认值 --><defaultGoal /><!--构建产生的所有文件存放的目录 --><directory /><!--产生的构件的文件名,默认值是${artifactId}-${version}。 --><finalName /><!--当filtering开关打开时,使用到的过滤器属性文件列表 --><filters />

4、项目依赖相关信息

pom文件中通过dependencyManagement来声明依赖,通过dependencies元素来管理依赖。

 <!-- 继承自该项目的所有子项目的默认依赖信息 --><!-- 当子项目声明一个依赖,如果group ID和artifact ID以外的一些信息没有描述,则使用这里的依赖信息 --><dependencyManagement><dependencies><!--参见dependencies/dependency元素 --><dependency>......</dependency></dependencies></dependencyManagement><!--该元素描述了项目相关的所有依赖。 这些依赖自动从项目定义的仓库中下载 --><dependencies><dependency><!------------------- 依赖坐标 -------------------><!--依赖项目的坐标三元素:groupId + artifactId + version --><groupId>org.apache.maven</groupId><artifactId>maven-artifact</artifactId><version>3.8.1</version><!------------------- 依赖类型 -------------------><!-- 依赖类型,默认是jar。通常表示依赖文件的扩展名,但有例外。一个类型可以被映射成另外一个扩展名或分类器 --><!-- 类型经常和使用的打包方式对应,尽管这也有例外,一些类型的例子:jar,war,ejb-client和test-jar --><!-- 如果设置extensions为true,就可以在plugin里定义新的类型 --><type>jar</type><!-- 依赖的分类器。分类器可以区分属于同一个POM,但不同构建方式的构件。分类器名被附加到文件名的版本号后面 --><!-- 如果想将项目构建成两个单独的JAR,分别使用Java 4和6编译器,就可以使用分类器来生成两个单独的JAR构件 --><classifier></classifier><!------------------- 依赖传递 -------------------><!--依赖排除,即告诉maven只依赖指定的项目,不依赖该项目的这些依赖。此元素主要用于解决版本冲突问题 --><exclusions><exclusion><artifactId>spring-core</artifactId><groupId>org.springframework</groupId></exclusion></exclusions><!-- 可选依赖,用于阻断依赖的传递性。如果在项目B中把C依赖声明为可选,那么依赖B的项目中无法使用C依赖 --><optional>true</optional><!------------------- 依赖范围 -------------------><!--依赖范围。在项目发布过程中,帮助决定哪些构件被包括进来- compile:默认范围,用于编译;  - runtime: 在执行时需要使用;     - test: 用于test任务时使用;     - optional: 当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用- provided:类似于编译,但支持jdk或者容器提供,类似于classpath- systemPath: 仅用于范围为system。提供相应的路径- system: 需要外在提供相应的元素。通过systemPath来取得  --><scope>test</scope><!-- 该元素为依赖规定了文件系统上的路径。仅供scope设置system时使用。但是不推荐使用这个元素 --><!-- 不推荐使用绝对路径,如果必须要用,推荐使用属性匹配绝对路径,例如${java.home} --><systemPath></systemPath></dependency></dependencies>

5、生成文档相关元素

备注:maven可以通过mvn site命令生成项目的相关文档。

    <!--项目的名称, Maven生成文档使用 --><name>project-maven</name><!--项目主页的URL, Maven生成文档使用 --><url>http://123.a.b/nsnxs</url><!-- 项目的详细描述, Maven生成文档使用。当这个元素能够用HTML格式描述时,不鼓励使用纯文本描述 --><!--如果你需要修改生成的web站点的索引页面,你应该修改你自己的索引页文件,而不是调整这里的文档 --><description>Description of this maven project</description>

6、远程仓库列表

远程仓库列表的配置,包括依赖和扩展的远程仓库配置,以及插件的远程仓库配置。在本地仓库找不到的情况下,maven下载依赖、扩展和插件,就是从这里配置的远程仓库中进行下载。

需要注意的是release和snapshot两者的区别。

  • release是稳定版本,一经发布不再修改,想发布修改后的项目,只能升级项目版本再进行发布
  • snapshot是不稳定的,一个snapshot的版本可以不断改变。项目在开发期间一般会使用snapshot,更方便进行频繁的代码更新
    <!--依赖和扩展的远程仓库列表。 --><repositories><repository><releases><!--值为true或者false,开启/不开启下载 --><enabled /><!--该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳 --><!--选项:always,daily(默认),interval:X(X单位为分钟),或者never。 --><updatePolicy /><!--当Maven验证构件校验文件失败时该怎么做。选项:ignore,fail,或者warn --><checksumPolicy /></releases><!-- 有了releases和snapshots这两组配置,就可以在每个单独的仓库中,为每种类型的构件采取不同的策略 --><snapshots><enabled /><updatePolicy /><checksumPolicy /></snapshots><!--远程仓库唯一标识符。可以用来匹配在settings.xml文件里配置的远程仓库 --><id>nanxs-repository-proxy</id><!--远程仓库名称 --><name>nanxs-repository-proxy</name><!--远程仓库URL,按protocol://hostname/path形式 --><url>http://192.168.1.169:9999/repository/</url><!-- 用于定位和排序构件的仓库布局类型。可以是default或者legacy --><layout>default</layout></repository></repositories><!--发现插件的远程仓库列表 --><pluginRepositories><!--包含需要连接到远程插件仓库的信息。参见repositories/repository元素 --><pluginRepository>......</pluginRepository></pluginRepositories>

7、项目部署相关

用于把网站部署到远程服务器或者把构件部署到远程仓库

    <!--项目分发信息,在执行mvn deploy后表示要发布的位置。用于把网站部署到远程服务器或者把构件部署到远程仓库 --><distributionManagement><!--部署项目产生的构件发到远程仓库需要的信息 --><repository><uniqueVersion /><id>nanxs-maven2</id><name>nanxsmaven2</name><url>file://${basedir}/target/deploy</url><layout /></repository><!--构件的快照部署的仓库。默认部署到distributionManagement/repository元素配置的仓库 --><snapshotRepository><uniqueVersion /><id>nanxs-maven2</id><name>Nanxs-maven2 Snapshot Repository</name><url>scp://svn.baidu.com/nanxs:/usr/local/maven-snapshot</url><layout /></snapshotRepository><!--部署项目的网站需要的信息 --><site><!--部署位置的唯一标识符,用来匹配站点和settings.xml文件里的配置 --><id>nanxs-site</id><!--部署位置的名称 --><name>business api website</name><!--部署位置的URL,按protocol://hostname/path形式 --><url>scp://svn.baidu.com/nanxs:/var/www/localhost/nanxs-web</url></site><!--项目下载页面的URL。如果没有该元素,用户应该参考主页 --><!--本元素是为了帮助定位那些不在仓库里的构件(license限制) --><downloadUrl /><!--如果构件有了新的group ID和artifact ID(构件移到了新的位置),这里列出构件的重定位信息 --><relocation><!--构件新的group ID --><groupId /><!--构件新的artifact ID --><artifactId /><!--构件新的版本号 --><version /><!--显示给用户的,关于移动的额外信息,例如原因 --><message /></relocation><!-- 给出该构件在远程仓库的状态。本地项目中不能设置该元素,因为这是工具自动更新的 --><!-- 有效的值有:none(默认),converted(仓库管理员从 Maven 1 POM转换过来),partner(直接从伙伴Maven 2仓库同步过来),deployed(从Maven 2实例部署),verified(被核实时正确的和最终的) --><status /></distributionManagement>

8、报表规范

9、profile配置

    <!--项目构建profile,如果被激活,会修改构建处理 --><profiles><!--根据环境参数或命令行参数激活某个构建处理 --><profile><!--构建配置的唯一标识符。即用于命令行激活,也用于在继承时合并具有相同标识符的profile。 --><id /><!--自动触发profile的条件逻辑。Activation是profile的开启钥匙,profile的力量来自于它 --><!-- 能够在某些特定的环境中自动使用某些特定的值;这些环境通过activation元素指定。activation元素并不是激活profile的唯一方式 --><activation><!--profile默认是否激活的标志 --><activeByDefault /><!--当匹配的jdk被检测到,profile被激活。例如,1.4激活JDK1.4,1.4.0_2,而!1.4激活所有版本不是以1.4开头的JDK --><jdk /><!--当匹配的操作系统属性被检测到,profile被激活。os元素可以定义一些操作系统相关的属性。 --><os><!--激活profile的操作系统的名字 --><name>Windows XP</name><!--激活profile的操作系统所属家族(如 'windows') --><family>Windows</family><!--激活profile的操作系统体系结构 --><arch>x86</arch><!--激活profile的操作系统版本 --><version>5.1.2600</version></os><!--如果Maven检测到某一个属性(其值可以在POM中通过${名称}引用),其拥有对应的名称和值,Profile就会被激活 --><!--如果值字段是空的,那么存在属性名称字段就会激活profile,否则按区分大小写方式匹配属性值字段 --><property><!--激活profile的属性的名称 --><name>mavenVersion</name><!--激活profile的属性的值 --><value>2.0.3</value></property><!--提供一个文件名,通过检测该文件的存在或不存在来激活profile。missing检查文件是否存在,如果不存在则激活profile --><!--另一方面,exists则会检查文件是否存在,如果存在则激活profile --><file><!--如果指定的文件存在,则激活profile。 --><exists>/usr/local/abcd/abcd-home/jobs/maven-guide-zh-to-production/workspace/</exists><!--如果指定的文件不存在,则激活profile。 --><missing>/usr/local/abcd/abcd-home/jobs/maven-guide-zh-to-production/workspace/</missing></file></activation><!--构建项目所需要的信息。参见build元素 --><build /><!--发现依赖和扩展的远程仓库列表。详情参见repositories元素 --><repositories /><!--发现插件的远程仓库列表,这些插件用于构建和报表。详情参见pluginRepositories元素 --><pluginRepositories /><!--该元素描述了项目相关的所有依赖。 详细配置参见dependencies --><dependencies /><!--该元素包括使用报表插件产生报表的规范。当用户执行"mvn site",这些报表就会运行。在页面导航栏能看到所有报表的链接。参见reporting元素 --><reporting /><!--参见dependencyManagement元素 --><dependencyManagement /><!--参见distributionManagement元素 --><distributionManagement /><!--不赞成使用. 现在Maven忽略该元素. --><reports /><!--模块(有时称作子项目) 被构建成项目的一部分。列出的每个模块元素是指向该模块的目录的相对路径 --><modules /><!--参见properties元素 --><properties /></profile></profiles>

Maven的pom文件相关推荐

  1. JavaFX maven工程pom文件完整内容

    JavaFX maven工程pom文件完整内容:打包fxml.css等静态资源文件 <project xmlns="http://maven.apache.org/POM/4.0.0& ...

  2. eclipse中maven项目pom文件第一行报错解决方法

    eclipse中maven项目pom文件第一行报错解决方法 参考文章: (1)eclipse中maven项目pom文件第一行报错解决方法 (2)https://www.cnblogs.com/wxym ...

  3. Maven中pom文件详解

    在IDE中使用Maven IDE工具 MyEclipse 集成maven插件 Eclipse ​ Eclipse For Java EE IDEA 集成Maven插件 在IDE中 配置Maven 指定 ...

  4. maven:pom文件详细信息

    一.maven项目的目录结构 ​ pom文件定于了一个maven项目的maven配置,一般pom文件的放在项目或者模块的根目录下. ​ maven的遵循约定大于配置,约定了如下的目录结构: 目录 目的 ...

  5. idea使用Maven工具pom文件报红解决方案

    #idea使用Maven工具pom文件报红解决方案 很多初次使用maven的小伙伴都会碰到pom文件报红的现象,你是不是对此很苦恼,试了很多方案都无法解决,此次为大家提供一个比较完整的解决步骤,让你更 ...

  6. maven本地pom文件安装到本地仓库中

    将Jar安装到本地仓库中方法 https://www.cnblogs.com/sunjie-one/p/11718952.html maven本地pom文件安装到本地仓库中 1 mvn install ...

  7. Maven的POM文件parent节点不可以使用properties里面的变量

    Maven的POM文件parent节点不可以使用properties里面的变量 但是如果在子项目上的parent节点是可以使用父项目里定义的properties变量 如果一开始为单项目,或者最顶层项目 ...

  8. Maven的pom文件那些事

    pom.xml文件 <groupId>org.son.nexus</groupId>//项目隶属的实际项目名 <artifactId>nexus-indexer&l ...

  9. maven中pom文件解析

    pom文件是maven中最重要的文件,以上命令的也需要根据pom文件进行运行.一般在构建完maven项目后需要修改pom文件添加诸如依赖关系,打包机制及一些项目的详细信息.一般的pom包含如下一些基本 ...

  10. Maven的Pom文件 ( Eclipse中创建Maven工程, 使用注意点,DevOps相关)

    ■POM Eclipse 使用注意点 修改POM之后 step1:右键点击工程,Maven,プロジェクトの更新 (project 更新) step2:点击 [プロジェクト](project )⇒[すべ ...

最新文章

  1. 多态---父指针指向子类对象(父类引用指向子类对象)
  2. Oracle查询某一天日期数据的SQL语句的几种写法
  3. VS2015和QTcreator冲突解决办法
  4. java开发一款坦克大战游戏
  5. LeetCode 1662. 检查两个字符串数组是否相等
  6. 2D转换之旋转rotate(CSS3)
  7. git pull 提示 There is no tracking information for the current branch
  8. 基于网络安全相关的开源项目技术预研分析报告
  9. 修订的GRE分类词汇(截屏版)
  10. 局域网下两台电脑ping不通的问题
  11. background简写方式
  12. android 8 平板,击败Android平板:Windows 8志在必得
  13. 亚洲一些物流软件航空争抢货机投放
  14. SAP中利用SE16N事务的小计功能实现输出清单的加工实例
  15. mysql查看数据库的容量及表容量
  16. python三角形代码初中_python三角形
  17. Metal 框架之渲染到多个视口
  18. 【厚积薄发系列】C++项目总结19—组件化架构思想
  19. 网盘直链工具 winform版 V1.0
  20. 解决360断网急诊强力修复后无法上网的问题

热门文章

  1. 电视剧《人世间》观后感
  2. 2021筠连中学高考成绩查询,四川省筠连县中学2021年排名
  3. 【leetcode】第394题:字符串解码(华为笔试题)
  4. quartz时间配置
  5. 安心邮服务器修改密码步骤,邮件系统密码修改操作说明
  6. 如何获取apk的签名信息?
  7. 丹麦之旅:丹麦访友签
  8. SN75HVD10 热插拔失败调试记录
  9. cloudsim4.0中CloudSimExample1分析
  10. ubuntu18.04.3安装和卸载Adobe Reader 9