zoukankan      html  css  js  c++  java
  • Apache Maven(三):POM

    什么是 POM?

    POM (Project Object Model) 项目对象模型。它是一个XML文件,其中包含有关Maven用于构建项目的项目和配置细节的信息。它包含大多数项目的默认值。例如,构建项目的目录:target;java源码文件目录: src/main/java;测试java源码文件目录: src/test/java;等等。当执行任务或目标时,Maven将在当前目录中查找POM,它读取POM。获取所需要的配置信息,然后执行目标。

    POM中可以指定项目的依赖,可以执行的插件或目标,构建配置文件等。其他信息,如项目版本,说明,开发人员,邮件列表等也可以指定。

    POM 结构

    这是直接在POM的项目元素下列出的元素。注意modelVersion为4.0.0这是目前唯一支持Maven 2和3的POM版本,并且是必需的。

     1 <project xmlns="http://maven.apache.org/POM/4.0.0"
     2   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     3   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
     4                       http://maven.apache.org/xsd/maven-4.0.0.xsd">
     5   <modelVersion>4.0.0</modelVersion>
     6  
     7   <!-- The Basics -->
     8   <groupId>...</groupId>
     9   <artifactId>...</artifactId>
    10   <version>...</version>
    11   <packaging>...</packaging>
    12   <dependencies>...</dependencies>
    13   <parent>...</parent>
    14   <dependencyManagement>...</dependencyManagement>
    15   <modules>...</modules>
    16   <properties>...</properties>
    17  
    18   <!-- Build Settings -->
    19   <build>...</build>
    20   <reporting>...</reporting>
    21  
    22   <!-- More Project Information -->
    23   <name>...</name>
    24   <description>...</description>
    25   <url>...</url>
    26   <inceptionYear>...</inceptionYear>
    27   <licenses>...</licenses>
    28   <organization>...</organization>
    29   <developers>...</developers>
    30   <contributors>...</contributors>
    31  
    32   <!-- Environment Settings -->
    33   <issueManagement>...</issueManagement>
    34   <ciManagement>...</ciManagement>
    35   <mailingLists>...</mailingLists>
    36   <scm>...</scm>
    37   <prerequisites>...</prerequisites>
    38   <repositories>...</repositories>
    39   <pluginRepositories>...</pluginRepositories>
    40   <distributionManagement>...</distributionManagement>
    41   <profiles>...</profiles>
    42 </project>

    Maven 坐标

    groupId:artifactId:version三个字段是Maven必不可少的字段,这三个字段的作用非常类似与一个地址和时间戳。这标志着存储库中特定位置,就像Maven项目的坐标系统一样。

    • groupId: 这是组织或则项目独一无二的ID值。
    • artifactId: 是项目的名称,把groupId进行却分开来。
    • version: 指项目的当前版本。
    • packaging: 如果没有指定默认是jar,我们可以设置为pom, jar, maven-plugin, ejb, war, ear, rar, par等,如果设置为war则会将项目最终打包成war包。
    • classifier: 你有时候会在项目中看到这个熟悉,这样项目显示为groupId:artifactId:packaging:classifier:version。

    Maven 依赖

    Maven的基石就是它的依赖列表,大多数项目都是依赖其它构建才能正常运行。如下是一个简单依赖。

     1 <project xmlns="http://maven.apache.org/POM/4.0.0"
     2   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     3   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
     4                       https://maven.apache.org/xsd/maven-4.0.0.xsd">
     5   ...
     6   <dependencies>
     7     <dependency>
     8       <groupId>junit</groupId>
     9       <artifactId>junit</artifactId>
    10       <version>4.0</version>
    11       <type>jar</type>
    12       <scope>test</scope>
    13       <optional>true</optional>
    14     </dependency>
    15     ...
    16   </dependencies>
    17   ...
    18 </project>
    • groupId、artifactId、version: 如上一节所述,这里可以计算出项目的坐标,并将其引入到项目依赖中。
    • classifier: 这是一个可选参数。
    • type: 依赖项目的包装类型,默认为jar。
    • scope: 该元素用来引入到当前项目的类路径(编译、测试或运行等),以及限制依赖的传递性。总共有如下五个范围:
      • compile:默认值,编译期。依赖项可以在所有类路径中使用,且会传递到子项目。
      • provided:只可以在编译和测试中使用,切不会传递给子项目。
      • runtiome:在项目测试和运行类路径中使用,不会在编译中使用。
      • test:只可以在测试中使用,不会传递子项目。
      • system:这个和provided非常类似,工件始终可以使用,并且不会存储库中查找。
    • systemPath:只有当scope为system时,需要指定JAR的绝对路径。
    • optional:可选元素,如果optional为true时,如果A依赖B,B依赖D,如果A没有显示的引入D,则A不会依赖D。

    exclusions可以显示的排出依赖项中传递的依赖项目。例如maven-embedder需要依赖maven-core,但我们不希望引入maven-core依赖项目,那么我们可以显示的排除这个项目。如下:

     1 <project xmlns="http://maven.apache.org/POM/4.0.0"
     2   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     3   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
     4                       https://maven.apache.org/xsd/maven-4.0.0.xsd">
     5   ...
     6   <dependencies>
     7     <dependency>
     8       <groupId>org.apache.maven</groupId>
     9       <artifactId>maven-embedder</artifactId>
    10       <version>2.0</version>
    11       <exclusions>
    12         <exclusion>
    13           <groupId>org.apache.maven</groupId>
    14           <artifactId>maven-core</artifactId>
    15         </exclusion>
    16       </exclusions>
    17     </dependency>
    18     ...
    19   </dependencies>
    20   ...
    21 </project>

    这样你的项目中不会有maven-core依赖项。

    Super POM

    Super POM 是Maven默认的POM,除非明确设置,否则所有的POM都会扩展Super POM,这意味着您为项目创建的POM继承Super POM。下面的代码是Maven 2.0.x 的 Super POM。

      1 <project>
      2   <modelVersion>4.0.0</modelVersion>
      3   <name>Maven Default Project</name>
      4  
      5   <repositories>
      6     <repository>
      7       <id>central</id>
      8       <name>Maven Repository Switchboard</name>
      9       <layout>default</layout>
     10       <url>http://repo1.maven.org/maven2</url>
     11       <snapshots>
     12         <enabled>false</enabled>
     13       </snapshots>
     14     </repository>
     15   </repositories>
     16  
     17   <pluginRepositories>
     18     <pluginRepository>
     19       <id>central</id>
     20       <name>Maven Plugin Repository</name>
     21       <url>http://repo1.maven.org/maven2</url>
     22       <layout>default</layout>
     23       <snapshots>
     24         <enabled>false</enabled>
     25       </snapshots>
     26       <releases>
     27         <updatePolicy>never</updatePolicy>
     28       </releases>
     29     </pluginRepository>
     30   </pluginRepositories>
     31  
     32   <build>
     33     <directory>target</directory>
     34     <outputDirectory>target/classes</outputDirectory>
     35     <finalName>${artifactId}-${version}</finalName>
     36     <testOutputDirectory>target/test-classes</testOutputDirectory>
     37     <sourceDirectory>src/main/java</sourceDirectory>
     38     <scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
     39     <testSourceDirectory>src/test/java</testSourceDirectory>
     40     <resources>
     41       <resource>
     42         <directory>src/main/resources</directory>
     43       </resource>
     44     </resources>
     45     <testResources>
     46       <testResource>
     47         <directory>src/test/resources</directory>
     48       </testResource>
     49     </testResources>
     50   </build>
     51  
     52   <reporting>
     53     <outputDirectory>target/site</outputDirectory>
     54   </reporting>
     55  
     56   <profiles>
     57     <profile>
     58       <id>release-profile</id>
     59  
     60       <activation>
     61         <property>
     62           <name>performRelease</name>
     63         </property>
     64       </activation>
     65  
     66       <build>
     67         <plugins>
     68           <plugin>
     69             <inherited>true</inherited>
     70             <groupId>org.apache.maven.plugins</groupId>
     71             <artifactId>maven-source-plugin</artifactId>
     72  
     73             <executions>
     74               <execution>
     75                 <id>attach-sources</id>
     76                 <goals>
     77                   <goal>jar</goal>
     78                 </goals>
     79               </execution>
     80             </executions>
     81           </plugin>
     82           <plugin>
     83             <inherited>true</inherited>
     84             <groupId>org.apache.maven.plugins</groupId>
     85             <artifactId>maven-javadoc-plugin</artifactId>
     86  
     87             <executions>
     88               <execution>
     89                 <id>attach-javadocs</id>
     90                 <goals>
     91                   <goal>jar</goal>
     92                 </goals>
     93               </execution>
     94             </executions>
     95           </plugin>
     96           <plugin>
     97             <inherited>true</inherited>
     98             <groupId>org.apache.maven.plugins</groupId>
     99             <artifactId>maven-deploy-plugin</artifactId>
    100  
    101             <configuration>
    102               <updateReleaseInfo>true</updateReleaseInfo>
    103             </configuration>
    104           </plugin>
    105         </plugins>
    106       </build>
    107     </profile>
    108   </profiles>
    109  
    110 </project>
    View Code

    下面是Maven 2.1.x 的Super POM

      1 <project>
      2   <modelVersion>4.0.0</modelVersion>
      3   <name>Maven Default Project</name>
      4  
      5   <repositories>
      6     <repository>
      7       <id>central</id>
      8       <name>Maven Repository Switchboard</name>
      9       <layout>default</layout>
     10       <url>http://repo1.maven.org/maven2</url>
     11       <snapshots>
     12         <enabled>false</enabled>
     13       </snapshots>
     14     </repository>
     15   </repositories>
     16  
     17   <pluginRepositories>
     18     <pluginRepository>
     19       <id>central</id>
     20       <name>Maven Plugin Repository</name>
     21       <url>http://repo1.maven.org/maven2</url>
     22       <layout>default</layout>
     23       <snapshots>
     24         <enabled>false</enabled>
     25       </snapshots>
     26       <releases>
     27         <updatePolicy>never</updatePolicy>
     28       </releases>
     29     </pluginRepository>
     30   </pluginRepositories>
     31  
     32   <build>
     33     <directory>${project.basedir}/target</directory>
     34     <outputDirectory>${project.build.directory}/classes</outputDirectory>
     35     <finalName>${project.artifactId}-${project.version}</finalName>
     36     <testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
     37     <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
     38     <!-- TODO: MNG-3731 maven-plugin-tools-api < 2.4.4 expect this to be relative... -->
     39     <scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
     40     <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
     41     <resources>
     42       <resource>
     43         <directory>${project.basedir}/src/main/resources</directory>
     44       </resource>
     45     </resources>
     46     <testResources>
     47       <testResource>
     48         <directory>${project.basedir}/src/test/resources</directory>
     49       </testResource>
     50     </testResources>
     51    <pluginManagement>
     52        <plugins>
     53          <plugin>
     54            <artifactId>maven-antrun-plugin</artifactId>
     55            <version>1.3</version>
     56          </plugin>       
     57          <plugin>
     58            <artifactId>maven-assembly-plugin</artifactId>
     59            <version>2.2-beta-2</version>
     60          </plugin>         
     61          <plugin>
     62            <artifactId>maven-clean-plugin</artifactId>
     63            <version>2.2</version>
     64          </plugin>
     65          <plugin>
     66            <artifactId>maven-compiler-plugin</artifactId>
     67            <version>2.0.2</version>
     68          </plugin>
     69          <plugin>
     70            <artifactId>maven-dependency-plugin</artifactId>
     71            <version>2.0</version>
     72          </plugin>
     73          <plugin>
     74            <artifactId>maven-deploy-plugin</artifactId>
     75            <version>2.4</version>
     76          </plugin>
     77          <plugin>
     78            <artifactId>maven-ear-plugin</artifactId>
     79            <version>2.3.1</version>
     80          </plugin>
     81          <plugin>
     82            <artifactId>maven-ejb-plugin</artifactId>
     83            <version>2.1</version>
     84          </plugin>
     85          <plugin>
     86            <artifactId>maven-install-plugin</artifactId>
     87            <version>2.2</version>
     88          </plugin>
     89          <plugin>
     90            <artifactId>maven-jar-plugin</artifactId>
     91            <version>2.2</version>
     92          </plugin>
     93          <plugin>
     94            <artifactId>maven-javadoc-plugin</artifactId>
     95            <version>2.5</version>
     96          </plugin>
     97          <plugin>
     98            <artifactId>maven-plugin-plugin</artifactId>
     99            <version>2.4.3</version>
    100          </plugin>
    101          <plugin>
    102            <artifactId>maven-rar-plugin</artifactId>
    103            <version>2.2</version>
    104          </plugin>        
    105          <plugin>                
    106            <artifactId>maven-release-plugin</artifactId>
    107            <version>2.0-beta-8</version>
    108          </plugin>
    109          <plugin>                
    110            <artifactId>maven-resources-plugin</artifactId>
    111            <version>2.3</version>
    112          </plugin>
    113          <plugin>
    114            <artifactId>maven-site-plugin</artifactId>
    115            <version>2.0-beta-7</version>
    116          </plugin>
    117          <plugin>
    118            <artifactId>maven-source-plugin</artifactId>
    119            <version>2.0.4</version>
    120          </plugin>         
    121          <plugin>
    122             <artifactId>maven-surefire-plugin</artifactId>
    123             <version>2.4.3</version>
    124          </plugin>
    125          <plugin>
    126            <artifactId>maven-war-plugin</artifactId>
    127            <version>2.1-alpha-2</version>
    128          </plugin>
    129        </plugins>
    130      </pluginManagement>
    131   </build>
    132  
    133   <reporting>
    134     <outputDirectory>${project.build.directory}/site</outputDirectory>
    135   </reporting>
    136   <profiles>
    137     <profile>
    138       <id>release-profile</id>
    139  
    140       <activation>
    141         <property>
    142           <name>performRelease</name>
    143           <value>true</value>
    144         </property>
    145       </activation>
    146  
    147       <build>
    148         <plugins>
    149           <plugin>
    150             <inherited>true</inherited>
    151             <groupId>org.apache.maven.plugins</groupId>
    152             <artifactId>maven-source-plugin</artifactId>
    153             <executions>
    154               <execution>
    155                 <id>attach-sources</id>
    156                 <goals>
    157                   <goal>jar</goal>
    158                 </goals>
    159               </execution>
    160             </executions>
    161           </plugin>
    162           <plugin>
    163             <inherited>true</inherited>
    164             <groupId>org.apache.maven.plugins</groupId>
    165             <artifactId>maven-javadoc-plugin</artifactId>
    166             <executions>
    167               <execution>
    168                 <id>attach-javadocs</id>
    169                 <goals>
    170                   <goal>jar</goal>
    171                 </goals>
    172               </execution>
    173             </executions>
    174           </plugin>
    175           <plugin>
    176             <inherited>true</inherited>
    177             <groupId>org.apache.maven.plugins</groupId>
    178             <artifactId>maven-deploy-plugin</artifactId>
    179             <configuration>
    180               <updateReleaseInfo>true</updateReleaseInfo>
    181             </configuration>
    182           </plugin>
    183         </plugins>
    184       </build>
    185     </profile>
    186   </profiles>
    187  
    188 </project>
    View Code

    最小的 POM

    POM最低要求如下:

    • project 根节点
    • modelVersion 需要设置为4.0.0
    • groupId 项目组的标识(建议使用网站的倒序)
    • artifactId 项目名称
    • version 项目的版本信息,这里提一下(SNAPSHOT 和 RELEASE),在项目中常常看到这两个单词。SNAPSHOT 代表不稳定版,常常属于开发中的项目,而RELEASE稳定版。

    下面是已个最小POM的简单例子:

    1 <project>
    2    <modelVersion>4.0.0</modelVersion>
    3    <groupId>com.cnblogs.hello</groupId>
    4    <artifactId>hello</artifactId>
    5    <version>1.0.SNAPSHOT</version>
    6 </project>

    POM要求配置groupId,artifactId 和 version,这三个值构成了项目完全限定的项目名称,就是<groupId>:<artifactId>:<version>,至于上面的例子,其完全限定的项目名称是"com.cnblogs.hello:hello:1.0.SNAPSHOP",其本地仓库对应的路径为:com/cnblogs/hello/hello/1.0.SNAPSHOT/hello-1.0.SNAPSHOT.jar

    另外,如果配置文件未指定详细信息,Maven将使用默认值。每个Maven项目都有一个packaging类型。如果没有在POM中指定,那么就会使用默认值“jar”。

    此外,正如你看到的,在最小POM中,repositories存储库也没有被指定,如果使用最小POM构建项目,它将继承Super POM中的repositories配置的存储库。

    继承

    项目继承会合并下列元素:

    • dependencies : 依赖
    • developers 和 contributors :  开发者和贡献者
    • plugin lists (including reports) : 插件列表(包括报表)
    • plugin executions with matching ids : 匹配ids的执行插件
    • plugin configuration : 插件配置
    • resources : 资源

    Super POM是项目继承的一个例子,但是您也可以通过在POM中指定父元素来引入您自己的父POM,如以下示例所示。

     1 <project>
     2   <parent>
     3     <groupId>com.cnblogs.hello</groupId>
     4     <artifactId>hello</artifactId>
     5     <version>1.0.SNAPSHOT</version>
     6   </parent>
     7   <modelVersion>4.0.0</modelVersion>
     8   <groupId>com.cnbligs.hello</groupId>
     9   <artifactId>app</artifactId>
    10   <version>1.0.SNAPSHOT</version>
    11 </project>

    上面示例是将最小POM指定为app的父POM。指定父POM我需要使用完全限定名指定(即需要使用groupId,artifactID 和 version),通过这个设置,我们的模块现在可以继承父POM的一些属性。

    或者,如果我们希望groupId 和 version 和父POM的保持一致,则可以将在POM删除groupId和version,如下所示:

    1 <project>
    2   <parent>
    3     <groupId>com.cnblogs.hello</groupId>
    4     <artifactId>hello</artifactId>
    5     <version>1.0.SNAPSHOT</version>
    6   </parent>
    7   <modelVersion>4.0.0</modelVersion>
    8   <artifactId>app</artifactId>
    9 </project>

    这里注意下parent中的relativePath,如果父POM不是在该POM的上一级目录,就必须配置这个属性并定位到父POM中。relativePath的默认值为../pom.xml

    聚合

    项目聚合跟项目继承有些类似,但不是从POM中指定父POM,而是从父POM中指定POM。通过这样做,父项目现在知道它所有的子项目,并且对父项目执行Maven命令,那么Maven命令也会执行到所有的子项目中。要做一个项目聚合,必须执行以下操作:

    • 改变父POM的packaging属性为pom。
    • 在父POM中指定子模块(子项目)。

    将如上两个POM做如下修改。

    com.cnblogs.hello:app:1.0.SNAPSHOT

    1 <project>
    2    <modelVersion>4.0.0</modelVersion>
    3    <groupId>com.cnbligs.hello</groupId>
    4    <artifactId>app</artifactId>
    5    <version>1.0.SNAPSHOT</version>
    6 </project>

    com.cnblogs.hello:hello:1.0.SNAPSHOT

     1 <project>
     2    <modelVersion>4.0.0</modelVersion>
     3    <groupId>com.cnblogs.hello</groupId>
     4    <artifactId>hello</artifactId>
     5    <version>1.0.SNAPSHOT</version>
     6    <!-- 指定为父POM,project 聚合的第一步 -->
     7    <packaging>pom</packaging>
     8 
     9    <!-- 添加子模块 根据POM的相对路径进行指定。 -->
    10    <modules>
    11        <module>../app</module>
    12    </modules>
    13 </project>

    现在,每当Maven命令处理hello项目时,通过的Maven命令也会针对app项目运行。

    继承 和 聚合

    如果你有多个Maven项目,并且他们都具有相似的配置,则可以通过抽出相似的配置并制作父项目来构建。因此,您所要做的就是让你的Maven项目继承该父项目,然后将这些配置应用与所有的这些项目。

    如果你有一组构建或一起处理的项目。你可以创建一个父项目并让该父项目将这些子项目声明进来。通过这样做,你只需要构建父项目,其余的也随之而来。

    当然,你也可以同时拥有继承和聚合。意思是说,你可以让你的模块指定一个父项目,同时让这个父项目指定这些Maven作为它的子模块。你只需要符合以下三条规则:

    • 在每一个子POM中指定他们的父POM是谁。
    • 在父POM中将packaging的值改为pom。
    • 在父POM中指定其所有的子项目模块(子POM)。

    参考一下代码示例:

    com.cnblogs.hello:app:1.0.SNAPSHOT

     1 <project>
     2    <modelVersion>4.0.0</modelVersion>
     3    <groupId>com.cnblogs.hello</groupId>
     4    <artifactId>hello</artifactId>
     5    <version>1.0.SNAPSHOT</version>
     6    <packaging>pom</packaging>
     7 
     8    <modules>
     9        <module>../app</module>
    10    </modules>
    11 </project>

    com.cnblogs.hello:app:1.0.SNAPSHOT

     1 <project>
     2    <parent>
     3      <groupId>com.cnblogs.hello</groupId>
     4      <artifactId>hello</artifactId>
     5      <version>1.0.SNAPSHOT</version>
     6      <relativePath>../pom.xml</relativePath>
     7    </parent>
     8    <modelVersion>4.0.0</modelVersion>
     9    <groupId>com.cnbligs.hello</groupId>
    10    <artifactId>app</artifactId>
    11    <version>1.0.SNAPSHOT</version>
    12 </project>

    变量

    在某些情况下,您需要在多个不同位置使用相同的值。为了帮助确保值仅指定一次,Maven允许您在POM中使用自己的和预定义的变量。例如如下示例:

    <!-- 首先在properties标签中自定义 project.version 属性 值为 1.0.SANPSHOT  在后续的代码中可以直接使用${project.version}获取值 -->
    <properties>
        <project.version>1.0.SNAPSHOT</project.version>
    </properties>
    
    <!-- version可以这样写 -->
    <version>${project.version}</version>

    其实properties标签不仅仅是只能声明版本号,凡是需要统一声明后再引用的场合都可以使用。

  • 相关阅读:
    Masonry介绍与使用实践:快速上手Autolayout
    OC文件大小的计算方法,多用于清理缓存
    OC接收数据时毫秒转date时间最简略方法
    使用OC语言编写两个超大数相乘或相加的算法的思路和超大正整数相乘的代码
    简述AFN(AFNetWorking 2.X)的实现分析和简单使用【转】
    iOS开发中xib和Storyboard中需要注意的事项
    如何将UISearchBar上"Cancel"按钮改为”取消“?
    iOS开发中关于本地数据中SQLite数据库常用的SQL语句
    UItableViewCell上的button点击无响应的办法
    UIScrollView的几个要点总结
  • 原文地址:https://www.cnblogs.com/peter1018/p/9204150.html
Copyright © 2011-2022 走看看