精华内容
下载资源
问答
  • 全面讲解Pom文件,全面讲解Pom文件,全面讲解Pom文件,全面讲解Pom文件,全面讲解Pom文件 全面讲解Pom文件,全面讲解Pom文件,全面讲解Pom文件,全面讲解Pom文件,全面讲解Pom文件
  • 主要介绍了Spring 项目常用pom文件的依赖,文中给大家提到了Spring boot starter pom的依赖关系说明,需要的朋友参考下吧
  • 其中引用的jar包大家自己去修改,
  • 父级pom文件案例上传

    2020-01-15 11:17:15
    pom文件,如其中有不需要的jar包,可以自行删除,可能没有什么用,
  • pom文件配置详情

    2018-11-04 20:27:20
    ssm项目必须要的几个包都在这里了拿走直接可以用不足的地方多多包涵
  • SpringjavaWeb项目POM文件

    2018-07-06 23:02:45
    SpringjavaWeb项目POM文件SpringjavaWeb项目POM文件SpringjavaWeb项目POM文件
  • maven项目的pom文件

    2019-01-09 19:55:49
    这是maven管理的动态web项目的pom.xml配置文件,里面有ssm框架需要用到的jar包依赖
  • tomcat7源码调试,需要把tomcat编程maven工程所需要的pom文件
  • SSM项目整合所需配置及POM文件.zip
  • maven集成sonar5.6.7进行代码扫描所用的pom文件 maven集成sonar5.6.7进行代码扫描所用的pom文件 maven集成sonar5.6.7进行代码扫描所用的pom文件
  • maven多模块打包的pom文件,里面包含多个模块的pom文件,没有代码
  • SSM框架的maven pom文件

    2017-09-14 16:36:08
    最全的SSM开发用到的pom文件,内含常用的包dependency配置,使用时只需复制到你的pom文件内,就可直接下载,最好是把maven的下载路径改为阿里云下载
  • 本地jar包生成pom文件

    2018-05-31 16:22:14
    本地很多jar包 如果一个一个写<dependency> 特别累 ,使用这个工具可以轻松生成dependency
  • <scala.version>2.10.5 <spark.version>1.6.2 <jackson.version>2.4.3 <hbase.version>1.2.0 的pom文件
  • maven多环境部署pom文件实例,简单实用。
  • maven集成sonar5.6.7进行代码扫描所用的pom文件,包含sonar服务器配置。 想更改上次上传的文件,可是改不了,就重新上传一个
  • mybatis通过pom文件自动生成代码需要jar包-mybatis-generator-maven-plugin-1.3.5.jar
  • maven pom文件

    2018-09-10 20:46:26
    maven pom配置文件 说明
  • dubbo与spring4集成maven pom文件 此pom为我生产项目中的配置,开始想省事使用spring boot,结果与springmvc不兼容,导致tomcat启动失败,后来找了maven shade来打包,解决了xsd兼容问题 另外注意,dubbo阿里的分支...
  • 基于ACTIVITI引擎进行开发,利用maven进行依赖管理,本文件列出来具体的依赖项
  • POM文件详解(如何组织POM文件

    千次阅读 2019-12-10 12:59:03
    POM是项目对象模型(Project Object Model)的简称,它是Maven项目中用来构建项目的配置文件,使用XML表示,名称叫做pom.xml。作用类似ant的build.xml文件,功能更强大。该文件用于管理:源代码、配置文件、开发者的...

    什么是POM?

    POM是项目对象模型(Project Object Model)的简称,它是Maven项目中用来构建项目的配置文件,使用XML表示,名称叫做pom.xml。作用类似ant的build.xml文件,功能更强大。该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。事实上,在Maven世界中,project可以什么都没有,甚至没有代码,但是必须包含pom.xml文件。

    概览

    下面是一个POM项目中的pom.xml文件中包含的元素。注意,其中的modelVersion是4.0.0,这是目前可以被Maven2&3同时支持的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>

    一,基本配置

    1.1 maven的协作相关属性

      一个最简单的pom.xml的定义必须包含modelVersion、groupId、artifactId和version这四个元素,当然这其中的元素也是可以从它的父项目中继承。在Maven中,使用groupId、artifactId和version组成groupdId:artifactId:version的形式来唯一确定一个项目:

    <?xml version="1.0" encoding="UTF-8"?>
    <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/maven-v4_0_0.xsd">
        <!-- 模型版本。maven2.0必须是这样写,现在是maven2唯一支持的版本 -->
        <modelVersion>4.0.0</modelVersion>
        <!--
            定义了项目属于哪个组,
            举个例子,如果你的公司是apache,有一个项目为tomcat,那么groupID就应该是com.apache.tomcat
        -->
        <groupId>com.apache.tomcat</groupId>
        <!--定义了当前maven项目或者子项目在组中的唯一ID,比如:myapp-web等-->
        <artifactId>tomcat</artifactId>
    
        <!--指定了myAPP项目的当前版本,SNAPSHOT意为快照,说明该项目还处于开发中,是不稳定的版本-->
        <version>0.0.1-SNAPSHOT</version>
    
        <!-- 打包的格式,可以为:pom , jar , maven-plugin , ejb , war , ear , rar , par -->
        <packaging>war</packaging>
    
        <!-- 元素声明了一个对用户更为友好的项目名称 -->
        <name>maven</name>
    </project>

    1.2 POM之间的关系,继承、聚合与依赖

      我们知道Maven在建立项目的时候是基于Maven项目下的pom.xml进行的,项目依赖信息以及一些基本信息都是在这个文件里面定义的。那如果当我们有多个项目要进行组织,这多个项目有些配置内容是相同的,有些是要彼此关联的,如果按照传统的做法,我们就需要在多个项目中都定义这些重复的内容。这无疑是非常耗费时间和不易维护的。好在Maven给我们提供了一个基于pom配置文件的继承和聚合功能,它能帮助我们解决以上问题。

           对于使用java的人而言,继承这个词大家应该都不陌生。要继承pom就需要有一个父pom,在Maven中定义了超级pom.xml,任何没有申明自己父pom.xml的pom.xml都将默认继承这个超级pom.xml。

       位置:

        在Maven 2.xxx版本:如maven-2.0.9-uber.jar,打开此Jar文件后,在包org.apache.maven.project下会有pom-4.0.0.xml的文件。
        但是到了3.xxx版本之后: 在maven安装目录下的:/lib/maven-model-builder-version.jar中 \org\apache\maven\mode目录中的pom-4.0.0.xml。

         先来看一下这个超级pom.xml的定义:

    <?xml version="1.0" encoding="UTF-8"?>
    
    <!--
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at
    
        http://www.apache.org/licenses/LICENSE-2.0
    
    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.
    -->
    
    <!-- START SNIPPET: superpom -->
    <project>
      <modelVersion>4.0.0</modelVersion>
      <!--定义了默认的下载依赖包的仓库地址-->
      <repositories>
        <repository>
          <id>central</id>
          <name>Central Repository</name>
          <url>https://repo.maven.apache.org/maven2</url>
          <layout>default</layout>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </repository>
      </repositories>
      <!--定义了默认的下载依赖插件的仓库地址-->
      <pluginRepositories>
        <pluginRepository>
          <id>central</id>
          <name>Central Repository</name>
          <url>https://repo.maven.apache.org/maven2</url>
          <layout>default</layout>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
          <releases>
            <updatePolicy>never</updatePolicy>
          </releases>
        </pluginRepository>
      </pluginRepositories>
      <!--定义在编译打包时文件的输出目录结构-->
      <build>
        <directory>${project.basedir}/target</directory>
        <outputDirectory>${project.build.directory}/classes</outputDirectory>
        <finalName>${project.artifactId}-${project.version}</finalName>
        <testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
        <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
        <scriptSourceDirectory>${project.basedir}/src/main/scripts</scriptSourceDirectory>
        <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
        <resources>
          <resource>
            <directory>${project.basedir}/src/main/resources</directory>
          </resource>
        </resources>
        <testResources>
          <testResource>
            <directory>${project.basedir}/src/test/resources</directory>
          </testResource>
        </testResources>
        <pluginManagement>
          <!-- NOTE: These plugins will be removed from future versions of the super POM -->
          <!-- They are kept for the moment as they are very unlikely to conflict with lifecycle mappings (MNG-4453) -->
          <plugins>
            <plugin>
              <artifactId>maven-antrun-plugin</artifactId>
              <version>1.3</version>
            </plugin>
            <plugin>
              <artifactId>maven-assembly-plugin</artifactId>
              <version>2.2-beta-5</version>
            </plugin>
            <plugin>
              <artifactId>maven-dependency-plugin</artifactId>
              <version>2.8</version>
            </plugin>
            <plugin>
              <artifactId>maven-release-plugin</artifactId>
              <version>2.3.2</version>
            </plugin>
          </plugins>
        </pluginManagement>
      </build>
    
      <reporting>
        <outputDirectory>${project.build.directory}/site</outputDirectory>
      </reporting>
    
      <profiles>
        <!-- NOTE: The release profile will be removed from future versions of the super POM -->
        <profile>
          <id>release-profile</id>
    
          <activation>
            <property>
              <name>performRelease</name>
              <value>true</value>
            </property>
          </activation>
    
          <build>
            <plugins>
              <plugin>
                <inherited>true</inherited>
                <artifactId>maven-source-plugin</artifactId>
                <executions>
                  <execution>
                    <id>attach-sources</id>
                    <goals>
                      <goal>jar</goal>
                    </goals>
                  </execution>
                </executions>
              </plugin>
              <plugin>
                <inherited>true</inherited>
                <artifactId>maven-javadoc-plugin</artifactId>
                <executions>
                  <execution>
                    <id>attach-javadocs</id>
                    <goals>
                      <goal>jar</goal>
                    </goals>
                  </execution>
                </executions>
              </plugin>
              <plugin>
                <inherited>true</inherited>
                <artifactId>maven-deploy-plugin</artifactId>
                <configuration>
                  <updateReleaseInfo>true</updateReleaseInfo>
                </configuration>
              </plugin>
            </plugins>
          </build>
        </profile>
      </profiles>
    
    </project>
    <!-- END SNIPPET: superpom -->

     

    对于一个pom.xml来说有几个元素是必须定义的,一个是project根元素,然后就是它里面的modelVersion、groupId、artifactId和version。从上面的超级pom.xml的内容我们可以看到pom.xml中没有groupId、artifactId和version的定义,所以我们在建立自己的pom.xml时必须定义这三个元素。和java里面的继承类似,子pom.xml会完全继承父pom.xml中所有的元素,而且对于相同的元素,一般子pom.xml中的会覆盖父pom.xml中的元素,但是有几个特殊的元素它们会进行合并而不是覆盖。这些特殊的元素是:

    • dependencies
    • developers
    • contributors
    • plugin列表,包括plugin下面的reports
    • resources

    1.2.1 继承

    1.2.1.1 被继承项目与继承项目是父子目录关系

           现在假设我们有一个项目projectA,它的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/maven-v4_0_0.xsd">  
      <modelVersion>4.0.0</modelVersion>  
      <groupId>com.tiantian.mavenTest</groupId>  
      <artifactId>projectA</artifactId>  
      <packaging>jar</packaging>  
      <version>1.0-SNAPSHOT</version>  
    </project> 

      然后我们有另一个项目projectB,而且projectB是跟projectA的pom.xml文件处于同一个目录下,这时候如果projectB要继承projectA的话,我们可以这样定义projectB的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/maven-v4_0_0.xsd">  
      <parent>  
        <groupId>com.tiantian.mavenTest</groupId>  
        <artifactId>projectA</artifactId>  
        <version>1.0-SNAPSHOT</version>  
      </parent>  
      <modelVersion>4.0.0</modelVersion>  
      <groupId>com.tiantian.mavenTest</groupId>  
      <artifactId>projectB</artifactId>  
      <packaging>jar</packaging>  
      <version>1.0-SNAPSHOT</version>  
    </project>

     从projectB的pom.xml文件定义,我们可以知道,当需要继承指定的一个Maven项目时,我们需要在自己的pom.xml中定义一个parent元素,在这个元素中指明需要继承项目的groupId、artifactId和version。

    1.2.1.2 被继承项目与继承项目的目录结构不是父子关系

      当被继承项目与继承项目的目录结构不是父子关系的时候,我们再利用上面的配置是不能实现Maven项目的继承关系的,这个时候我们就需要在子项目的pom.xml文件定义中的parent元素下再加上一个relativePath元素的定义,用以描述父项目的pom.xml文件相对于子项目的pom.xml文件的位置。

      假设我们现在还是有上面两个项目,projectA和projectB,projectB还是继承自projectA,但是现在projectB不在projectA的子目录中,而是与projectA处于同一目录中。这个时候projectA和projectB的目录结构如下:

      ------projectA

        ------pom.xml

      ------projectB

        ------pom.xml

      这个时候我们可以看出projectA的pom.xml相对于projectB的pom.xml的位置是“../projectA/pom.xml”,所以这个时候projectB的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/maven-v4_0_0.xsd">  
      <parent>  
        <groupId>com.tiantian.mavenTest</groupId>  
        <artifactId>projectA</artifactId>  
        <version>1.0-SNAPSHOT</version>  
           <relativePath>../projectA/pom.xml</relativePath>  
      </parent>  
      <modelVersion>4.0.0</modelVersion>  
      <groupId>com.tiantian.mavenTest</groupId>  
      <artifactId>projectB</artifactId>  
      <packaging>jar</packaging>  
      <version>1.0-SNAPSHOT</version>  
    </project>  

    1.2.2 聚合

           对于聚合这个概念搞java的人应该都不会陌生。先来说说我对聚合和被聚合的理解,比如说如果projectA聚合到projectB,那么我们就可以说projectA是projectB的子模块, projectB是被聚合项目,也可以类似于继承那样称为父项目。对于聚合而言,这个主体应该是被聚合的项目。所以,我们需要在被聚合的项目中定义它的子模块,而不是像继承那样在子项目中定义父项目。具体做法是:

    • 修改被聚合项目的pom.xml中的packaging元素的值为pom
    • 在被聚合项目的pom.xml中的modules元素下指定它的子模块项目

    对于聚合而言,当我们在被聚合的项目上使用Maven命令时,实际上这些命令都会在它的子模块项目上使用。这就是Maven中聚合的一个非常重要的作用。假设这样一种情况,你同时需要打包或者编译projectA、projectB、projectC和projectD,按照正常的逻辑我们一个一个项目去使用mvn compile或mvn package进行编译和打包,对于使用Maven而言,你还是这样使用的话是非常麻烦的。因为Maven给我们提供了聚合的功能。我们只需要再定义一个超级项目,然后在超级项目的pom.xml中定义这个几个项目都是聚合到这个超级项目的。之后我们只需要对这个超级项目进行mvn compile,它就会把那些子模块项目都进行编译。

    1.2.2.1 被聚合项目和子模块项目在目录结构上是父子关系

      还拿上面定义的projectA和projectB来举例子,现在假设我们需要把projectB聚合到projectA中。projectA和projectB的目录结构如下所示:

      ------projectA

        ------projectB

          -----pom.xml

        ------pom.xml

      这个时候projectA的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>  
      <groupId>com.tiantian.mavenTest</groupId>  
      <artifactId>projectA</artifactId>  
      <version>1.0-SNAPSHOT</version>  
      <packaging>pom</packaging>  
      <modules>  
           <module>projectB</module>  
      </modules>  
    </project>  

      由上面的定义我们可以看到被聚合的项目的packaging类型应该为pom,而且一个项目可以有多个子模块项目。对于聚合这种情况,我们使用子模块项目的artifactId来作为module的值,表示子模块项目相对于被聚合项目的地址,在上面的示例中就表示子模块projectB是处在被聚合项目的子目录下,即与被聚合项目的pom.xml处于同一目录。这里使用的module值是子模块projectB对应的目录名projectB,而不是子模块对应的artifactId。这个时候当我们对projectA进行mvn package命令时,实际上Maven也会对projectB进行打包。

    1.2.2.2 被聚合项目与子模块项目在目录结构上不是父子关系

      那么当被聚合项目与子模块项目在目录结构上不是父子关系的时候,我们应该怎么来进行聚合呢?还是像继承那样使用relativePath元素吗?答案是非也,具体做法是在module元素中指定以相对路径的方式指定子模块。我们来看下面一个例子。

      继续使用上面的projectA和projectB,还是需要把projectB聚合到projectA,但是projectA和projectB的目录结构不再是父子关系,而是如下所示的这种关系:

      ------projectA

        ------pom.xml

      ------projectB

        ------pom.xml

      这个时候projectA的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>  
       
      <groupId>com.tiantian.mavenTest</groupId>  
      <artifactId>projectA</artifactId>  
      <version>1.0-SNAPSHOT</version>  
      <packaging>pom</packaging>  
      <modules>  
           <module>../projectB</module>  
      </modules>  
    </project>  

    注意看module的值是“../projectB”,我们知道“..”是代表当前目录的上层目录,所以它表示子模块projectB是被聚合项目projectA的pom.xml文件所在目录(即projectA)的上层目录下面的子目录,即与projectA处于同一目录层次。注意,这里的projectB对应的是projectB这个项目的目录名称,而不是它的artifactId

    1.2.2.3 聚合与继承同时进行

           假设有这样一种情况,有两个项目,projectA和projectB,现在我们需要projectB继承projectA,同时需要把projectB聚合到projectA。然后projectA和projectB的目录结构如下:

           ------projectA

                  ------pom.xml

           ------projectB

                  ------pom.xml

           那么这个时候按照上面说的那样,projectA的pom.xml中需要定义它的packaging为pom,需要定义它的modules,所以projectA的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>  
      <groupId>com.tiantian.mavenTest</groupId>  
      <artifactId>projectA</artifactId>  
      <version>1.0-SNAPSHOT</version>  
      <packaging>pom</packaging>  
      <modules>  
           <module>../projectB</module>  
      </modules>  
    </project>  

     而projectB是继承自projectA的,所以我们需要在projectB的pom.xml文件中新增一个parent元素,用以定义它继承的项目信息。所以projectB的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>  
      <parent>  
           <groupId>com.tiantian.mavenTest</groupId>  
           <artifactId>projectA</artifactId>  
           <version>1.0-SNAPSHOT</version>  
           <relativePath>../projectA/pom.xml</relativePath>  
      </parent>  
      <groupId>com.tiantian.mavenTest</groupId>  
      <artifactId>projectB</artifactId>  
      <version>1.0-SNAPSHOT</version>  
      <packaging>jar</packaging>  
    </project>  

    1.2.3 依赖关系:依赖关系列表(dependency list)是POM的重要部分

           项目之间的依赖是通过pom.xml文件里面的dependencies元素下面的dependency元素进行的。一个dependency元素定义一个依赖关系。在dependency元素中我们主要通过依赖项目的groupId、artifactId和version来定义所依赖的项目。

           先来看一个简单的项目依赖的示例吧,假设我现在有一个项目projectA,然后它里面有对junit的依赖,那么它的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>  
      <groupId>com.tiantian.mavenTest</groupId>  
      <artifactId>projectB</artifactId>  
      <version>1.0-SNAPSHOT</version>  
      <packaging>jar</packaging>  
       
      <dependencies>  
        <dependency>  
          <groupId>junit</groupId>  
          <artifactId>junit</artifactId>  
          <version>3.8.1</version>  
          <scope>test</scope>  
          <optional>true</optional>  
        </dependency>  
      </dependencies>  
    </project>  

    groupId, artifactId, version:描述了依赖的项目唯一标志。

    type:对应于依赖项目的packaging类型,默认是jar。

    scope:用于限制相应的依赖范围、传播范围。scope的主要取值范围如下(还有一个是在Maven2.0.9以后版本才支持的import,关于import作用域将在后文《Dependency介绍》中做介绍):

    • test:在测试范围有效,它在执行命令test的时候才执行,并且它不会传播给其他模块进行引入,比如 junit,dbunit 等测试框架。
    • compile(default 默认):这是它的默认值,这种类型很容易让人产生误解,以为只有在编译的时候才是需要的,其实这种类型表示所有的情况都是有用的,包括编译和运行时。而且这种类型的依赖性是可以传递的。
    • runtime:在程序运行的时候依赖,在编译的时候不依赖。
    • provided:这个跟compile很类似,但是它表示你期望这个依赖项目在运行时由JDK或者容器来提供。这种类型表示该依赖只有在测试和编译的情况下才有效,在运行时将由JDK或者容器提供。这种类型的依赖性是不可传递的。比如 javaee:

      • eclipse开发web环境中是没有javaee必须要手动添加。
      • myeclipse新建web项目会有JavaEE(servlet-api.jar,jsp-api.jar...)web容器依赖的jar包,一般都是做开发的时候才使用。但是myeclipse不会把这些 jar包发布的,lib下你是找不到javaee引入的jar包,因为myeclipse发布项目的时候会忽略它。为什么?因为tomcat容器bin/lib已经存在了这个jar包了。
    • system:这种类型跟provided类似,唯一不同的就是这种类型的依赖我们要自己提供jar包,这需要与另一个元素systemPath来结合使用。systemPath将指向我们系统上的jar包的路径,而且必须是给定的绝对路径。
      • systemPath:上面已经说过了这个元素是在scope的值为system的时候用于指定依赖的jar包在系统上的位置的,而且是绝对路径。该元素必须在依赖的 jar包的scope为system时才能使用,否则Maven将报错。
      • optional:当该项目本身作为其他项目的一个依赖时标记该依赖为可选项。假设现在projectA有一个依赖性projectB,我们把projectB这个依赖项设为optional,这表示projectB在projectA的运行时不一定会用到。这个时候如果我们有另一个项目projectC,它依赖于projectA,那么这个时候因为projectB对于projectA是可选的,所以Maven在建立projectC的时候就不会安装projectB,这个时候如果projectC确实需要使用到projectB,那么它就可以定义自己对projectB的依赖。当一个依赖是可选的时候,我们把optional元素的值设为true,否则就不设置optional元素。
      • exclusions:考虑这样一种情况,我们的projectA依赖于projectB,然后projectB又依赖于projectC,但是在projectA里面我们不需要projectB依赖的projectC,那么这个时候我们就可以在依赖projectB的时候使用exclusions元素下面的exclusion排除projectC。这个时候我们可以这样定义projectA对projectB的依赖:
      • <dependencies>  
             <dependency>  
                    <groupId>com.tiantian.mavenTest</groupId>  
                    <artifactId>projectB</artifactId>  
                    <version>1.0-SNAPSHOT</version>  
                    <exclusions>  
                           <exclusion>  
                                  <groupId>com.tiantian.mavenTest</groupId>  
                                  <artifactId>projectC</artifactId>  
                           </exclusion>  
                    </exclusions>  
             </dependency>  
        </dependencies>

    1.3 属性

    在pom.xml文件中我们可以使用${propertyName}的形式引用属性。是值的占位符,类似EL,类似ant的属性,比如${X},可用于pom文件任何赋值的位置。有以下分类:

    • env.propertyName:这种形式表示引用的是环境变量,比如我们需要引用当前系统的环境变量PATH的时候,就可以使用${env.PATH}。
    • project.propertyName:这种形式表示引用的是当前这个pom.xml中project根元素下面的子元素的值。比如我们需要引用当前project下面的version的时候,就可以使用${project.version}。
    • settings.propertyName:这种形式引用的是Maven本地配置文件settings.xml或本地Maven安装目录下的settings.xml文件根元素settings下的元素。比如我们需要引用settings下的本地仓库localRepository元素的值时,我们可以用${settings.localRepository}
    • Java System Properties:java的系统属性,所有在java中使用java.lang.System.getProperties()能够获取到的属性都可以在pom.xml中引用,比如${java.home}。
    • 自定义:pom.xml中properties元素下面的子元素作为属性。假如在pom.xml中有如下一段代码<properties><hello.world>helloWorld</hello.world></properties>,那么我们就可以使用${hello.world}引用到对应的helloWorld。
    展开全文
  • maven:pom文件详解

    万次阅读 多人点赞 2019-06-15 16:59:29
    pom文件定于了一个maven项目的maven配置,一般pom文件的放在项目或者模块的根目录下。 maven的遵循约定大于配置,约定了如下的目录结构: 目录 目的 ${basedir} 存放pom.xml和所有的子目录 ${basedir}...

    一、maven项目的目录结构

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

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

    目录目的
    ${basedir}存放pom.xml和所有的子目录
    ${basedir}/src/main/java项目的java源代码
    ${basedir}/src/main/resources项目的资源,比如说property文件,springmvc.xml
    ${basedir}/src/test/java项目的测试类,比如说Junit代码
    ${basedir}/src/test/resources测试用的资源
    ${basedir}/src/main/scripts项目脚本源码的目录
    ${basedir}/src/main/webapp/WEB-INFweb应用文件目录,web项目的信息,比如存放web.xml、本地图片、jsp视图页面
    ${basedir}/target打包输出目录
    ${basedir}/target/classes编译输出目录
    ${basedir}/target/site生成文档的目录,可以通过index.html查看项目的文档
    ${basedir}/target/test-classes测试编译输出目录
    Test.javaMaven只会自动运行符合该命名规则的测试类
    ~/.m2/repositoryMaven默认的本地仓库目录位置

    二、根元素和必要配置

    <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>
        <!-- 公司或者组织的唯一标志,也是打包成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、groupId、artifactId、version、packaging等重要的元素。其中,groupId、artifactId、version三个元素用来定义一个项目的坐标,也就是说,一个maven仓库中,完全相同的一组groupId、artifactId、version,只能有一个项目。

    • project:整个pom配置文件的根元素,所有的配置都是写在project元素里面的;
    • modelVersion:指定了当前POM模型的版本,对于Maven2及Maven 3来说,它只能是4.0.0;
    • groupId:这是项目组的标识。它在一个组织或者项目中通常是唯一的。
    • artifactId:这是项目的标识,通常是工程的名称。它在一个项目组(group)下是唯一的。
    • version:这是项目的版本号,用来区分同一个artifact的不同版本。
    • packaging:这是项目产生的构件类型,即项目通过maven打包的输出文件的后缀名,包括jar、war、ear、pom等。

    三、父项目和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>

        所有的pom都继承自一个父pom(Super POM)。父pom包含了一些可以被继承的默认设置,如果项目的pom中没有设置这些元素,就会使用父pom中设置。例如,Super POM中配置了默认仓库http://repo1.maven.org/maven2,这样哪怕项目的pom中没有配置仓库,也可以去这个默认仓库中去下载依赖。实际上,maven pom文件约定大于配置的原则,就是通过在Super POM中预定义了一些配置信息来实现的。

        Maven使用effective pom(Super pom加上工程自己的配置)来执行相关的目标,它帮助开发者在pom.xml中做尽可能少的配置。当然,这些配置也可以被重写。

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

    • parent:用于指定父项目;
    • groupId:parent的子元素,父项目的groupId,用于定位父项目;
    • artifactId:parent的子元素,父项目的artifactId,用于定位父项目;
    • version:parent的子元素,父项目的version,用于定位父项目;
    • relativePath:parent的子元素,用于定位父项目pom文件的位置。

    四、项目构建需要的信息

        <!--构建项目需要的信息 -->
        <build>
            <!--------------------- 路径管理(在遵循约定大于配置原则下,不需要配置) --------------------->
            <!--项目源码目录,当构建项目的时候,构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径。 -->
            <sourceDirectory />
            <!--该元素设置了项目单元测试使用的源码目录。该路径是相对于pom.xml的相对路径 -->
            <testSourceDirectory />
            <!--被编译过的应用程序class文件存放的目录。 -->
            <outputDirectory />
            <!--被编译过的测试class文件存放的目录。 -->
            <testOutputDirectory />        
            <!--项目脚本源码目录,该目录下的内容,会直接被拷贝到输出目录,因为脚本是被解释的,而不是被编译的 -->
            <scriptSourceDirectory />
    
            <!--------------------- 资源管理 --------------------->
            <!--这个元素描述了项目相关的所有资源路径列表,例如和项目相关的属性文件,这些资源被包含在最终的打包文件里。 -->
            <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>
    
            <!--------------------- 插件管理 --------------------->
            <!-- 子项目可以引用的默认插件信息。pluginManagement中的插件直到被引用时才会被解析或绑定到生命周期 -->
            <!-- 这里只是做了声明,并没有真正的引入。给定插件的任何本地配置都会覆盖这里的配置-->
            <pluginManagement>
                <!-- 可使用的插件列表 -->
                <plugins>
                    <!--plugin元素包含描述插件所需要的信息。 -->
                    <plugin>
                        <!--插件在仓库里的group ID -->
                        <groupId />
                        <!--插件在仓库里的artifact ID -->
                        <artifactId />
                        <!--被使用的插件的版本(或版本范围) -->
                        <version />
                        <!-- 是否从该插件下载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>
    
            <!--------------------- 构建扩展 --------------------->
            <!--使用来自其他项目的一系列构建扩展 -->
            <extensions>
                <!--每个extension描述一个会使用到其构建扩展的一个项目,extension的子元素是项目的坐标 -->
                <extension>
                    <!--项目坐标三元素:groupId + artifactId + version -->
                    <groupId />
                    <artifactId />
                    <version />
                </extension>
            </extensions>
    
            <!--------------------- 其他配置 --------------------->
            <!--当项目没有规定目标(Maven2 叫做阶段)时的默认值 -->
            <defaultGoal />
            <!--构建产生的所有文件存放的目录 -->
            <directory />
            <!--产生的构件的文件名,默认值是${artifactId}-${version}。 -->
            <finalName />
            <!--当filtering开关打开时,使用到的过滤器属性文件列表 -->
            <filters />
        </build>

        build标签定义了构建项目需要的信息,这部分信息对于定制化项目构建是非常重要的。这里会根据build的子元素的特点,简单地分类讲解。

    1、路径管理

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

        路径管理定义了各种源码和编译结果的输出路径。如果遵循maven默认的路径约定,这里的几个元素是不需要配置的。这些元素包括:

    • sourceDirectory:项目源码目录,定义的是相对于pom文件的相对路径;
    • testSourceDirectory:项目单元测试源码目录,定义的也是是相对于pom文件的相对路径;
    • outputDirectory:被编译过的应用程序class文件存放的目录,也是是相对于pom文件的相对路径;
    • testOutoutDIrectory:被编译过的测试class文件存放的目录,也是是相对于pom文件的相对路径;
    • scriptSourceDirectory:项目脚本源码目录,也是是相对于pom文件的相对路径。由于脚本是解释性的语言,所以该目录下的内容,会直接被拷贝到输出目录,而不需要编译。

    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>

        这里的元素主要是对应用程序resource资源和单元测试部分resource资源的管理,分别通过resource标签和testResource标签管理两种资源。两个标签元素可选的子元素都是一样的。子元素包括:

    • targetPath:描述了资源的目标输出路径,该路径是相对于target/classes的路径;
    • filtering:对文件中的参数值进行过滤,需要被过滤的文件在filter中指定;
    • directory:描述打包前的资源的存放路径,这个路径是相对于pom文件所在目录的相对路径;
    • includes:包含的模式列表,例如**/*.xml。只有符合条件的资源文件才会在打包的时候被放入到输出路径中;
    • excludes:排除的模式列表,例如**/*.xml,符合的资源文件不会在打包的时候会被过滤掉。

    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、构建扩展

        extensions是在此构建中使用的项目的列表,它们将被包含在运行构建的classpath中。这些项目可以启用对构建过程的扩展,并使活动的插件能够对构建生命周期进行更改。简而言之,扩展是在构建期间激活的artifacts。扩展不需要实际执行任何操作,也不包含 Mojo。因此,扩展对于指定普通插件接口的多个实现中的一个是非常好的。

            <!--------------------- 构建扩展 --------------------->
            <!--使用来自其他项目的一系列构建扩展 -->
            <extensions>
                <!--每个extension描述一个会使用到其构建扩展的一个项目,extension的子元素是项目的坐标 -->
                <extension>
                    <!--项目坐标三元素:groupId + artifactId + version -->
                    <groupId />
                    <artifactId />
                    <version />
                </extension>
            </extensions>

    5、其他配置

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

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

    五、项目依赖相关信息

        pom文件中通过dependencyManagement来声明依赖,通过dependencies元素来管理依赖。dependencyManagement下的子元素只有一个直接的子元素dependencice,其配置和dependencies子元素是完全一致的;而dependencies下只有一类直接的子元素:dependency。一个dependency子元素表示一个依赖项目。

        <!--该元素描述了项目相关的所有依赖。 这些依赖自动从项目定义的仓库中下载 -->
        <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:默认范围,用于编译;  - provided:类似于编译,但支持jdk或者容器提供,类似于classpath 
                    - runtime: 在执行时需要使用;    - systemPath: 仅用于范围为system。提供相应的路径 
                    - test: 用于test任务时使用;    - system: 需要外在提供相应的元素。通过systemPath来取得 
                    - optional: 当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用 -->
                <scope>test</scope>
                <!-- 该元素为依赖规定了文件系统上的路径。仅供scope设置system时使用。但是不推荐使用这个元素 -->
                <!-- 不推荐使用绝对路径,如果必须要用,推荐使用属性匹配绝对路径,例如${java.home} -->
                <systemPath></systemPath>
            </dependency>
        </dependencies>
    
        <!-- 继承自该项目的所有子项目的默认依赖信息,这部分的依赖信息不会被立即解析。 -->
        <!-- 当子项目声明一个依赖,如果group ID和artifact ID以外的一些信息没有描述,则使用这里的依赖信息 -->
        <dependencyManagement>
            <dependencies>
                <!--参见dependencies/dependency元素 -->
                <dependency>
                    ......
                </dependency>
            </dependencies>
        </dependencyManagement>

        这里也是根据元素的作用,简单的对dependency的子元素做了一下分类。下面按分类来看一下dependency的子元素:

    1、依赖坐标

        依然是通过groupId + artifactId + version来在仓库中定位一个项目:

    • groupId:parent的子元素,父项目的groupId,用于定位父项目;
    • artifactId:parent的子元素,父项目的artifactId,用于定位父项目;
    • version:parent的子元素,父项目的version,用于定位父项目;

    2、依赖类型

        这个分类主要包括两个元素,分别是依赖类型和依赖的分类器。同一个项目,即使打包成同一种类型,也可以有多个文件同时存在,因为它们的分类器可能是不同的。

    • type:依赖类型,默认是jar。通常表示依赖文件的扩展名,但也有例外。一个类型可以被映射成另外一个扩展名或分类器。类型经常和使用的打包方式对应,尽管这也有例外,一些类型的例子:jar,war,ejb-client和test-jar。如果设置extensions为true,就可以在plugin里定义新的类型。
    • classifier:依赖的分类器。分类器可以区分属于同一个POM,但不同构建方式的构件。分类器名被附加到文件名的版本号后面,如果想将项目构建成两个单独的JAR,分别使用Java 4和6编译器,就可以使用分类器来生成两个单独的JAR构件

    3、依赖传递

        依赖传递相关的子元素主要有两个,用于依赖排除的exclusions和设置依赖是否可选的optional。

    • exclusions:排除该项目中的一些依赖,即本项目A依赖该dependency指示的项目B,但是不依赖项目B中依赖的这些依赖;
    • optional:可选依赖,用于阻断依赖的传递性,即本项目不会依赖父项目中optional设置为true的依赖。

    4、依赖范围

        还有一些其他元素:

    • scope:依赖范围。在项目发布过程中,帮助决定哪些构件被包括进来
                      - compile:默认范围,用于编译;   - provided:类似于编译,但支持jdk或者容器提供,类似于classpath 
                      - runtime: 在执行时需要使用;         - systemPath: 仅用于范围为system,提供相应的路径 
                      - test: 用于test任务时使用;             - system: 需要外在提供相应的元素,通过systemPath来取得 
                      - optional: 当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用
    • systemPath:该元素为依赖规定了文件系统上的绝对路径。仅在scope设置成system时才会使用。不推荐使用这个元素。不推荐使用绝对路径,如果必须要用,推荐使用属性匹配绝对路径,例如${java.home}

    六、生成文档相关的元素

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

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

        和生成文档相关的元素,包括name,url,和description。

    • name:项目名称,maven生成文档会使用项目名;
    • url:项目主页的地址,maven生成文档的时候使用。
    • description:项目描述。如果可以使用HTML格式进行描述的时候,不推荐使用纯文本的描述。

    七、远程仓库列表

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

        需要注意的是release和snapshot两者的区别。release是稳定版本,一经发布不再修改,想发布修改后的项目,只能升级项目版本再进行发布;snapshot是不稳定的,一个snapshot的版本可以不断改变。项目在开发期间一般会使用snapshot,更方便进行频繁的代码更新;一旦发布到外部,或者开发基本完成,代码迭代不再频繁,则推荐使用release。

        <!--发现依赖和扩展的远程仓库列表。 -->
        <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>

    八、项目分发信息相关元素

        <!--项目分发信息,在执行mvn deploy后表示要发布的位置。用于把网站部署到远程服务器或者把构件部署到远程仓库 -->
        <distributionManagement>
            <!--部署项目产生的构件到远程仓库需要的信息 -->
            <repository>
                <!-- 是分配给快照一个唯一的版本号 -->
                <uniqueVersion />
                <!-- 其他配置参见repositories/repository元素 -->
                <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>

        项目分发信息的相关配置,在distributionManagement中设置。设置的内容包括:

    • repository和snapshotRepository:项目产生的构建/快照构建部署的远程仓库。如果不配置snapshotRepository,快照也会部署到repository中;
    • site:部署项目的网站需要的信息;
    • downloadUrl:项目下载页面的URL,这是为不在仓库中的构建提供的;
    • relocation:如果构件有了新的group ID和artifact ID(移到了新的位置),这里列出构件的新的信息;
    • status:给出该构件在远程仓库的状态,本地项目中不能设置该元素,这是工具自动更新的。

    九、报表规范

        报表规范描述的是使用mvn site命令时使用的一些配置。

        <!-- 该元素描述使用报表插件产生报表的规范 -->
        <!-- 当用户执行"mvn site",这些报表就会运行,在页面导航栏能看到所有报表的链接 -->
        <reporting>
            <!--网站是否排除默认的报表。这包括"项目信息"菜单中的报表。 -->
            <excludeDefaults />
            <!--所有产生的报表存放到哪里。默认值是${project.build.directory}/site。 -->
            <outputDirectory />
            <!--使用的报表插件和他们的配置。 -->
            <plugins>
                <!--plugin元素包含描述报表插件需要的信息 -->
                <plugin>
                    <!--报表插件定位:groupId + artifactId + version -->
                    <groupId />
                    <artifactId />
                    <version />
    
                    <!--任何配置是否被传播到子项目 -->
                    <inherited />
                    <!--报表插件的配置 -->
                    <configuration />
                    <!-- 一组报表的多重规范,每个规范可能有不同的配置。一个规范(报表集)对应一个执行目标 -->
                    <!-- 例如,有1~9这9个报表。1,2构成A报表集,对应一个执行目标;2,5构成B报表集,对应另一个执行目标 -->
                    <reportSets>
                        <!--表示报表的一个集合,以及产生该集合的配置 -->
                        <reportSet>
                            <!--报表集合的唯一标识符,POM继承时用到 -->
                            <id />
                            <!--产生报表集合时,被使用的报表的配置 -->
                            <configuration />
                            <!--配置是否被继承到子POMs -->
                            <inherited />
                            <!--这个集合里使用到哪些报表 -->
                            <reports />
                        </reportSet>
                    </reportSets>
                </plugin>
            </plugins>
        </reporting>

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

     

    十一、邮件列表和持续集成配置

        <!--项目持续集成信息 -->
        <ciManagement>
            <!--持续集成系统的名字,例如continuum -->
            <system />
            <!--该项目使用的持续集成系统的URL(如果持续集成系统有web接口的话)。 -->
            <url />
            <!--构建完成时,需要通知的开发者/用户的配置项。包括被通知者信息和通知条件(错误,失败,成功,警告) -->
            <notifiers>
                <!--配置一种方式,当构建中断时,以该方式通知用户/开发者 -->
                <notifier>
                    <!--传送通知的途径 -->
                    <type />
                    <!--发生错误时是否通知 -->
                    <sendOnError />
                    <!--构建失败时是否通知 -->
                    <sendOnFailure />
                    <!--构建成功时是否通知 -->
                    <sendOnSuccess />
                    <!--发生警告时是否通知 -->
                    <sendOnWarning />
                    <!--不赞成使用。通知发送到哪里 -->
                    <address />
                    <!--扩展配置项 -->
                    <configuration />
                </notifier>
            </notifiers>
        </ciManagement>
    
        <!--项目相关邮件列表信息 -->
        <mailingLists>
            <!--该元素描述了项目相关的所有邮件列表。自动产生的网站引用这些信息。 -->
            <mailingList>
                <!--邮件的名称 -->
                <name>Demo</name>
                <!--发送邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建 -->
                <post>nanxs@123.com</post>
                <!--订阅邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建 -->
                <subscribe>nanxs@123.com</subscribe>
                <!--取消订阅邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建 -->
                <unsubscribe>nanxs@123.com</unsubscribe>
                <!--你可以浏览邮件信息的URL -->
                <archive>http:/a.b.c/nanxs/demo/dev/</archive>
            </mailingList>
        </mailingLists>

    十二、项目的描述性信息

        <!--项目的问题管理系统(Bugzilla, Jira, Scarab,或任何你喜欢的问题管理系统)的名称和URL -->
        <issueManagement>
            <!--问题管理系统(例如jira)的名字, -->
            <system>jira</system>
            <!--该项目使用的问题管理系统的URL -->
            <url>http://jira.baidu.com/nanxs</url>
        </issueManagement>
    
        <!--项目创建年份,4位数字。当产生版权信息时需要使用这个值。 -->
        <inceptionYear />
    
        <!--项目开发者列表 -->
        <developers>
            <!--某个项目开发者的信息 -->
            <developer>
                <!--SCM里项目开发者的唯一标识符 -->
                <id>HELLO WORLD</id>
                <!--项目开发者的全名 -->
                <name>nanxs</name>
                <!--项目开发者的email -->
                <email>123@abc.com</email>
                <!--项目开发者的主页的URL -->
                <url />
                <!--项目开发者在项目中扮演的角色,角色元素描述了各种角色 -->
                <roles>
                    <role>Project Manager</role>
                    <role>Architect</role>
                </roles>
                <!--项目开发者所属组织 -->
                <organization>demo</organization>
                <!--项目开发者所属组织的URL -->
                <organizationUrl>http://a.b.com/nanxs</organizationUrl>
                <!--项目开发者属性,如即时消息如何处理等 -->
                <properties>
                    <dept>No</dept>
                </properties>
                <!--项目开发者所在时区, -11到12范围内的整数。 -->
                <timezone>-5</timezone>
            </developer>
        </developers>
    
        <!--项目的其他贡献者列表 -->
        <contributors>
            <!--项目的其他贡献者。参见developers/developer元素 -->
            <contributor>
                <name />
                <email />
                <url />
                <organization />
                <organizationUrl />
                <roles />
                <timezone />
                <properties />
            </contributor>
        </contributors>
    
        <!--该元素描述了项目所有License列表。 应该只列出该项目的license列表,不要列出依赖项目的license列表 -->
        <!--如果列出多个license,用户可以选择它们中的一个而不是接受所有license -->
        <licenses>
            <!--描述了项目的license,用于生成项目的web站点的license页面,其他一些报表和validation也会用到该元素。 -->
            <license>
                <!--license用于法律上的名称 -->
                <name>Apache 2</name>
                <!--官方的license正文页面的URL -->
                <url>http://a.b.com/nanxs/LICENSE-1.0.txt</url>
                <!--项目分发的主要方式: repo,可以从Maven库下载 manual, 用户必须手动下载和安装依赖 -->
                <distribution>repo</distribution>
                <!--关于license的补充信息 -->
                <comments>A business-friendly OSS license</comments>
            </license>
        </licenses>
    
        <!--SCM(Source Control Management)标签允许你配置你的代码库,供Maven web站点和其它插件使用。 -->
        <scm>
            <!--SCM的URL,该URL描述了版本库和如何连接到版本库。该连接只读 -->
            <connection>scm:svn:http://a.b.com/nanxs</connection>
            <!--给开发者使用的,类似connection元素。即该连接不仅仅只读 -->
            <developerConnection>scm:svn:http://a.b.com/nanxs</developerConnection>
            <!--当前代码的标签,在开发阶段默认为HEAD -->
            <tag />
            <!--指向项目的可浏览SCM库(例如ViewVC或者Fisheye)的URL。 -->
            <url>http://a.b.com/nanxs</url>
        </scm>
    
        <!--描述项目所属组织的各种属性。Maven产生的文档用 -->
        <organization>
            <!--组织的全名 -->
            <name>demo</name>
            <!--组织主页的URL -->
            <url>http://a.b.com/nanxs</url>
        </organization>

    十三、其他配置

        <!--描述了这个项目构建环境中的前提条件。 -->
        <prerequisites>
            <!--构建该项目或使用该插件所需要的Maven的最低版本 -->
            <maven />
        </prerequisites>
    
        <!--模块(有时称作子项目) 被构建成项目的一部分。列出的每个模块元素是指向该模块的目录的相对路径 -->
        <modules />
    
        <!--以值替代名称,Properties可以在整个POM中使用,也可以作为触发条件(见settings.xml中activation元素的说明) -->
        <!-格式是<name>value</name>。 -->
        <properties />
    
        <!--不推荐使用,现在Maven忽略该元素. -->
        <reports></reports>
    展开全文
  • POM文件帮助文档.pdf

    2020-10-13 10:01:09
    学习maven的时候需要对pom.xml文件有一定的了解,该文件总结了一下pom.xml文件的基本信息,仅供参考
  • 什么是pom文件_什么是POM?

    千次阅读 2020-07-30 05:46:51
    什么是pom文件 什么是POM? (What is POM?) The easiest way to describe a POM in a maven project is, it is nothing but the core element of any maven project. Basically any maven project consists of one ...

    什么是pom文件

    The easiest way to describe a POM in a maven project is, it is nothing but the core element of any maven project. Basically any maven project consists of one configurable file called pom.xml, which stands for the abbreviation Project Object Model. This pom.xml will always be located in the root directory of any maven project. This file represents the very basic and fundamental unit in maven.

    描述Maven项目中POM的最简单方法是,它不过是任何Maven项目的核心元素。 基本上,任何Maven项目都包含一个名为pom.xml的可配置文件,该文件代表缩写Project Object Model 。 此pom.xml将始终位于任何maven项目的根目录中。 该文件表示maven中非常基本的单元。

    The pom.xml basically contains the information related to the project which is built or to be built in. It contains all the necessary information about the configuration details, dependencies included and plug-ins included in the project. In simple, it contains the details of the build life cycle of a project.

    pom.xml基本上包含与已构建或将要构建的项目相关的信息。它包含有关配置详细信息,项目中包括的依赖项和插件的所有必要信息。 简单来说,它包含项目的构建生命周期的详细信息。

    Below are some of the configurations that can be handled in the pom.xml file :

    以下是pom.xml文件中可以处理的一些配置:

    • Dependencies used in the projects (Jar files)

      项目中使用的依赖项(Jar文件)

    • Plugins used (report plugin)

      使用的插件(报告插件)

    • Project version

      项目版本

    • Developers involved in the project

      参与项目的开发人员

    • Mailing list

      邮件列表

    • Reporting

      报告中

    • Build profiles

      构建配置文件

    样本Pom.xml文件 (Sample Pom.xml File)

    A typical pom.xml of simple java project will look like as shown in the below figure.

    简单Java项目的典型pom.xml如下图所示。

    Sample POM Xml file

    A pom.xml will always start with the root element called <project> under which all the other required configurations will be made. Developers should ensure to define the below list of elements which are known as maven co-ordinates before defining a pom.xml file:

    pom.xml始终以称为<project>的根元素开头,在该根元素下将进行所有其他所需的配置。 开发人员应确保在定义pom.xml文件之前定义以下称为maven坐标的元素的列表:

    1. groupId - as the name itself shows that this is an id which is unique for any project in an organization.

      groupId-顾名思义,这表示该ID对于组织中的任何项目都是唯一的。

    2. artifactId - Even though the name says as "id", this is basically defines the name of any project.

      artifactId-即使名称表示为“ id”,这基本上也定义了任何项目的名称。

    3. version - This element is used to derive the version of any project in order to classify the versions as and when the major changes/implementations are carried during the development phase of a project.

      版本 -此元素用于派生任何项目的版本,以便在项目的开发阶段进行主要更改/实施时以及对版本进行分类时使用。

    Whenever it comes for executing a task for a project, maven scans through the entries made in the pom. Xml file. This will enable the maven to read all the configurations made, build profiles defined, repositories configured and all other important details and then executes the task accordingly.

    每当执行项目任务时,maven都会扫描pom中输入的内容。 Xml文件。 这将使Maven能够读取所做的所有配置,定义的构建配置文件,配置的存储库以及所有其他重要细节,然后相应地执行任务。

    NOTE : Actually pom.xml was earlier used in the name of project.xml in maven 1. As the maven 2 version was introduced, this was renamed to pom.xml

    注意:实际上,在maven 1中以前以pom.xml的名义使用了project.xml。随着maven 2版本的引入,它被重命名为pom.xml。

    超级POM (Super POM)

    All the maven projects pom.xml files always extends the super pom.xml file. This super pom.xml basically defines a set of default configurations which is shared and used by all the maven projects. This super pom.xml is not required to be written by the developers. This will come as a default one with the maven installation.

    所有的Maven项目pom.xml文件始终会扩展super pom.xml文件。 这个超级pom.xml基本上定义了一组默认配置,这些配置由所有maven项目共享和使用。 此超级pom.xml不需要由开发人员编写。 这将默认安装在Maven中。

    A typical super pom.xml can be found in the attached file. Click on th link below to download.

    在附件中可以找到典型的super pom.xml。 点击下面的链接进行下载。

    Download Super POM Xml file

    下载Super POM Xml文件

    Maven的目标 (Goals in Maven)

    Goal in maven is nothing but a particular task which leads to the compiling, building and managing of a project. A goal in maven can be associated to zero or more build phases. Only thing that matters is the order of the goals defined for a given project in pom.xml. Because, the order of execution is completely dependent on the order of the goals defined.

    Maven中的目标不过是导致项目的编译,构建和管理的特定任务。 Maven中的目标可以与零个或多个构建阶段相关联。 唯一重要的是在pom.xml中为给定项目定义的目标的顺序。 因为,执行顺序完全取决于所定义目标的顺序。

    Download Maven Goals Xml file

    下载Maven Goals Xml文件

    翻译自: https://www.studytonight.com/maven/pom-in-maven

    什么是pom文件

    展开全文
  • Maven中pom文件详解

    千次阅读 2021-01-27 00:19:38
    在IDE中使用MavenIDE工具MyEclipse集成maven插件Eclipse​ Eclipse For Java EEIDEA集成Maven插件在IDE中配置Maven指定maven安装目录和配置文件自动更新maven项目:勾选import projects automatically (2020版本 :...

    在IDE中使用Maven

    IDE工具

    MyEclipse

    集成maven插件

    Eclipse

    ​ Eclipse For Java EE

    IDEA

    集成Maven插件

    在IDE中

    配置Maven

    指定maven安装目录和配置文件

    自动更新maven项目:勾选import projects automatically (2020版本 :Ctrl + Shift + O)

    创建Maven项目

    new Module——>Maven——>勾选Create from archetype

    执行maven操作

    Maven projects显示所有maven项目

    执行生命周期

    如果不想单独执行,就点击maven框里的Execute Maven Goal(在run maven的右边)

    也能自定义添加一个maven操作组合

    如果main文件下没有resources文件就创建一个,test文件下也是一样的

    目录的类型与更改类型

    在IDEA中目录是分类型的,常营的4中:

    Sources Root 主代码的目录:src/main/java

    Test Sources Root 测试代码的目录:src/test/java

    Resources Root 主代码所需资源的目录:src/main/resources

    Test Resources Root测试代码所需资源的目录:src/test/resources

    注:在IDEA中默认创建的目录都是普通的Directory,创建后需要设置目录的类型

    可以在文件右键 Mark Directory As中更改

    Maven中pom.xml文件详解

    简介

    pom:project object model项目对象模型

    pom.xml是Maven的核心配置文件

    一个Maven项目有且只有一个pom.xml文件,该文件必须在项目的跟目录下

    坐标

    什么是坐标

    用来唯一的标识每个项目,必须为项目定义坐标,坐标必须唯一

    目的是为了让其他的Maven项目可以使用该项目生成的jar包

    坐标详解

    Maven坐标是通过一些元素来定义:groupId(组织的ID)、artifactId、version

    groupId(组织的ID):表示当前模块所属于的项目

    artifactId:模块的ID

    version:当前的版本

    org.example

    maven-project

    1.0-SNAPSHOT

    dependency

    基本配置

    如何查找一个jar包的坐标

    查找mysql-connector

    UTF-8

    1.7

    1.7

    junit

    junit

    4.11

    test

    mysql

    mysql-connector-java

    8.0.22

    scope作用域

    表示依赖的作用域,用来配置依赖的jar包可使用的范围

    取值

    含义

    举例

    compile

    该依赖可以在整个项目中使用,参与打包部署,默认值

    commons-fileupload

    test

    该依赖只能在测试代码中使用,并且不参与打包部署的

    junit

    provided

    该依赖编写源代码时需要,不参与打包部署

    servlet-api、jsp-api

    runtime

    该依赖编写代码时不需要,运行时需要,参与打包部署

    mysql-connector

    system

    表示使用本地系统路径下的jar包,需要和一个systemPath一起使用

    ojdbc.jar

    使用本地jar包(放在自己创建的lib文件下,与src同级):

    mysql

    mysql-connector-java

    8.0.22

    ${basedir}/lib/mysql-connector-java-8.0.17.jar

    properties

    全局属性,一般情况下同于定义全局的jar包的版本

    作用:比如在properties中定义版本4.3.12

    那么在对于的依赖下添加${ljy.version}

    在properties中改了 后面对应的依赖版本也跟着改了(方便)

    在依赖的version中alt+ctrl+v(快速提取)

    如:

    UTF-8

    1.7

    1.7

    8.0.22

    mysql

    mysql-connector-java

    ${mysql-connector-java.version}

    repositories

    用来配置当前工程使用的远程仓库

    依赖查找的顺序:本地仓库——>当前工程pom.xml中配置的远程仓库——>setting.xml中配置的远程仓库

    spring为例:url 是spring官方地址

    spring_repo

    https://repo.spring.io/milestone/

    plugin(配置插件)

    配置插件,是一种工具

    格式:

    xxxx

    zzzz

    zzzz

    maven-clean-plugin

    3.1.0

    超级POM

    所有的pom.xml文件都继承了父POM,这个父POM称为超级POM(Super POM),你看不见也改不了,但是在myeclipse软件中能看见

    展开全文
  • pom文件导入maven依赖

    千次阅读 2021-11-22 16:20:54
    在使用IDEA过程中,有很多地方需要pom文件导入maven依赖,以给pom文件添加一个spark-core的依赖为例: 1.找并进入网站:Maven Repository: Search/Browse/Explore (mvnrepository.com) 2.在搜索框输入:spark-core...
  • pom文件详解

    万次阅读 2018-10-23 14:46:10
    pom文件详解 父级常用POM &lt;!-- 声明项目描述符遵循哪一个POM模型版本。模型本身的版本很少改变,虽然如此,但它仍然是必不可少的, 这是为了当Maven引入了新的特性或者其他模型变更的时候,确保稳定性。 --&...
  • 我相信依赖关系不是用maven构建的,只是上传了一个准系统POM文件.服务器上的布局看起来很好,所以它可能与maven一起部署.当maven将依赖项下载到我的本地存储库时,它会下载jar文件,但不会获得POM.在构建时,会发出警告,...
  • 关于pom文件的详细介绍,很实用

    千次阅读 2020-03-12 18:05:06
    POM(project object model)包含了工程信息和工程的配置细节,Maven使用POM文件来构建工程。POM文件包含了工程中的大部分默认值。举个例子,target是默认的构建目录,src/main/java是默认的源码目录,src/test/java是...
  • POM文件Unknown报错

    千次阅读 2019-10-17 10:55:40
    POM文件Unknown报错 Spring Boot2项目 - 2.1.8.RELEASE,POM文件Unknown报错,pom文件第一行出现小红叉 Problems: Description Resource Path Location Type Unknown pom.xml /ieda line 1 Maven Configuration ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 361,331
精华内容 144,532
关键字:

pom文件

友情链接: 程序.rar