Maven实战-2.pom.xml标签说明

前言

持续更新中…

pom.xml文件

1.

这是pom.xml的根元素,所有的标签都包含在之间。

2.

指定当前POM模型的版本,对于maven2和maven3来说,它只能是4.0.0

<modelVersion>4.0.0modelVersion>

3.,

这三个元素定义了一个项目或其他的jar、pom、war的基本坐标。

定义了项目属于哪个组,这个组往往和项目所在的组织或公司相关,例如在googlecode上建立一个项目myapp,那么就是com.googlecode.myapp。

定义了当前项目在组中的唯一ID,例如定义为hello-world。可以这么理解,如果是单项目,artifactId可以和groupId的最后部分相同,否则artifactId就是子模块的名字即可。

定义了项目的当前版本,例如1.0.0-SNAPSHOT。SNAPSHOT是快照的意思,后续会有说明。

4.

定义Maven的打包方式,默认是jar。

如果是聚合模式,最外层的pom文件中的的值必须是pom。

5.

帮助定义构建输出的一些附属构建。classifier是不能直接定义的。

Maven实战-2.pom.xml标签说明_第1张图片

6.

没有实际作用,只是可以起一个更友好的项目名称说明而已,不是必须的,但还是推荐为每个pom文件声明一个name。

7.

该元素下可以包含多个元素,来声明项目的依赖。

8.

8.1.

依赖的类型,对应项目坐标定义的packaging,默认情况大部分都不定义,也就是jar类型。

8.2.

Maven因为执行一系列编译、测试和部署运行等操作,在不同的操作下使用的classpath不同,依赖范围就是用来控制依赖与三种 classpath(编译classpath、测试classpath、运行classpath)的关系。

用来指定被依赖资源的依赖范围,可选配置有 compile、test、provided、runtime、system、import,若不指定则默认 compile。

  1. compile:编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven 依赖,对于编译、测试、运行三种classpath 都有效。
  2. test:测试依赖范围。使用此依赖范围的Maven依赖,只对于测试classpath有效,在编译主代码或者运行项目的使用时将无法使用此类依赖。典型的例子是JUnit,它只有在编译测试代码及运行测试的时候才需要。
  3. provided:已提供依赖范围。使用此依赖范围的Maven依赖,对于编译和测试classpath有效,但在运行时无效(对运行的classpath无效)。典型的例子是 servlet-api, 编译和测试项目的时候需要该依赖,但在运行项目的时候,由于容器已经提供,就不需要Maven重复地引人一遍。
  4. runtime:运行时依赖范围。使用此依赖范围的Maven依赖,对于测试和运行class-path有效,但在编译主代码时无效(对编译的classpath无效)。典型的例子是JDBC驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。
  5. system:系统依赖范围。该依赖与三种 classpath 的关系,和 provided 依赖范围完全一致。但是,system 范围的依赖不会从 maven 仓库下载,而是从本地文件系统获取,使用 system 范围的依赖时必须通过 元素显式地指定依赖文件的路径。由于此类依赖不是通过 Maven 仓库解析的,而且往往与本机系统绑定,可能造成构建(构建的产物有:classes和artifact)的不可移植,因此应该谨慎使用。
  6. import:导入依赖范围,该依赖范围不会对三种 classpath 产生影响,该依赖范围只能与 元素配合使用,其功能为将目标pom.xml 文件中元素 的配置导入合并到当前 pom.xml 文件的元素 中。 的用法参考这里

Maven实战-2.pom.xml标签说明_第2张图片

8.3.

标记依赖是否可选的。

例如项目A依赖于项目B,项目B依赖于项目X和项目Y,B对于X和Y的依赖都是可选的,此时X和Y的项目的就是true,X和Y不会对A有任何影响,只会对B产生影响(也就是A依赖于B,X和Y不会传递依赖给A,如果A需要用到X或Y,需要显示声明出来这个依赖X或Y)。

8.4.

用来排除传递性依赖。可以包含一个或者多个元素。

8.5.

声明此元素的时候只需要指定groupId和artifactId即可,不需要version,因为Maven解析后的依赖中,不可能存在groupId和artifactId相同而version不同的两个依赖。

<dependency>
   <groupId>org.springframework.bootgroupId>
   <artifactId>spring-boot-starter-jdbcartifactId>
   <exclusions>
       <exclusion>
           <artifactId>spring-boot-starter-loggingartifactId>
           <groupId>org.springframework.bootgroupId>
       exclusion>
   exclusions>
dependency>

9.

位置在下面,可包含多个

如果中配置的插件时Maven的官方插件,可以不写groupId,因为他们的统一groupId都是org.apache.maven.plugins,所以可以省略。

9.1.

配置插件的执行,下面可以包含多个,每个子元素用来配置一个执行任务,该配置中有id,phase,goals元素,分别表示任务ID,绑定到生命周期的哪个阶段,要执行的插件目标。

<plugin>
     <groupId>org.apache.maven.pluginsgroupId>
     <artifactId>maven-source-pluginartifactId>
     <executions>
         <execution>
         	 
             <id>attach-sourcesid>
             
             <phase>verifyphase>
             <goals>
             	 
                 <goal>jar-no-forkgoal>
             goals>
         execution>
     executions>
 plugin>

如上配置好之后,测试一下,执行mvn clean install(verify阶段在intall阶段之前执行),只截图相关部分,如下:
Maven实战-2.pom.xml标签说明_第3张图片
其实上面配置也可以取消verify,因为这个插件目标jar-no-fork默认配置到了生命周期package阶段,可以通过命令mvn help:describe查看,详细参考 Maven实战-1.maven命令。

9.2.

为Maven插件进行全局参数配置,例如

 <plugin>
    <groupId>org.apache.maven.pluginsgroupId>
    <artifactId>maven-compiler-pluginartifactId>
    <configuration>
    	
        <source>1.8source>
        <target>1.8target>
    configuration>
plugin>
<plugin>
    <groupId>org.apache.maven.pluginsgroupId>
    <artifactId>maven-surefire-pluginartifactId>
    <configuration>
        
        <skip>trueskip>
    configuration>
plugin>

如果是配置在插件目标任务下,表示为当前插件任务配置特定参数:
Maven实战-2.pom.xml标签说明_第4张图片

10.

之间可以来定义Maven属性,例如定义一些jar包依赖的统一version,使用的地方直接用${versionName}即可。

<properties>
	
	<java.version>1.8java.version>
properties>


<dependencies>
	<dependency>
		<groupId>...groupId>
		<artifactId>test1artifactId>
		<version>${java.version}version>
	dependency>
	<dependency>
		<groupId>...groupId>
		<artifactId>test2artifactId>
		<version>${java.version}version>
	dependency>
dependencies>

11.

在此元素下,可以声明一个或多个,表示远程仓库。

<repositories>
    <repository>
    	
        <id>jbossid>
        <name>JBoss Maven Repositoryname>
        
        <url>http://repository.jboss.com/maven2/url>
        
        <releases>
            <enabled>trueenabled>
        releases>
        
        <snapshots>
            <enabled>falseenabled>
        snapshots>
        <layout>defaultlayout>
    repository>
repositories>

注意,任何一个配置的远程仓库中,id必须是唯一的,尤其需要注意的是,Maven默认的远程仓库地址的id是central,如果其他仓库使用了此id,就会覆盖默认的远程仓库。

因为的配置,Maven只会从此远程仓库下载正式版本的构件,不会下载快照版本的。

对于的配置,除了,还包括另外两个子元素

  • updatePolicy:配置Maven从远程仓库检查更新的频率,默认的值是daily,表示Maven每天更新一次,其他可配置的值是:never(从不),always(每次构建都检查),interval:X(每隔X分钟检查一次)
  • checksumPolicy:配置Maven检查校验和文件的策略,当构件部署到Maven仓库时会同时部署对应的校验和文件,其他项目引用下载构件的时候,Maven会验证校验和文件,如果校验和验证失败,根据值进行操作,checksumPolicy的默认值是warn,Maven构建时会会输出警告信息,值是fail,Maven会让构建失败,值是ignore,使Maven完全忽略校验和错误。

如果配置的远程仓库需要用户名和密码,就需要在setting文件中进行认证信息的配置,参考Maven实战-3.setting.xml标签说明。

12.

将项目生成的构建部署到仓库中。

<distributionManagement>  
    <repository>  
        <id>nexus-releasesid>
        <name>releases repositoryname>  
        <url>http://172.17.103.59:8081/nexus/content/repositories/releasesurl>  
    repository>  
    <snapshotRepository>  
        <id>nexus-snapshotsid>
        <name>snapshots repositoryname>    
        <url>http://172.17.103.59:8081/nexus/content/repositories/snapshotsurl>  
    snapshotRepository>  
distributionManagement> 

如上,中包含 子元素,前者表示发布版本构件的仓库,后者表示快照版本构件的仓库。这两个元素下都需要id,name和url三个子元素,id为该远程仓库的唯一标识,name是为了阅读理解,关键的是url指向的仓库地址。

13.

下面可以有多个,每一个都表示插件远程仓库的配置。

注意:Maven会区别对待依赖的远程仓库和插件的远程仓库,当Maven需要的依赖在本地仓库不存在时,它会去所配置的远程仓库查找,而插件如果不存在本地仓库时,它就不回去远程仓库查询。

配置插件远程仓库如下:
Maven实战-2.pom.xml标签说明_第5张图片
如上,插件远程仓库的配置,除了不同之外,里面的其他元素和依赖的远程仓库配置一样。这里的配置关闭了快照版本的支持。

一般来说中央仓库包含的插件满足日常需求了,因此也不需要配置插件远程仓库。只有中央仓库不存在或自己编写了插件,才考虑上面的配置。

14.

开启资源过滤。

15.

聚合的最核心配置之一(另一个是值必须为pom),中可以声明任意个来实现模块的聚合。这里配置的每个的值都是当前POM文件的相对目录。
Maven实战-2.pom.xml标签说明_第6张图片
如果是聚合的父子目录结构,最外层POM文件中的如下

<modules>
	<module>account-emailmodule>
	<module>account-persistmodule>
modules>

如果是平行目录结构,如下

<modules>
	<module>../account-emailmodule>
	<module>../account-persistmodule>
modules>

16.

声明父模块,下的groupId,artifactId和version制定了父模块的坐标,这三个元素是必须的。

16.1.

表示父模块POM文件的相对路径。默认值是…/pom.xml,也就是说Maven默认父POM在上一层目录中。

17.

项目的描述信息

18.


在此元素下声明的依赖(),自己和继承的子模块都不会引入实际的依赖,但是子模块会继承这段配置

子模块需要哪个依赖,只需要在自己的POM中,下声明groupId和artifactId即可(需要和父POM中的一致),无需声明version和scope,因为它都从配置中得到(上面加粗的那段话)。

如果子模块不声明依赖的使用,虽然父模块中定义了,但不会对子模块产生任何实际影响。

如果子模块中定义了和父POM中相同的groupId和artifactId,并且!又定义了version,那么就会覆盖父POM的version使用自己定义的!!!

19.

类似元素帮助管理依赖,Maven也提供了元素帮助管理插件。

的生效方式和一样。(子模块中定义相同groupId和artifactId)

你可能感兴趣的:(Maven,maven,xml,junit)