pom.xml详解

2017/09/26 13:20
阅读数 25

一、什么是POM

Project Object Model,项目对象模型。通过xml格式保存的pom.xml文件。作用类似ant的build.xml文件,功能更强大。该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。

一个完整的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>  
  <!– 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、maven的协作相关属性

<project xmlns="http://maven.apache.org/POM/4.0.0"  
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0  
                      http://maven.apache.org/maven-v4_0_0.xsd">  
  <modelVersion>4.0.0</modelVersion>  
  <groupId>org.codehaus.mojo</groupId>  
  <artifactId>my-project</artifactId>  
  <version>1.0</version>  
  <packaging>war</packaging>  
</project> 

 

  1. groupId : 组织标识,例如:org.codehaus.mojo,在M2_REPO目录下,将是: org/codehaus/mojo目录。
  2. artifactId : 项目名称,例如:my-project,在M2_REPO目录下,将是:org/codehaus/mojo/my-project目录。
  3. version : 版本号,例如:1.0,在M2_REPO目录下,将是:org/codehaus/mojo/my-project/1.0目录。
  4. packaging : 打包的格式,可以为:pom , jar , maven-plugin , ejb , war , ear , rar , par

2、POM之间的关系

主要用于POM文件的复用。

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

<dependencies>  
   <dependency>  
     <groupId>junit</groupId>  
     <artifactId>junit</artifactId>  
     <version>4.0</version>  
     <scope>test</scope>  
   </dependency>  
   …  
 </dependencies>  
  1. groupId , artifactId , version :
  2. scope : compile(default),provided,runtime,test,system
  3. exclusions

b)继承关系:继承其他pom.xml配置的机制。

比如父pom.xml:

<project>  
  [...]  
  <dependencies>  
    <dependency>  
      <groupId>junit</groupId>  
      <artifactId>junit</artifactId>  
      <version>4.4</version>  
      <scope>test</scope>  
    </dependency>  
  </dependencies>  
  [...]  
</project>  

在子pom.xml文件继承它的依赖(还可以继承其他的:developers and contributors、plugin lists、reports lists、plugin executions with matching ids、plugin configuration):

[...]  
<parent>  
<groupId>com.devzuz.mvnbook.proficio</groupId>  
  <artifactId>proficio</artifactId>  
  <version>1.0-SNAPSHOT</version>  
</parent>  
[...]  

在这种机制下,maven还提供了一个类似java.lang.Object的顶级父pom.xml文件:

<project>  
  <modelVersion>4.0.0</modelVersion>  
  <name>Maven Default Project</name>  
  <repositories>  
    <repository>  
      <id>central</id>  
      <name>Maven Repository Switchboard</name>  
      <layout>default</layout>  
      <url>http://repo1.maven.org/maven2</url>  
      <snapshots>  
        <enabled>false</enabled>  
      </snapshots>  
    </repository>  
  </repositories>  
  <pluginRepositories>  
    <pluginRepository>  
      <id>central</id>  
      <name>Maven Plugin Repository</name>  
      <url>http://repo1.maven.org/maven2</url>  
      <layout>default</layout>  
      <snapshots>  
        <enabled>false</enabled>  
      </snapshots>  
      <releases>  
        <updatePolicy>never</updatePolicy>  
      </releases>  
    </pluginRepository>  
  </pluginRepositories>  
  <build>  
    <directory>target</directory>  
    <outputDirectory>target/classes</outputDirectory>  
    <finalName>${project.artifactId}-${project.version}</finalName>  
    <testOutputDirectory>target/test-classes</testOutputDirectory>  
    <sourceDirectory>src/main/java</sourceDirectory>  
    <scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>  
    <testSourceDirectory>src/test/java</testSourceDirectory>  
    <resources>  
      <resource>  
        <directory>src/main/resources</directory>  
      </resource>  
    </resources>  
    <testResources>  
      <testResource>  
        <directory>src/test/resources</directory>  
      </testResource>  
    </testResources>  
    <pluginManagement>  
       <plugins>  
         <plugin>  
           <artifactId>maven-antrun-plugin</artifactId>  
           <version>1.1</version>  
         </plugin>        
         <plugin>  
           <artifactId>maven-assembly-plugin</artifactId>  
           <version>2.2-beta-2</version>  
         </plugin>  
         <plugin>  
           <artifactId>maven-clean-plugin</artifactId>  
           <version>2.2</version>  
         </plugin>  
         <plugin>  
           <artifactId>maven-compiler-plugin</artifactId>  
           <version>2.0.2</version>  
         </plugin>  
         <plugin>  
           <artifactId>maven-dependency-plugin</artifactId>  
           <version>2.0</version>  
         </plugin>  
         <plugin>  
           <artifactId>maven-deploy-plugin</artifactId>  
           <version>2.3</version>  
         </plugin>  
         <plugin>  
           <artifactId>maven-ear-plugin</artifactId>  
           <version>2.3.1</version>  
         </plugin>  
         <plugin>  
           <artifactId>maven-ejb-plugin</artifactId>  
           <version>2.1</version>  
         </plugin>  
         <plugin>  
           <artifactId>maven-install-plugin</artifactId>  
           <version>2.2</version>  
         </plugin>  
         <plugin>  
           <artifactId>maven-jar-plugin</artifactId>  
           <version>2.2</version>  
         </plugin>  
         <plugin>  
           <artifactId>maven-javadoc-plugin</artifactId>  
           <version>2.4</version>  
         </plugin>  
         <plugin>  
           <artifactId>maven-plugin-plugin</artifactId>  
           <version>2.4.1</version>  
         </plugin>  
         <plugin>  
           <artifactId>maven-rar-plugin</artifactId>  
           <version>2.2</version>  
         </plugin>  
         <plugin>                 
           <artifactId>maven-release-plugin</artifactId>  
           <version>2.0-beta-7</version>  
         </plugin>  
         <plugin>                 
           <artifactId>maven-resources-plugin</artifactId>  
           <version>2.2</version>  
         </plugin>  
         <plugin>  
           <artifactId>maven-site-plugin</artifactId>  
           <version>2.0-beta-6</version>  
         </plugin>  
         <plugin>  
           <artifactId>maven-source-plugin</artifactId>  
           <version>2.0.4</version>  
         </plugin>           
         <plugin>  
            <artifactId>maven-surefire-plugin</artifactId>  
            <version>2.4.2</version>  
         </plugin>  
         <plugin>  
           <artifactId>maven-war-plugin</artifactId>  
           <version>2.1-alpha-1</version>  
         </plugin>  
       </plugins>  
     </pluginManagement>  
  </build>  
  <reporting>  
    <outputDirectory>target/site</outputDirectory>  
  </reporting>  
  <profiles>  
    <profile>  
      <id>release-profile</id>  
      <activation>  
        <property>  
          <name>performRelease</name>  
          <value>true</value>  
        </property>  
      </activation>  
      <build>  
        <plugins>  
          <plugin>  
            <inherited>true</inherited>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-source-plugin</artifactId>  
            <executions>  
              <execution>  
                <id>attach-sources</id>  
                <goals>  
                  <goal>jar</goal>  
                </goals>  
              </execution>  
            </executions>  
          </plugin>  
          <plugin>  
            <inherited>true</inherited>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-javadoc-plugin</artifactId>  
            <executions>  
              <execution>  
                <id>attach-javadocs</id>  
                <goals>  
                  <goal>jar</goal>  
                </goals>  
              </execution>  
            </executions>  
          </plugin>  
          <plugin>  
            <inherited>true</inherited>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-deploy-plugin</artifactId>  
            <configuration>  
              <updateReleaseInfo>true</updateReleaseInfo>  
            </configuration>  
          </plugin>  
        </plugins>  
      </build>  
    </profile>  
  </profiles>  
</project>  

可以通过下面命令查看当前pom.xml受到超pom.xml文件的影响:
mvn help:effective-pom

c)聚合关系:用于将多个maven项目聚合为一个大的项目。

<project xmlns="http://maven.apache.org/POM/4.0.0"  
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0  
                      http://maven.apache.org/maven-v4_0_0.xsd">  
  <modelVersion>4.0.0</modelVersion>  
  <groupId>org.codehaus.mojo</groupId>  
  <artifactId>my-parent</artifactId>  
  <version>2.0</version>  
  <modules>  
    <module>my-project<module>  
  </modules>  
</project>  

 

3、属性

maven的属性,是值的占位符,类似EL,类似ant的属性,比如${X},可用于pom文件任何赋值的位置。有以下分类:

  1. env.X:操作系统环境变量,比如${env.PATH}
  2. project.x:pom文件中的属性,比如:<project><version>1.0</version></project>,引用方式:${project.version}
  3. settings.x:settings.xml文件中的属性,比如:<settings><offline>false</offline></settings>,引用方式:${settings.offline}
  4. Java System Properties:java.lang.System.getProperties()中的属性,比如java.home,引用方式:${java.home}
  5. 自定义:在pom文件中可以:<properties><installDir>c:/apps/cargo-installs</installDir></properties>,引用方式:${installDir}

4、构建设置

构建有两种build标签:

<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">  
  …  
  <!– "Project Build" contains more elements than just the BaseBuild set –>  
  <build>…</build>  
  <profiles>  
    <profile>  
      <!– "Profile Build" contains a subset of "Project Build"s elements –>  
      <build>…</build>  
    </profile>  
  </profiles>  
</project>  

build中的主要标签:Resources和Plugins。

Resources:用于排除或包含某些资源文件

<resources>  
  <resource>  
    <targetPath>META-INF/plexus</targetPath>  
    <filtering>false</filtering>  
    <directory>${basedir}/src/main/plexus</directory>  
    <includes>  
      <include>configuration.xml</include>  
    </includes>  
    <excludes>  
      <exclude>**/*.properties</exclude>  
    </excludes>  
  </resource>  
</resources>  

Plugins:设置构建的插件

<build>  
   …  
   <plugins>  
     <plugin>  
       <groupId>org.apache.maven.plugins</groupId>  
       <artifactId>maven-jar-plugin</artifactId>  
       <version>2.0</version>  
       <extensions>false</extensions>  
       <inherited>true</inherited>  
       <configuration>  
         <classifier>test</classifier>  
       </configuration>  
       <dependencies>…</dependencies>  
       <executions>…</executions>  
     </plugin>  

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部