Maven之pom.xml详解

2024-03-21 6051阅读

Maven之pom.xml详解

一、pom.xml 简介

什么是 pom

POM 是 Project Object Model 的缩写,即项目对象模型。

Maven之pom.xml详解 第1张
()

pom.xml 就是 maven 的配置文件,用以描述项目的各种信息。

pom 配置一览:

Maven之pom.xml详解 第2张
()
  4.0.0
  
  ...
  ...
  ...
  ...
  ...
  ...
  ...
  ...
  ...
  
  ...
  ...
  
  ...
  ...
  ...
  ...
  ...
  ...
  ...
  ...
  
  ...
  ...
  ...
  ...
  
...
  ...
  ...
  ...
  ...

二、基本配置

  • project - project 是 pom.xml 中描述符的根。
  • modelVersion - modelVersion 指定 pom.xml 符合哪个版本的描述符。maven 2 和 3 只能为 4.0.0。

    一般 jar 包被识别为: groupId:artifactId:version 的形式。

    maven 坐标

    在 maven 中,根据 groupId、artifactId、version 组合成 groupId:artifactId:version 来唯一识别一个 jar 包。

    • groupId - 团体、组织的标识符。团体标识的约定是,它以创建这个项目的组织名称的逆向域名(reverse domain name)开头。一般对应着 java 的包结构。

    • artifactId - 单独项目的唯一标识符。比如我们的 tomcat、commons 等。不要在 artifactId 中包含点号(.)。

    • version - 一个项目的特定版本。

      • maven 有自己的版本规范,一般是如下定义 major version、minor version、incremental version-qualifier ,比如 1.2.3-beta-01。要说明的是,maven 自己判断版本的算法是 major、minor、incremental 部分用数字比较,qualifier 部分用字符串比较,所以要小心 alpha-2 和 alpha-15 的比较关系,最好用 alpha-02 的格式。
      • maven 在版本管理时候可以使用几个特殊的字符串 SNAPSHOT、LATEST、RELEASE。比如 1.0-SNAPSHOT。各个部分的含义和处理逻辑如下说明:
          • SNAPSHOT - 这个版本一般用于开发过程中,表示不稳定的版本。
          • LATEST - 指某个特定构件的最新发布,这个发布可能是一个发布版,也可能是一个 snapshot 版,具体看哪个时间最后。
          • RELEASE :指最后一个发布版。
          • packaging - 项目的类型,描述了项目打包后的输出,默认是 jar。常见的输出类型为:pom, jar, maven-plugin, ejb, war, ear, rar, par。

            三、依赖配置

            dependencies:

              ...
              
                
                 org.apache.maven
                  maven-embedder
                  2.0
                  jar
                  test
                  true
                  
                    
                      org.apache.maven
                      maven-core
                    
                  
                
                ...
              
              ...
            
            
            • groupId, artifactId, version - 和基本配置中的 groupId、artifactId、version 意义相同。

            • type - 对应 packaging 的类型,如果不使用 type 标签,maven 默认为 jar。

            • scope - 此元素指的是任务的类路径(编译和运行时,测试等)以及如何限制依赖关系的传递性。有 5 种可用的限定范围:

              • compile - 如果没有指定 scope 标签,maven 默认为这个范围。编译依赖关系在所有 classpath 中都可用。此外,这些依赖关系被传播到依赖项目。
              • provided - 与 compile 类似,但是表示您希望 jdk 或容器在运行时提供它。它只适用于编译和测试 classpath,不可传递。
              • runtime - 此范围表示编译不需要依赖关系,而是用于执行。它是在运行时和测试 classpath,但不是编译 classpath。
              • test - 此范围表示正常使用应用程序不需要依赖关系,仅适用于测试编译和执行阶段。它不是传递的。
              • system - 此范围与 provided 类似,除了您必须提供明确包含它的 jar。该 artifact 始终可用,并且不是在仓库中查找。
              • systemPath - 仅当依赖范围是系统时才使用。否则,如果设置此元素,构建将失败。该路径必须是绝对路径,因此建议使用 propertie 来指定特定的路径,如$ {java.home} / lib。由于假定先前安装了系统范围依赖关系,maven 将不会检查项目的仓库,而是检查库文件是否存在。如果没有,maven 将会失败,并建议您手动下载安装。

              • optional - optional 让其他项目知道,当您使用此项目时,您不需要这种依赖性才能正常工作。

              • exclusions - 包含一个或多个排除元素,每个排除元素都包含一个表示要排除的依赖关系的 groupId 和 artifactId。与可选项不同,可能或可能不会安装和使用,排除主动从依赖关系树中删除自己。

                parent:

                maven 支持继承功能。子 POM 可以使用 parent 指定父 POM ,然后继承其配置。

                  4.0.0
                  
                    org.codehaus.mojo
                    my-parent
                    2.0
                    ../my-parent
                  
                  my-project
                
                
                • relativePath - 注意 relativePath 元素。在搜索本地和远程存储库之前,它不是必需的,但可以用作 maven 的指示符,以首先搜索给定该项目父级的路径。

                  dependencyManagement

                  dependencyManagement 是表示依赖 jar 包的声明。即你在项目中的 dependencyManagement 下声明了依赖,maven 不会加载该依赖,dependencyManagement 声明可以被子 POM 继承。

                  dependencyManagement 的一个使用案例是当有父子项目的时候,父项目中可以利用 dependencyManagement 声明子项目中需要用到的依赖 jar 包,之后,当某个或者某几个子项目需要加载该依赖的时候,就可以在子项目中 dependencies 节点只配置 groupId 和 artifactId 就可以完成依赖的引用。

                  dependencyManagement 主要是为了统一管理依赖包的版本,确保所有子项目使用的版本一致,类似的还有plugins和pluginManagement。

                  modules

                  子模块列表。

                    4.0.0
                    org.codehaus.mojo
                    my-parent
                    2.0
                    pom
                    
                      my-project
                      another-project
                      third-project/pom-example.xml
                    
                  
                  

                  properties

                  属性列表。定义的属性可以在 pom.xml 文件中任意处使用。使用方式为 ${propertie} 。

                    ...
                    
                      1.7
                      1.7
                      UTF-8
                      UTF-8
                    
                    ...
                  
                  

                  四、构建配置

                  build

                  build 可以分为 “project build” 和 “profile build”。

                    ...
                    
                    ...
                    
                      
                        
                        ...
                      
                    
                  
                  

                  基本构建配置:

                    install
                    ${basedir}/target
                    ${artifactId}-${version}
                    
                      filters/filter1.properties
                    
                    ...
                  
                  

                  defaultGoal : 默认执行目标或阶段。如果给出了一个目标,它应该被定义为它在命令行中(如 jar:jar)。如果定义了一个阶段(如安装),也是如此。

                  directory :构建时的输出路径。默认为:${basedir}/target 。

                  finalName :这是项目的最终构建名称(不包括文件扩展名,例如:my-project-1.0.jar)

                  filter :定义 * .properties 文件,其中包含适用于接受其设置的资源的属性列表(如下所述)。换句话说,过滤器文件中定义的“name = value”对在代码中替换$ {name}字符串。

                  resources

                  资源的配置。资源文件通常不是代码,不需要编译,而是在项目需要捆绑使用的内容。

                    
                      ...
                      
                        
                          META-INF/plexus
                          false
                          ${basedir}/src/main/plexus
                          
                            configuration.xml
                          
                          
                            **/*.properties
                          
                        
                      
                      
                        ...
                      
                      ...
                    
                  
                  

                  resources: 资源元素的列表,每个资源元素描述与此项目关联的文件和何处包含文件。

                  targetPath: 指定从构建中放置资源集的目录结构。目标路径默认为基本目录。将要包装在 jar 中的资源的通常指定的目标路径是 META-INF。

                  filtering: 值为 true 或 false。表示是否要为此资源启用过滤。请注意,该过滤器 * .properties 文件不必定义为进行过滤 - 资源还可以使用默认情况下在 POM 中定义的属性(例如$ {project.version}),并将其传递到命令行中“-D”标志(例如,“-Dname = value”)或由 properties 元素显式定义。过滤文件覆盖上面。

                  directory: 值定义了资源的路径。构建的默认目录是[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vc25Mils-1684164371011)(https://g.yuque.com/gr/latex?%7Bbasedir%7D%2Fsrc%2Fmain%2Fresources%E3%80%82%0Aincludes%3A%20%E4%B8%80%E7%BB%84%E6%96%87%E4%BB%B6%E5%8C%B9%E9%85%8D%E6%A8%A1%E5%BC%8F%EF%BC%8C%E6%8C%87%E5%AE%9A%E7%9B%AE%E5%BD%95%E4%B8%AD%E8%A6%81%E5%8C%85%E6%8B%AC%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%8C%E4%BD%BF%E7%94%A8*%E4%BD%9C%E4%B8%BA%E9%80%9A%E9%85%8D%E7%AC%A6%E3%80%82%0Aexcludes%3A%20%E4%B8%8E%20includes%20%E7%B1%BB%E4%BC%BC%EF%BC%8C%E6%8C%87%E5%AE%9A%E7%9B%AE%E5%BD%95%E4%B8%AD%E8%A6%81%E6%8E%92%E9%99%A4%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%8C%E4%BD%BF%E7%94%A8*%E4%BD%9C%E4%B8%BA%E9%80%9A%E9%85%8D%E7%AC%A6%E3%80%82%E6%B3%A8%E6%84%8F%EF%BC%9A%E5%A6%82%E6%9E%9C%20include%20%E5%92%8C%20exclude%20%E5%8F%91%E7%94%9F%E5%86%B2%E7%AA%81%EF%BC%8Cmaven%20%E4%BC%9A%E4%BB%A5%20exclude%20%E4%BD%9C%E4%B8%BA%E6%9C%89%E6%95%88%E9%A1%B9%E3%80%82%0AtestResources%3A%20testResources%20%E4%B8%8E%20resources%20%E5%8A%9F%E8%83%BD%E7%B1%BB%E4%BC%BC%EF%BC%8C%E5%8C%BA%E5%88%AB%E4%BB%85%E5%9C%A8%E4%BA%8E%EF%BC%9AtestResources%20%E6%8C%87%E5%AE%9A%E7%9A%84%E8%B5%84%E6%BA%90%E4%BB%85%E7%94%A8%E4%BA%8E%20test%20%E9%98%B6%E6%AE%B5%EF%BC%8C%E5%B9%B6%E4%B8%94%E5%85%B6%E9%BB%98%E8%AE%A4%E8%B5%84%E6%BA%90%E7%9B%AE%E5%BD%95%E4%B8%BA%EF%BC%9A)]{basedir}/src/test/resources 。

                  plugins

                    
                      ...
                      
                        
                          org.apache.maven.plugins
                          maven-jar-plugin
                          2.6
                          false
                          true
                          
                            test
                          
                          ...
                          ...
                        
                      
                    
                  
                  
                  • groupId, artifactId, version :和基本配置中的 groupId、artifactId、version 意义相同。
                  • extensions :值为 true 或 false。是否加载此插件的扩展名。默认为 false。
                  • inherited :值为 true 或 false。这个插件配置是否应该适用于继承自这个插件的 POM。默认值为 true。
                  • configuration - 这是针对个人插件的配置,这里不扩散讲解。
                  • dependencies :这里的 dependencies 是插件本身所需要的依赖。
                  • executions :需要记住的是,插件可能有多个目标。每个目标可能有一个单独的配置,甚至可能将插件的目标完全绑定到不同的阶段。执行配置插件的目标的执行。
                    • id: 执行目标的标识。
                    • goals: 像所有多元化的 POM 元素一样,它包含单个元素的列表。在这种情况下,这个执行块指定的插件目标列表。
                    • phase: 这是执行目标列表的阶段。这是一个非常强大的选项,允许将任何目标绑定到构建生命周期中的任何阶段,从而改变 maven 的默认行为。
                    • inherited: 像上面的继承元素一样,设置这个 false 会阻止 maven 将这个执行传递给它的子代。此元素仅对父 POM 有意义。
                    • configuration: 与上述相同,但将配置限制在此特定目标列表中,而不是插件下的所有目标。
                        ...
                        
                          
                            
                              maven-antrun-plugin
                              1.1
                              
                                
                                  echodir
                                  
                                    run
                                  
                                  verify
                                  false
                                  
                                    
                                      Build Dir: ${project.build.directory}
                                    
                                  
                                
                              
                            
                          
                        
                      
                      

                      pluginManagement

                      与 dependencyManagement 很相似,在当前 POM 中仅声明插件,而不是实际引入插件。子 POM 中只配置 groupId 和 artifactId 就可以完成插件的引用,且子 POM 有权重写 pluginManagement 定义。

                      它的目的在于统一所有子 POM 的插件版本。

                      directories

                        ...
                        
                          ${basedir}/src/main/java
                          ${basedir}/src/main/scripts
                          ${basedir}/src/test/java
                          ${basedir}/target/classes
                          ${basedir}/target/test-classes
                          ...
                        
                      
                      

                      目录元素集合存在于 build 元素中,它为整个 POM 设置了各种目录结构。由于它们在配置文件构建中不存在,所以这些不能由配置文件更改。

                      如果上述目录元素的值设置为绝对路径(扩展属性时),则使用该目录。否则,它是相对于基础构建目录:${basedir}。

                      extensions

                      扩展是在此构建中使用的 artifacts 的列表。它们将被包含在运行构建的 classpath 中。它们可以启用对构建过程的扩展(例如为 Wagon 传输机制添加一个 ftp 提供程序),并使活动的插件能够对构建生命周期进行更改。简而言之,扩展是在构建期间激活的 artifacts。扩展不需要实际执行任何操作,也不包含 Mojo。因此,扩展对于指定普通插件接口的多个实现中的一个是非常好的。

                        ...
                        
                          ...
                          
                            
                              org.apache.maven.wagon
                              wagon-ftp
                              1.0-alpha-3
                            
                          
                          ...
                        
                      
                      

                      reporting

                      报告包含特定针对 site 生成阶段的元素。某些 maven 插件可以生成 reporting 元素下配置的报告,例如:生成 javadoc 报告。reporting 与 build 元素配置插件的能力相似。明显的区别在于:在执行块中插件目标的控制不是细粒度的,报表通过配置 reportSet 元素来精细控制。而微妙的区别在于 reporting 元素下的 configuration 元素可以用作 build 下的 configuration ,尽管相反的情况并非如此( build 下的 configuration 不影响 reporting 元素下的 configuration )。

                      另一个区别就是 plugin 下的 outputDirectory 元素。在报告的情况下,默认输出目录为 ${basedir}/target/site。

                        ...
                        
                          
                            
                              ...
                              
                                
                                  sunlink
                                  
                                    javadoc
                                  
                                  true
                                  
                                    
                                      http://java.sun.com/j2se/1.5.0/docs/api/
                                    
                                  
                                
                              
                            
                          
                        
                        ...
                      
                      

                      五、项目信息

                      项目信息相关的这部分标签都不是必要的,也就是说完全可以不填写。

                      它的作用仅限于描述项目的详细信息。

                      下面的示例是项目信息相关标签的清单:

                        ...
                        
                        
                        maven-notes
                        
                        maven 学习笔记
                        
                        https://github.com/dunwu/maven-notes
                        
                        2017
                        
                        
                          
                            Apache License, Version 2.0
                            https://www.apache.org/licenses/LICENSE-2.0.txt
                            repo
                            A business-friendly OSS license
                          
                        
                        
                        
                          ...
                          ...
                        
                        
                        
                          
                            victor
                            Zhang Peng
                            forbreak at 163.com
                            https://github.com/dunwu
                            ...
                            ...
                            
                              architect
                              developer
                            
                            +8
                            ...
                          
                        
                        
                         
                          
                            
                          
                        
                        
                        ...
                      
                      

                      这部分标签都非常简单,基本都能做到顾名思义,且都属于可有可无的标签,所以这里仅简单介绍一下:

                      • name - 项目完整名称
                      • description - 项目描述
                      • url - 一般为项目仓库的 host
                      • inceptionYear - 开发年份
                      • licenses - 开源协议
                      • organization - 项目所属组织信息
                      • developers - 项目开发者列表
                      • contributors - 项目贡献者列表, 的子标签和 的完全相同。

                        六、环境配置

                        issueManagement

                        这定义了所使用的缺陷跟踪系统(Bugzilla,TestTrack,ClearQuest 等)。虽然没有什么可以阻止插件使用这些信息的东西,但它主要用于生成项目文档。

                          ...
                          
                            Bugzilla
                            http://127.0.0.1/bugzilla/
                          
                          ...
                        
                        

                        ciManagement

                        CI 构建系统配置,主要是指定通知机制以及被通知的邮箱。

                          ...
                          
                            continuum
                            http://127.0.0.1:8080/continuum
                            
                              
                                mail
                                true
                                true
                                false
                                false
                                continuum@127.0.0.1
                              
                            
                          
                          ...
                        
                        

                        mailingLists:邮件列表

                          ...
                          
                            
                              User List
                              user-subscribe@127.0.0.1
                              user-unsubscribe@127.0.0.1
                              user@127.0.0.1
                              http://127.0.0.1/user/
                              
                                http://base.google.com/base/1/127.0.0.1
                              
                            
                          
                          ...
                        
                        

                        scm

                        SCM(软件配置管理,也称为源代码/控制管理或简洁的版本控制)。常见的 scm 有 svn 和 git 。

                          ...
                          
                            scm:svn:http://127.0.0.1/svn/my-project
                            scm:svn:https://127.0.0.1/svn/my-project
                            HEAD
                            http://127.0.0.1/websvn/my-project
                          
                          ...
                        
                        

                        prerequisites:POM 执行的预设条件。

                          ...
                          
                            2.0.6
                          
                          ...
                        
                        

                        repositories

                        repositories 是遵循 Maven 存储库目录布局的 artifacts 集合。默认的 Maven 中央存储库位于https://repo.maven.apache.org/maven2/上。

                          ...
                          
                            
                              
                                false
                                always
                                warn
                              
                              
                                true
                                never
                                fail
                              
                              codehausSnapshots
                              Codehaus Snapshots
                              http://snapshots.maven.codehaus.org/maven2
                              default
                            
                          
                          
                            ...
                          
                          ...
                        
                        

                        pluginRepositories与 repositories 差不多。

                          ...
                          
                            ...
                            http://mojo.codehaus.org/my-project
                            deployed
                          
                          ...
                        
                        

                        distributionManagement

                        它管理在整个构建过程中生成的 artifact 和支持文件的分布。从最后的元素开始:

                          ...
                          
                            ...
                            http://mojo.codehaus.org/my-project
                            deployed
                          
                          ...
                        
                        
                        • repository - 与 repositories 相似
                        • site - 站点信息
                        • relocation - 项目迁移位置

                          profiles

                          activation 是一个 profile 的关键。配置文件的功能来自于在某些情况下仅修改基本 POM 的功能。这些情况通过 activation 元素指定。

                            ...
                            
                              
                                test
                                
                                  false
                                  1.5
                                  
                                    Windows XP
                                    Windows
                                    x86
                                    5.1.2600
                                  
                                  
                                    sparrow-type
                                    African
                                  
                                  
                                    ${basedir}/file2.properties
                                    ${basedir}/file1.properties
                                  
                                
                                ...
                              
                            
                          
                          

    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]