Maven pom.xml 文件解析

本文详细介绍了Maven项目的核心配置文件pom.xml的各个组成部分及其作用,包括模型版本、项目坐标、依赖管理、构建配置等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pom.xml ,maven的核心配置文件,Project Object Model(项目对象模型),用于描述整个maven项目,也称为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/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>
  <groupId>com.nzs</groupId>
  <artifactId>nzs</artifactId>
  <packaging>war</packaging>
  <version>1.0</version>
  <build/>
</project>

以上为maven 的基础配置:

1.modelVersion
指定当前Maven模型的版本号,对于Maven2和Maven3而言只能为4.0.0 或之上。
2.groupId
公司或组织名,并且配置时生成路径也由此生成。
3.artifactId
maven 构建的项目名
4.packing
项目打包的类型,可以是jar、war、rar、ear、pom,默认为jar
5.version
版本号

其中groupId、artifactId、version、packaging这四项组成项目唯一坐标,一般情况下,前三项就可以组成项目的唯一坐标。另外

  <name>...</name>
  <description>...</description>
  <url>...</url>
  <inceptionYear>...</inceptionYear>
  <licenses>...</licenses>
  <organization>...</organization>
  <developers>...</developers>
  <contributors>...</contributors>

是一些有关项目更详尽的描述,可选填。

  • dependencies 和dependency
    前者包含后者,Maven的一个重要作用就是统一管理jar包。项目依赖的一些jar包,在Maven中被称为dependency.
    Maven 工程首先会从本地仓库中获取jar包,当无法获取jar包时,本地仓库会从远程仓库(中央仓库)中下载jar包,并放入本地仓库以备使用。
<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.0</version>
      <type>jar</type>
      <scope>test</scope>
      <optional>true</optional>
    </dependency>
    <dependency>
            <groupId>com.aliyun.mns</groupId>
            <artifactId>aliyun-sdk-mns</artifactId>
            <version>1.1.8</version>
            <!--<classifier>jar-with-dependencies</classifier>-->
        </dependency>
    <dependency>
        <groupId>com.alibaba.china.shared</groupId>
        <artifactId>alibaba.apollo.webx</artifactId>
        <version>2.5.0</version>
        <exclusions>
          <exclusion>
            <artifactId>org.slf4j.slf4j-api</artifactId>
            <groupId>com.alibaba.external</groupId>
          </exclusion>
          ....
        </exclusions>
......
</dependencies>

type:默认为jar,常见类型为:jar、ejb-client、test-jar…可设置plugins 中的值为true后再增加新的类型。
scope:用来指定当前包的依赖范围。compile(default),provided,runtime,test,system
optional:设置依赖是否可选,默认为false,即子项目默认都继承;为true则子项目必须显式地引入,与dependencyManagement里定义的依赖类似。
exclusions:如果x需要A,A包含B依赖,则x可以声明不要B依赖,只要在exclusions中声明exclusion.
exclusion:将依赖从依赖树中删除,如上,alibaba.apollo.webx不想使用com.alibaba.external,需要将它排除。
classifier:分类器。同样的代码可以使用分类器生成不同的jar构件。他们具有不同的groupId:artifactId:version 组合。一般会生成名为artifactId-version-classifier的jar包。在实际环境中,可以为不同的编译环境,不同目标平台使用不同分类。分类器常用于打包构件的源码,JavaDoc或者二进制集合。

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring.version>4.1.2.RELEASE</spring.version>
        <motan.version>0.2.2</motan.version>
    </properties>

properties 用来定义一些配置属性,如project.build.sourceEncoding(项目构建源码编码方式)可设置为UTF-8,防止中文乱码,也可定义相关构件版本号,以便日后统一升级。如上定义了spring.version,在dependency中就可以这样使用:

 <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>${spring.version}</version>
        </dependency>
        .....

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

1.env.x:操作系统环境变量,如${env.PATH}
2.project.x:pom 文件中的属性如《project>《version>1.0《/version><\project>,引用方式${project.version}
3.setting.x :setting.xml中的属性,
4.Java System Properties:java.lang.System.getProperties()中的属性,如java.home,引用方式${java.home}
5.自定义:如上面的spring.version

 <!--构建-->
    <build>
         <!--<defaultGoal>install</defaultGoal>-->
        <!--<directory>${basedir}/target</directory>-->
        <!--<finalName>${artifactId}-${version}</finalName>-->
        <!--<filters>-->
            <!--<filter>filters/filter1.properties</filter>-->
        <!--</filters>-->

        <finalName>nzs</finalName>
        <resources>
            <resource>
                <directory>${basedir}/src/main/resources</directory>
                <includes>
                    <include>**/*</include>
                </includes>
            </resource>
            <!--设置自动替换-->
            <resource>
                <directory>${basedir}/src/main/resources</directory>
                <includes>
                    <include>jdbc.properties</include>
                    <include>nzs.properties</include>
                </includes>
                <!--也可以用排除标签-->
                <!--<excludes></excludes>-->
                <!--开启过滤-->
                <filtering>true</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
      <!-- 处理资源文件,实现针对不同环境传入不同属性值,以便更灵活地构建 -->          <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <configuration>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
     <!-- 编译插件 -->           <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                     <!--源代码编译版本-->
                    <source>1.8</source>
                    <!--目标平台编译版本-->
                    <target>1.8</target>

                </configuration>
            </plugin>
            <plugin>
     <!--生成source源代码包,提供项目自动将源代码打包并发布的功能-->           <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <version>2.2.1</version>
                <configuration>
                    <attach>true</attach>
                </configuration>
                <executions>
                    <execution>
                        <phase>compile</phase>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
        <!--帮助分析项目依赖-->        <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
            </plugin>
            <plugin>
  <!--Maven 2/3测试插件,跳过测试用例插件-->              <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.15</version>
                <configuration>
                    <skip>true</skip>
                    <testFailureIgnore>true</testFailureIgnore>
                </configuration>
            </plugin>
            <plugin>
 <!--单元测试整体覆盖率以及分支覆盖率统计插件-->               <groupId>org.codehaus.mojo</groupId>
                <artifactId>cobertura-maven-plugin</artifactId>
                <version>2.5.2</version>
                <configuration>
                    <instrumentation>
                        <ignores>
                            <ignore>com.example.boringcode.*</ignore>
                        </ignores>
                        <excludes>
                            <exclude>**/*Test.class</exclude>
                        </excludes>
                    </instrumentation>
                    <check/>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>clean</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
     <!--自动化项目版本发布-->           <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-release-plugin</artifactId>
                <version>2.4.1</version>
            </plugin>
            <plugin>
  <!--代码格式检查-->              <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-checkstyle-plugin</artifactId>
                <version>2.10</version>
            </plugin>

            <plugin>
      <!--发布插件-->
                               <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-deploy-plugin</artifactId>
                <version>2.7</version>
            </plugin>
        </plugins>
    </build>

build 表示与构建相关配置

首先解释一下Maven项目的目录结构
1.main目录下是项目的主要代码,test目录下存放测试相关代码
2.编译输出后的代码会放在target目录下
3.src/main/java 下存放Java代码,src/main/resources下存放配置文件
4.webapp下存放web 应用相关代码
5.pom.xml Maven 项目的配置文件

下面是build中的解释。
1.defaultGoal:执行build任务时,如果没有指定目标则使用该默认值。如上:在命令行执行mvn,则相当于执行 mvn install
2.directory:build目标文件的存放目录,默认${basedir}/target
3.finalName:build目标文件的文件名,默认${artifactId}-${version}
4.filter:定义properties 文件,包含一个properties列表,该类表会应用到支持filter 的resources中。定义在filterz中的”name=value”的会在build时替换并应用到resources中。Maven的默认filter文件夹是${basedir}/src/main/filters/.

resources 的一些配置
1.resources:resource元素列表
2.targetPath:指定build后的resource存放的文件夹,通常默认为basedir。一般被打包在jar中的resources的目标路径为META-INF
3.filtering:true/false:自动替换是否激活
4.directory:定义resource所在文件夹,默认${basedir}/src/main/resources
5.includes:指定包含文件的patterns,符合样式且在directory 目录下的文件将会包含进project的资源文件
6.excludes:指定哪些文件被忽略,如果一个文件同时符合includes和excludes,则exludes生效
7.testResources:定义和resource类似,但只在test时使用,默认的test resource 文件夹路径是${basedir}/src/test/resources,test resource 不被部署。

plugin的一些属性:
除了groupId、artifactId、version标准坐标,plugin 还需要如下属性:
1.extensions:true/false,是否加载plugin的extensions.默认为false
2.inherited:true/false.这个plugin是否应用到该pom的子POM,默认为true.
3.configuration:配置该plugin期望得到的properies.如上面的例子。
一些常用插件的用途见这里

 <!--编译的配置文件-->
    <profiles>
        <profile>
            <id>product</id>
            <build>
                <filters>
                    <filter>${basedir}/src/main/filters/jdbc-product.properties</filter>
                    <filter>${basedir}/src/main/filters/nzs-product.properties</filter>
                </filters>
            </build>
        </profile>
        <profile>
            <id>test</id>
            <build>
                <filters>
                    <filter>${basedir}/src/main/filters/jdbc-test.properties</filter>
                    <filter>${basedir}/src/main/filters/nzs-test.properties</filter>
                </filters>
            </build>
        </profile>
        <profile>
            <id>dev</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <build>
                <filters>
                    <filter>${basedir}/src/main/filters/jdbc-test.properties</filter>
                    <filter>${basedir}/src/main/filters/nzs-test.properties</filter>
                </filters>
            </build>
        </profile>
    </profiles>

profiles:pom4.0 的新特性,可以根据environment来修改设置,可填写内容如下:

<profiles> 
    <profile> 
      <id>test</id> 
      <activation>...</activation> 
      <build>...</build> 
      <modules>...</modules> 
      <repositories>...</repositories> 
      <pluginRepositories>...</pluginRepositories> 
      <dependencies>...</dependencies> 
      <reporting>...</reporting> 
      <dependencyManagement>...</dependencyManagement> 
      <distributionManagement>...</distributionManagement> 
    </profile> 
  </profiles> 

activation 当前profile 被激活的环境条件,给出任何一个条件即可激活。如下:

<profiles>
    <profile>
      <id>test</id>
      <activation>
        <activeByDefault>false</activeByDefault>
        <jdk>1.5</jdk>
        <os>
          <name>Windows XP</name>
          <family>Windows</family>
          <arch>x86</arch>
          <version>5.1.2600</version>
        </os>
        <property>
          <name>sparrow-type</name>
          <value>African</value>
        </property>
        <file>
          <exists>${basedir}/file2.properties</exists>
          <missing>${basedir}/file1.properties</missing>
        </file>
      </activation>
      ...
    </profile>
  </profiles>
</project>

激活profile的方法有多个:
1.setting.xml 的activeProfile 元素明确指定激活的profile的ID
2.命令行:-P flag 参数
查看某个build 会激活的profile 列表可以用:mvn help:active-profiles

 <!--远程仓库-->
    <repositories>
        <repository>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
            <id>central</id>
            <name>bintray</name>
            <url>http://jcenter.bintray.com</url>
        </repository>
    </repositories>

repositories 配置远程仓库。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值