浅谈maven
最近入职了,在各个大牛微博看了些maven的知识点,总结了一下,如有错误请各位指出,我会第一时间改正。谢谢大家提出宝贵意见。
一、maven介绍
maven是一个跨平台的项目管理的工具。隶属于Apache下的一个开源项目。主要服务于Java平台的项目构建、依赖管理、项目信息管理等。
apache maven是一个软件项目管理和理解工具。基于项目对象模型(pom)的概念,maven可以从中心信息管理项目的构建、报告和文档。
在不用Maven的时候学习,往往会看到一个名为/lib的子目录,那里存放着各类第三方依赖jar文件,如log4j.jar,junit.jar等等。每建立一个项目,你都需要建立这样的一个/lib目录,然后复制一对jar文件,这是很明显的重复。重复永远是噩梦的起点,多个项目不共用相同的jar文件,不仅会造成磁盘资源的浪费,也使得版本的一致性管理变得困难。此外,如果你使用版本管理工具,如SVN,你需要将大量的jar文件提交到代码库里,可是版本管理工具在处理二进制文件方面并不出色。
Maven仓库就是放置所有JAR文件(WAR,ZIP,POM等等)的地方,所有Maven项目可以从同一个Maven仓库中获取自己所需要的依赖JAR,这节省了磁盘资源。此外,由于Maven仓库中所有的JAR都有其自己的坐标,该坐标告诉Maven它的组ID,构件ID,版本,打包方式等等,因此Maven项目可以方便的进行依赖版本管理。你也不在需要提交JAR文件到SCM仓库中,你可以建立一个组织层次的Maven仓库,供所有成员使用。
简言之,Maven仓库能帮助我们管理构件(主要是JAR)还有一点需要理解的是,当我们运行install的时候,Maven实际上是将项目生成的构件安装到了本地仓库,也就是说,只有install了之后,其它项目才能使用此项目生成的构件。
下面来讲讲maven的安装方式
二、maven的安装
1.需要准备的东西
(1) JDK
(2) Eclipse/intellij idea
(3) Maven程序包
2.下载与安装
(1)前往https://maven.apache.org/download.cgi下载最新版的Maven程序:
Binary tar.gz archive-------适用于Linux、MacOsX系统的二进制安装工具。
Binary zip archive-------适用于Windows系统的二进制安装工具。
Source tar.gz archive -------Linux系统下的源码
Source zip archive-------Windows系统下的源码
source表示可以查看源代码的,比binary大一些,如果你想看一下maven的源码可以下载这一类的 .
binary表示编译后的二进制文件,一般比较小,适合直接在项目中使用
(2)将文件解压到F:\apache-maven-3.6.2目录下:
(3)新建环境变量MAVEN_HOME,赋值F:\apache-maven-3.6.(开发中环境变量可以不配置在开发工具中集成)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190915052839490.png
(4)编辑环境变量Path,追加%MAVEN_HOME%\bin;
(5)至此,maven已经完成了安装,我们可以通过DOS命令检查一下我们是否安装成功:
3.配置Maven本地仓库
(1)在F:\目录下新建maven-repository文件夹,该目录用作maven的本地库。
(2)打开F:\apache-maven-3.6.2\conf\settings.xml文件,查找下面这行代码:
<localRepository>/path/to/local/repo</localRepository>
localRepository节点默认是被注释掉的,需要把它移到注释之外,然后将localRepository节点的值改为我们在3.1中创建的目录F:\maven-repository
(3)localRepository节点用于配置本地仓库,本地仓库其实起到了一个缓存的作用,它的默认地址是 C:\Users\用户名.m2。
当我们从maven中获取jar包的时候,maven首先会在本地仓库中查找,如果本地仓库有则返回;如果没有则从远程仓库中获取包,并在本地库中保存。
此外,我们在maven项目中运行mvn install,项目将会自动打包并安装到本地仓库中。
(4)运行一下DOS命令
mvn help:system
如果前面的配置成功,那么maven-repository会出现一些文件。
三、Intellij idea中的maven配置
1、maven配置
首先需要在idea中对maven进行集成,目录为File>Setting>Build、Execution、Deployment>Build Tools>maven,若打开idea之前已经安装了maven,则idea会自动发现maven并进行关联,如下图:
并且需要注意maven的选相关配置:
Maven home directory:maven的安装目录
setting.xml:若项目中使用的maven私服则需要进行配置
maven respository:经常需要关注的maven仓库地址
2、import配置
maven下的import使用中经常需要关注的地方,目录File>Setting>Build、Execution、Deployment>Build Tools>maven>import,如下图:
import Maven project automatically:自动监控pom.xml的改动,并且进行导入maven依赖
Dependency Type:依赖类型
Automatically down(Sources、Documentation):是否自动下载源码和java doc文档(与eclipse中一致),我一般会进行勾选,这样查看源码非常方便
vm和jdk设置:需要时候可以进行设置
四、maven中的settings.xml和pom.xml文件
1、settings.xml文件是干什么的,为什么要配置它呢?
从settings.xml的文件名就可以看出,它是用来设置maven参数的配置文件。并且,settings.xml是maven的全局配置文件。而pom.xml文件是所在项目的局部配置。
Settings.xml中包含类似本地仓储位置、修改远程仓储服务器、认证信息等配置
(1)配置优先级
需要注意的是:局部配置优先于全局配置。
配置优先级从高到低:pom.xml> user settings > global settings
如果这些文件同时存在,在应用配置时,会合并它们的内容,如果有重复的配置,优先级高的配置会覆盖优先级低的。
(2)settings.xml元素详解顶级元素概览
<!-- 声明用的xml版本是1.0,声明用xml传输数据的时候的字符编码,假如文档里面有中文,编码方式不是UTF-8,传输过去再解码的话中文就会是乱码。--> <?xml version="1.0" encoding="UTF-8"?>
<!-- xmlns其实是XML Namespace的缩写 为前缀赋予了一个与某个命名空间相关联的限定名称。此时再把它们放在一起,XML解析器就不会报错了。xmlns:xsi表示使用xsi作为前缀的Namespace,当然前缀xsi需要在文档中声明。 xsi:schemaLocation属性其实是Namespace为http://www.w3.org/2001/XMLSchema-instance里的schemaLocation属性,正是因为我们一开始声明了。-->
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>E:\maven-repository</localRepository>
<interactiveMode>true</interactiveMode>
<usePluginRegistry>false</usePluginRegistry>
<offline>false</offline>
<pluginGroups/>
<proxies/>
<servers/>
<mirrors/>
<profiles/>
<activeProfiles/>
</settings>
LocalRepository
作用:该值表示构建系统本地仓库的路径。
<!-- 本地仓库地址,默认情况下,下载到本地的代码库存放在${user.home}/.m2/repository文件夹中的,用户如果想存在放其他地方,配置该属性即可,这里是放在了F:\maven-repository目录下 -->
<localRepository>F:\maven-repository</localRepository>
InteractiveMode
作用:表示maven是否需要和用户交互以获得输入。
如果maven需要和用户交互以获得输入,则设置成true,反之则应为false。默认为true。
<!--Maven是否需要和用户交互以获得输入。如果Maven需要和用户交互以获得输入,则设置成true,反之则应为false。默认为true。-->
<interactiveMode>true</interactiveMode>
usePluginRegistry
作用:maven是否需要使用plugin-registry.xml文件来管理插件版本。
如果需要让maven使用文件~/.m2/plugin-registry.xml来管理插件版本,则设为true。默认为false。
<!--Maven是否需要使用plugin-registry.xml文件来管理插件版本。如果需要让Maven使用文件${user.home}/.m2/plugin-registry.xml来管理插件版本,则设为true。默认为false。-->
<usePluginRegistry>false</usePluginRegistry>
Offline
作用:表示maven是否需要在离线模式下运行。
如果构建系统需要在离线模式下运行,则为true,默认为false。
当由于网络设置原因或者安全因素,构建服务器不能连接远程仓库的时候,该配置就十分有用。
<!--表示Maven是否需要在离线模式下运行。如果构建系统需要在离线模式下运行,则为true,默认为false。当由于网络设置原因或者安全因素,构建服务器不能连接远程仓库的时候,该配置就十分有用。 -->
<offline>false</offline>
PluginGroups
作用:当插件的组织id(groupId)没有显式提供时,供搜寻插件组织Id(groupId)的列表。该元素包含一个pluginGroup元素列表,每个子元素包含了一个组织Id(groupId)。当我们使用某个插件,并且没有在命令行为其提供组织Id(groupId)的时候,Maven就会使用该列表。默认情况下该列表包含了org.apache.maven.plugins和org.codehaus.mojo。
<!--当插件的组织Id(groupId)没有显式提供时,供搜寻插件组织Id(groupId)的列表。该元素包含一个pluginGroup元素列表,每个子元素包含了一个组织Id(groupId)。当我们使用某个插件,并且没有在命令行为其提供组织Id(groupId)的时候,Maven就会使用该列表。默认情况下该列表包含了org.apache.maven.plugins和org.codehaus.mojo -->
<pluginGroups>
<!--plugin的组织Id(groupId) -->
<pluginGroup>org.codehaus.mojo</pluginGroup>
</pluginGroups>
servers
作用:一般,仓库的下载和部署是在pom.xml文件中的repositories和distributionManagement元素中定义的。然而,一般类似用户名、密码(有些仓库访问是需要安全认证的)等信息不应该在pom.xml文件中配置,这些信息可以配置在settings.xml中。
<!--配置服务端的一些设置。一些设置如安全证书不应该和pom.xml一起分发。这种类型的信息应该存在于构建服务器上的settings.xml文件中。 -->
<servers>
<!--服务器元素包含配置服务器时需要的信息 -->
<server>
<!--这是server的id(注意不是用户登陆的id),该id与distributionManagement中repository元素的id相匹配。 -->
<id>server001</id>
<!--鉴权用户名。鉴权用户名和鉴权密码表示服务器认证所需要的登录名和密码。 -->
<username>my_login</username>
<!--鉴权密码 。鉴权用户名和鉴权密码表示服务器认证所需要的登录名和密码。密码加密功能已被添加到2.1.0 +。详情请访问密码加密页面 -->
<password>my_password</password>
<!--鉴权时使用的私钥位置。和前两个元素类似,私钥位置和私钥密码指定了一个私钥的路径(默认是 ${user.home}/.ssh/id_dsa)以及如果需要的话,一个密语。将来passphrase和password元素可能会被提取到外部,但目前 它们必须在settings.xml文件以纯文本的形式声明。 -->
<privateKey>${usr.home}/.ssh/id_dsa</privateKey>
<!--鉴权时使用的私钥密码。 -->
<passphrase>some_passphrase</passphrase>
<!--文件被创建时的权限。如果在部署的时候会创建一个仓库文件或者目录,这时候就可以使用权限(permission)。这两个元素合法的值是一个三位数字,其对应了unix文件系统的权限,如664,或者775。 -->
<filePermissions>664</filePermissions>
<!--目录被创建时的权限。 -->
<directoryPermissions>775</directoryPermissions>
</server>
</servers>
mirrors
作用:为仓库列表配置的下载镜像列表。
<mirrors>
<!-- 给定仓库的下载镜像。 -->
<mirror>
<!-- 该镜像的唯一标识符。id用来区分不同的mirror元素。 -->
<id>planetmirror.com</id>
<!-- 镜像名称 -->
<name>PlanetMirror Australia</name>
<!-- 该镜像的URL。构建系统会优先考虑使用该URL,而非使用默认的服务器URL。 -->
<url>http://downloads.planetmirror.com/pub/maven2</url>
<!-- 被镜像的服务器的id。例如,如果我们要设置了一个Maven中央仓库(http://repo.maven.apache.org/maven2/)的镜像,就需要将该元素设置成central。这必须和中央仓库的id central完全一致。 -->
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
proxies
作用:用来配置不同的代理。
<proxies>
<!--代理元素包含配置代理时需要的信息 -->
<proxy>
<!--代理的唯一定义符,用来区分不同的代理元素。 -->
<id>myproxy</id>
<!--该代理是否是激活的那个。true则激活代理。当我们声明了一组代理,而某个时候只需要激活一个代理的时候,该元素就可以派上用处。 -->
<active>true</active>
<!--代理的协议。 协议://主机名:端口,分隔成离散的元素以方便配置。 -->
<protocol>http</protocol>
<!--代理的主机名。协议://主机名:端口,分隔成离散的元素以方便配置。 -->
<host>proxy.somewhere.com</host>
<!--代理的端口。协议://主机名:端口,分隔成离散的元素以方便配置。 -->
<port>8080</port>
<!--代理的用户名,用户名和密码表示代理服务器认证的登录名和密码。 -->
<username>proxyuser</username>
<!--代理的密码,用户名和密码表示代理服务器认证的登录名和密码。 -->
<password>somepassword</password>
<!--不该被代理的主机名列表。该列表的分隔符由代理服务器指定;例子中使用了竖线分隔符,使用逗号分隔也很常见。 -->
<nonProxyHosts>*.google.com|ibiblio.org</nonProxyHosts>
</proxy>
</proxies>
profiles
作用:根据环境参数来调整构建配置的列表。
settings.xml中的profile元素是pom.xml中profile元素的裁剪版本。
它包含了id、activation、repositories、pluginRepositories和 properties元素。这里的profile元素只包含这五个子元素是因为这里只关心构建系统这个整体(这正是settings.xml文件的角色定位),而非单独的项目对象模型设置。如果一个settings.xml中的profile被激活,它的值会覆盖任何其它定义在pom.xml中带有相同id的profile。
<profiles>
<profile>
<!-- profile的唯一标识 -->
<id>test</id>
<!-- 自动触发profile的条件逻辑 -->
<activation />
<!-- 扩展属性列表 -->
<properties />
<!-- 远程仓库列表 -->
<repositories />
<!-- 插件仓库列表 -->
<pluginRepositories />
</profile>
</profiles>
activation
作用:自动触发profile的条件逻辑。
如pom.xml中的profile一样,profile的作用在于它能够在某些特定的环境中自动使用某些特定的值;这些环境通过activation元素指定。
activation元素并不是激活profile的唯一方式。settings.xml文件中的activeProfile元素可以包含profile的id。profile也可以通过在命令行,使用-P标记和逗号分隔的列表来显式的激活(如,-P test)。
<activation>
<!--profile默认是否激活的标识 -->
<activeByDefault>false</activeByDefault>
<!--当匹配的jdk被检测到,profile被激活。例如,1.4激活JDK1.4,1.4.0_2,而!1.4激活所有版本不是以1.4开头的JDK。 -->
<jdk>1.8</jdk>
<!--当匹配的操作系统属性被检测到,profile被激活。os元素可以定义一些操作系统相关的属性。 -->
<os>
<!--激活profile的操作系统的名字 -->
<name>Windows 10</name>
<!--激活profile的操作系统所属家族(如 'windows') -->
<family>Windows</family>
<!--激活profile的操作系统体系结构 -->
<arch>x64</arch>
<!--激活profile的操作系统版本 -->
<version></version>
</os>
<!--如果Maven检测到某一个属性(其值可以在POM中通过${name}引用),其拥有对应的name = 值,Profile就会被激活。如果值字段是空的,那么存在属性名称字段就会激活profile,否则按区分大小写方式匹配属性值字段 -->
<property>
<!--激活profile的属性的名称 -->
<name>mavenVersion</name>
<!--激活profile的属性的值 -->
<value>3</value>
</property>
<!--提供一个文件名,通过检测该文件的存在或不存在来激活profile。missing检查文件是否存在,如果不存在则激活profile。另一方面,exists则会检查文件是否存在,如果存在则激活profile。 -->
<file>
<!--如果指定的文件存在,则激活profile。 -->
<exists>${basedir}/file2.properties</exists>
<!--如果指定的文件不存在,则激活profile。 -->
<missing>${basedir}/file1.properties</missing>
</file>
</activation>
properties
作用:对应profile的扩展属性列表。
maven属性和ant中的属性一样,可以用来存放一些值。这些值可以在pom.xml中的任何地方使用标记${X}来使用,这里X是指属性的名称。属性有五种不同的形式,并且都能在settings.xml文件中访问。
<!-- 1. env.X: 在一个变量前加上"env."的前缀,会返回一个shell环境变量。例如,"env.PATH"指代了$path环境变量(在Windows上是%PATH%)。
2. project.x:指代了POM中对应的元素值。例如: <project><version>1.0</version></project>通过${project.version}获得version的值。
3. settings.x: 指代了settings.xml中对应元素的值。例如:<settings><offline>false</offline></settings>通过 ${settings.offline}获得offline的值。
4. Java System Properties: 所有可通过java.lang.System.getProperties()访问的属性都能在POM中使用该形式访问,例如 ${java.home}。
5. x: 在<properties/>元素中,或者外部文件中设置,以${someVar}的形式使用。 -->
<properties>
<user.install>${user.home}/our-project</user.install>
</properties>
repositories
作用:远程仓库列表,它是maven用来填充构建系统本地仓库所使用的一组远程仓库。
<repositories>
<!--包含需要连接到远程仓库的信息 -->
<repository>
<!--远程仓库唯一标识 -->
<id>codehausSnapshots</id>
<!--远程仓库名称 -->
<name>Codehaus Snapshots</name>
<!--如何处理远程仓库里发布版本的下载 -->
<releases>
<!--true或者false表示该仓库是否为下载某种类型构件(发布版,快照版)开启。 -->
<enabled>false</enabled>
<!--该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。这里的选项是:always(一直),daily(默认,每日),interval:X(这里X是以分钟为单位的时间间隔),或者never(从不)。 -->
<updatePolicy>always</updatePolicy>
<!--当Maven验证构件校验文件失败时该怎么做-ignore(忽略),fail(失败),或者warn(警告)。 -->
<checksumPolicy>warn</checksumPolicy>
</releases>
<!--如何处理远程仓库里快照版本的下载。有了releases和snapshots这两组配置,POM就可以在每个单独的仓库中,为每种类型的构件采取不同的策略。例如,可能有人会决定只为开发目的开启对快照版本下载的支持。参见repositories/repository/releases元素 -->
<snapshots>
<enabled />
<updatePolicy />
<checksumPolicy />
</snapshots>
<!--远程仓库URL,按protocol://hostname/path形式 -->
<url>http://snapshots.maven.codehaus.org/maven2</url>
<!--用于定位和排序构件的仓库布局类型-可以是default(默认)或者legacy(遗留)。Maven 2为其仓库提供了一个默认的布局;然而,Maven 1.x有一种不同的布局。我们可以使用该元素指定布局是default(默认)还是legacy(遗留)。 -->
<layout>default</layout>
</repository>
</repositories>
pluginRepositories
作用:发现插件的远程仓库列表。
和repository类似,只是repository是管理jar包依赖的仓库,pluginRepositories则是管理插件的仓库。
maven插件是一种特殊类型的构件。由于这个原因,插件仓库独立于其它仓库。pluginRepositories元素的结构和repositories元素的结构类似。每个pluginRepository元素指定一个Maven可以用来寻找新插件的远程地址。
<pluginRepositories>
<!-- 包含需要连接到远程插件仓库的信息.参见profiles/profile/repositories/repository元素的说明 -->
<pluginRepository>
<releases>
<enabled />
<updatePolicy />
<checksumPolicy />
</releases>
<snapshots>
<enabled />
<updatePolicy />
<checksumPolicy />
</snapshots>
<id />
<name />
<url />
<layout />
</pluginRepository>
</pluginRepositories>
activeProfiles
作用:手动激活profiles的列表,按照profile被应用的顺序定义activeProfile。
该元素包含了一组activeProfile元素,每个activeProfile都含有一个profile id。任何在activeProfile中定义的profile id,不论环境设置如何,其对应的 profile都会被激活。如果没有匹配的profile,则什么都不会发生。
例如,env-test是一个activeProfile,则在pom.xml(或者profile.xml)中对应id的profile会被激活。如果运行过程中找不到这样一个profile,Maven则会像往常一样运行。
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
<activeProfiles>
<!-- 要激活的profile id -->
<activeProfile>env-test</activeProfile>
</activeProfiles>
</settings>
2、pom.xml文件是干什么的?
pom.xml描述了项目的maven坐标,依赖关系,开发者需要遵循的规则,缺陷管理系统,组织和licenses,以及其他所有的项目相关因素,是项目级别的配置文件。(新建maven项目后生成目录下生成的pom.xml都继承于超级POM位置在maven根目录/lib/maven-model-builder-3.6.2中org\apache\maven\model\ pom-4.0.0.xml)
一个典型的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>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<packaging>...</packaging>
<!-- 依赖配置 -->
<dependencies>...</dependencies>
<parent>...</parent>
<dependencyManagement>...</dependencyManagement>
<modules>...</modules>
<properties>...</properties>
<!-- 构建配置 -->
<build>...</build>
<reporting>...</reporting>
<!-- 项目信息 -->
<name>...</name>
<description>...</description>
<url>...</url>
<inceptionYear>...</inceptionYear>
<licenses>...</licenses>
<organization>...</organization>
<developers>...</developers>
<contributors>...</contributors>
<!-- 环境设置 -->
<issueManagement>...</issueManagement>
<ciManagement>...</ciManagement>
<mailingLists>...</mailingLists>
<scm>...</scm>
<prerequisites>...</prerequisites>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<distributionManagement>...</distributionManagement>
<profiles>...</profiles>
</project>
(1)基本配置
modelVersion:pom模型版本,maven2和3只能为4.0.0
groupId:组ID,maven用于定位
artifactId:在组中的唯一ID用于定位
version:项目版本
packaging:项目打包方式,有以下值:pom, jar, maven-plugin, ejb, war, ear, rar, par在J2EE项目中使用war
(2)依赖配置
parent
用于确定父项目的坐标。
<parent>
<groupId>mobi.sunfield.apple.mycoach</groupId>
<artifactId>mobi.sunfield.apple.mycoach</artifactId>
<version>1.0.1.53-SNAPSHOT</version>
<relativePath>../</relativePath>
</parent>
groupId:父项目的构件标识符
artifactId:父项目的唯一标识符
relativePath:Maven首先在当前项目的找父项目的pom,然后在文件系统的这个位置(relativePath),然后在本地仓库,再在远程仓库找。
version:父项目的版本
modules
有些maven项目会做成多模块的,这个标签用于指定当前项目所包含的所有模块。之后对这个项目进行的maven操作,会让所有子模块也进行相同操作。
<modules>
<module>service</module>
<module>api</module>
<module>icoach</module>
<module>rest.mycoach</module>
<module>rest.icoach</module>
<module>rest</module>
<module>rest.reservation</module>
<module>management</module>
<module>openapi</module>
<module>scheduletasker</module>
<module>dataanalyze</module>
<module>activity</module>
</modules>
properties
用于定义pom常量
<properties>
6. <java.version>1.8/java.version>
</properties>
上面这个常量可以在pom文件的任意地方通过${java.version}来引用
dependencies
项目相关依赖配置,如果在父项目写的依赖,会被子项目引用,一般父项目会将子项目公用的依赖引入
7. <dependencies>
8. <dependency>
9. <groupId>junit</groupId>
10. <artifactId>junit</artifactId>
11. <version>4.12</version>
12. </dependency>
13. </dependencies>
这边依赖和中央仓库中的一致,就可以引入对应的jar
dependencyManagement
配置写法同dependencies
14. <dependencyManagement>
15. <dependencies>
16. .....
17. </dependencies>
18. </dependencyManagement>
在父模块中定义后,子模块不会直接使用对应依赖,但是在使用相同依赖的时候可以不加版本号:
父项目:
19. <dependencyManagement>
20. <dependencies>
21. <dependency>
22. <groupId>junit</groupId>
23. <artifactId>junit</artifactId>
24. <version>4.12</version>
25. <scope>test</scope>
26. </dependency>
27. </dependencies>
28. </dependencyManagement>
子项目:
29. <dependency>
30. <groupId>junit</groupId>
31. <artifactId>junit</artifactId>
32. </dependency>
这样的好处是,父项目统一了版本,而且子项目可以在需要的时候才引用对应的依赖
(3)构建配置
build
用于配置项目构建相关信息
33. <build>
34. <!--该元素设置了项目源码目录,当构建项目的时候,构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径。 -->
35. <sourceDirectory />
36. <!--该元素设置了项目脚本源码目录,该目录和源码目录不同:绝大多数情况下,该目录下的内容 会被拷贝到输出目录(因为脚本是被解释的,而不是被编译的)。 -->
37. <scriptSourceDirectory />
38. <!--该元素设置了项目单元测试使用的源码目录,当测试项目的时候,构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径。 -->
39. <testSourceDirectory />
40. <!--被编译过的应用程序class文件存放的目录。 -->
41. <outputDirectory />
42. <!--被编译过的测试class文件存放的目录。 -->
43. <testOutputDirectory />
44. <!--使用来自该项目的一系列构建扩展 -->
45. <extensions>
46. <!--描述使用到的构建扩展。 -->
47. <extension>
48. <!--构建扩展的groupId -->
49. <groupId />
50. <!--构建扩展的artifactId -->
51. <artifactId />
52. <!--构建扩展的版本 -->
53. <version />
54. </extension>
55. </extensions>
56. <!--当项目没有规定目标(Maven2 叫做阶段)时的默认值 -->
57. <defaultGoal />
58. <!--这个元素描述了项目相关的所有资源路径列表,例如和项目相关的属性文件,这些资源被包含在最终的打包文件里。 -->
59. <resources>
60. <!--这个元素描述了项目相关或测试相关的所有资源路径 -->
61. <resource> <!-- 描述了资源的目标路径。该路径相对target/classes目录(例如${project.build.outputDirectory})。举个例子,如果你想资源在特定的包里(org.apache.maven.messages),你就必须该元素设置为org/apache/maven /messages。然而,如果你只是想把资源放到源码目录结构里,就不需要该配置。-->
62. <targetPath />
63. <!--是否使用参数值代替参数名。参数值取自properties元素或者文件里配置的属性,文件在filters元素里列出。 -->
64. <filtering />
65. <!--描述存放资源的目录,该路径相对POM路径 -->
66. <directory />
67. <!--包含的模式列表,例如**/*.xml. -->
68. <includes />
69. <!--排除的模式列表,例如**/*.xml -->
70. <excludes />
71. </resource>
72. </resources>
73. <!--这个元素描述了单元测试相关的所有资源路径,例如和单元测试相关的属性文件。 -->
74. <testResources>
75. <!--这个元素描述了测试相关的所有资源路径,参见build/resources/resource元素的说明 -->
76. <testResource>
77. <targetPath />
78. <filtering />
79. <directory />
80. <includes />
81. <excludes />
82. </testResource>
83. </testResources>
84. <!--构建产生的所有文件存放的目录 -->
85. <directory />
86. <!--产生的构件的文件名,默认值是${artifactId}-${version}。 -->
87. <finalName />
88. <!--当filtering开关打开时,使用到的过滤器属性文件列表 -->
89. <filters />
90. <!--子项目可以引用的默认插件信息。该插件配置项直到被引用时才会被解析或绑定到生命周期。给定插件的任何本地配置都会覆盖这里的配置 -->
91. <pluginManagement>
92. <!--使用的插件列表 。 -->
93. <plugins>
94. <!--plugin元素包含描述插件所需要的信息。 -->
95. <plugin>
96. <!--插件在仓库里的group ID -->
97. <groupId />
98. <!--插件在仓库里的artifact ID -->
99. <artifactId />
100. <!--被使用的插件的版本(或版本范围) -->
101. <version />
102. <!--是否从该插件下载Maven扩展(例如打包和类型处理器),由于性能原因,只有在真需要下载时,该元素才被设置成enabled。 -->
103. <extensions />
104. <!--在构建生命周期中执行一组目标的配置。每个目标可能有不同的配置。 -->
105. <executions>
106. <!--execution元素包含了插件执行需要的信息 -->
107. <execution>
108. <!--执行目标的标识符,用于标识构建过程中的目标,或者匹配继承过程中需要合并的执行目标 -->
109. <id />
110. <!--绑定了目标的构建生命周期阶段,如果省略,目标会被绑定到源数据里配置的默认阶段 -->
111. <phase />
112. <!--配置的执行目标 -->
113. <goals />
114. <!--配置是否被传播到子POM -->
115. <inherited />
116. <!--作为DOM对象的配置 -->
117. <configuration />
118. </execution>
119. </executions>
120. <!--项目引入插件所需要的额外依赖 -->
121. <dependencies>
122. <!--参见dependencies/dependency元素 -->
123. <dependency>
124. ......
125. </dependency>
126. </dependencies>
127. <!--任何配置是否被传播到子项目 -->
128. <inherited />
129. <!--作为DOM对象的配置 -->
130. <configuration />
131. </plugin>
132. </plugins>
133. </pluginManagement>
134. <!--使用的插件列表 -->
135. <plugins>
136. <!--参见build/pluginManagement/plugins/plugin元素 -->
137. <plugin>
138. <groupId />
139. <artifactId />
140. <version />
141. <extensions />
142. <executions>
143. <execution>
144. <id />
145. <phase />
146. <goals />
147. <inherited />
148. <configuration />
149. </execution>
150. </executions>
151. <dependencies>
152. <!--参见dependencies/dependency元素 -->
153. <dependency>
154. ......
155. </dependency>
156. </dependencies>
157. <goals />
158. <inherited />
159. <configuration />
160. </plugin>
161. </plugins>
162. </build>
reporting
该元素描述使用报表插件产生报表的规范。当用户执行“mvn site”,这些
表就会运行。 在页面导航栏能看到所有报表的链接。
163. <reporting>
164. <!--true,则,网站不包括默认的报表。这包括“项目信息”菜单中的报表。 -->
165. <excludeDefaults />
166. <!--所有产生的报表存放到哪里。默认值是${project.build.directory}/site。 -->
167. <outputDirectory />
168. <!--使用的报表插件和他们的配置。 -->
169. <plugins>
170. <!--plugin元素包含描述报表插件需要的信息 -->
171. <plugin>
172. <!--报表插件在仓库里的group ID -->
173. <groupId />
174. <!--报表插件在仓库里的artifact ID -->
175. <artifactId />
176. <!--被使用的报表插件的版本(或版本范围) -->
177. <version />
178. <!--任何配置是否被传播到子项目 -->
179. <inherited />
180. <!--报表插件的配置 -->
181. <configuration />
182. <!-- 一组报表的多重规范,每个规范可能有不同的配置。一个规范(报表集)对应一个执行目标 。例如,有1,2,3,4,5,6,7,8,9个报表。1,2,5构成A报表集,对应一个执行目标。2,5,8构成B报表集,对应另一个执行目标 -->
183. <reportSets>
184. <!--表示报表的一个集合,以及产生该集合的配置 -->
185. <reportSet>
186. <!--报表集合的唯一标识符,POM继承时用到 -->
187. <id />
188. <!--产生报表集合时,被使用的报表的配置 -->
189. <configuration />
190. <!--配置是否被继承到子POMs -->
191. <inherited />
192. <!--这个集合里使用到哪些报表 -->
193. <reports />
194. </reportSet>
195. </reportSets>
196. </plugin>
197. </plugins>
198. </reporting>
(4)项目信息配置(不重要)
name:给用户提供更为友好的项目名
description:项目描述,maven文档中保存
url:主页的URL,maven文档中保存
inceptionYear:项目创建年份,4位数字。当产生版权信息时需要使用这个值
licenses:该元素描述了项目所有License列表。 应该只列出该项目的license列表,不要列出依赖项目的 license列表。如果列出多个license,用户可以选择它们中的一个而不是接受所有license。(如下)
• <license>
• <!--license用于法律上的名称-->
• <name>...</name>
• <!--官方的license正文页面的URL-->
• <url>....</url>
• <!--项目分发的主要方式:repo,可以从Maven库下载 manual, 用户必须手动下载和安装依赖-->
• <distribution>repo</distribution>
• <!--关于license的补充信息-->
• <comments>....</comments>
• </license>
organization:1.name 组织名 2.url 组织主页url
developers:项目开发人员列表(如下)
contributors:项目其他贡献者列表,同developers
199. <developers>
200. <!--某个开发者信息-->
201. <developer>
202. <!--开发者的唯一标识符-->
203. <id>....</id>
204. <!--开发者的全名-->
205. <name>...</name>
206. <!--开发者的email-->
207. <email>...</email>
208. <!--开发者的主页-->
209. <url>...<url/>
210. <!--开发者在项目中的角色-->
211. <roles>
212. <role>Java Dev</role>
213. <role>Web UI</role>
214. </roles>
215. <!--开发者所属组织-->
216. <organization>sun</organization>
217. <!--开发者所属组织的URL-->
218. <organizationUrl>...</organizationUrl>
219. <!--开发者属性,如即时消息如何处理等-->
220. <properties>
221. <!-- 和主标签中的properties一样,可以随意定义子标签 -->
222. </properties>
223. <!--开发者所在时区, -11到12范围内的整数。-->
224. <timezone>-5</timezone>
225. </developer>
226. </developers>
(5)环境设置
issueManagement
目的问题管理系统(Bugzilla, Jira, Scarab)的名称和URL
227. <issueManagement>
228. <system>Bugzilla</system>
229. <url>http://127.0.0.1/bugzilla/</url>
230. </issueManagement>
system:系统类型
url:路径
ciManagement
项目的持续集成信息
231. <ciManagement>
232. <system>continuum</system>
233. <url>http://127.0.0.1:8080/continuum</url>
234. <notifiers>
235. <notifier>
236. <type>mail</type>
237. <sendOnError>true</sendOnError>
238. <sendOnFailure>true</sendOnFailure>
239. <sendOnSuccess>false</sendOnSuccess>
240. <sendOnWarning>false</sendOnWarning>
241. <address>continuum@127.0.0.1</address>
242. <configuration></configuration>
243. </notifier>
244. </notifiers>
245. </ciManagement>
system:持续集成系统的名字
url:持续集成系统的URL
notifiers:构建完成时,需要通知的开发者/用户的配置项。包括被通知者信息和通知条件(错误,失败,成功,警告)
type:通知方式
sendOnError:错误时是否通知
sendOnFailure:失败时是否通知
sendOnSuccess:成功时是否通知
sendOnWarning:警告时是否通知
address:通知发送到的地址
configuration:扩展项
mailingLists
项目相关邮件列表信息
246. <mailingLists>
247. <mailingList>
248. <name>User List</name>
249. <subscribe>user-subscribe@127.0.0.1</subscribe>
250. <unsubscribe>user-unsubscribe@127.0.0.1</unsubscribe>
251. <post>user@127.0.0.1</post>
252. <archive>http://127.0.0.1/user/</archive>
253. <otherArchives>
254. <otherArchive>http://base.google.com/base/1/127.0.0.1</otherArchive>
255. </otherArchives>
256. </mailingList>
257. .....
258. </mailingLists>
subscribe, unsubscribe: 订阅邮件(取消订阅)的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建
archive:浏览邮件信息的URL
post:接收邮件的地址
scm
允许你配置你的代码库,供Maven web站点和其它插件使用
259. <scm>
260. <connection>scm:svn:http://127.0.0.1/svn/my-project</connection>
261. <developerConnection>scm:svn:https://127.0.0.1/svn/my-project</developerConnection>
262. <tag>HEAD</tag>
263. <url>http://127.0.0.1/websvn/my-project</url>
264. </scm>
connection, developerConnection:这两个表示我们如何连接到maven的版本库。connection只提供读,developerConnection将提供写的请求
写法如:scm:[provider]:[provider_specific]
如果连接到CVS仓库,可以配置如下:scm:cvs:pserver:127.0.0.1:/cvs/root:my-project
tag:项目标签,默认HEAD
url:共有仓库路径
prerequisites
项目构建的前提
265. <prerequisites>
266. <maven>2.0.6</maven>
267. </prerequisites>
repositories,pluginRepositories
依赖和扩展的远程仓库列表,同上篇文章,setting.xml配置中介绍的。
268. <repositories>
269. <repository>
270. <releases>
271. <enabled>false</enabled>
272. <updatePolicy>always</updatePolicy>
273. <checksumPolicy>warn</checksumPolicy>
274. </releases>
275. <snapshots>
276. <enabled>true</enabled>
277. <updatePolicy>never</updatePolicy>
278. <checksumPolicy>fail</checksumPolicy>
279. </snapshots>
280. <id>codehausSnapshots</id>
281. <name>Codehaus Snapshots</name>
282. <url>http://snapshots.maven.codehaus.org/maven2</url>
283. <layout>default</layout>
284. </repository>
285. </repositories>
286. <pluginRepositories>
287. ...
288. </pluginRepositories>
releases, snapshots:这是各种构件的策略,release或者snapshot。这两个集合,POM就可以根据独立仓库任意类型的依赖改变策略。如:一个人可能只激活下载snapshot用来开发。
enable:true或者false,决定仓库是否对于各自的类型激活(release 或者 snapshot)。
updatePolicy: 这个元素决定更新频率。maven将比较本地pom的时间戳(存储在仓库的maven数据文件中)和远程的. 有以下选择: always, daily (默认), interval:X (x是代表分钟的整型) , never.
checksumPolicy:当Maven向仓库部署文件的时候,它也部署了相应的校验和文件。可选的为:ignore,fail,warn,或者不正确的校验和。
layout:在上面描述仓库的时候,提到他们有统一的布局。Maven 2有它仓库默认布局。然而,Maven 1.x有不同布局。使用这个元素来表明它是default还是legacy。
distributionManagement
它管理的分布在整个构建过程生成的工件和支持文件
289. <distributionManagement>
290. ...
291. <downloadUrl>http://mojo.codehaus.org/my-project</downloadUrl>
292. <status>deployed</status>
293. </distributionManagement>
downloadUrl: 其他pom可以通过此url的仓库抓取组件
status:给出该构件在远程仓库的状态
none: 默认
converted: 将被早期Maven 2 POM转换过来
partner: 这个项目会从合作者仓库同步过来
deployed: 从Maven 2或3实例部署
verified: 被核实时正确的和最终的
repository
指定Maven pom从远程下载控件到当前项目的位置和方式,如果snapshotRepository没有被定义则使用repository相关的配置
295. <distributionManagement>
296. <repository>
297. <uniqueVersion>false</uniqueVersion>
298. <id>corp1</id>
299. <name>Corporate Repository</name>
300. <url>scp://repo/maven2</url>
301. <layout>default</layout>
302. </repository>
303. <snapshotRepository>
304. <uniqueVersion>true</uniqueVersion>
305. <id>propSnap</id>
306. <name>Propellors Snapshots</name>
307. <url>sftp://propellers.net/maven</url>
308. <layout>legacy</layout>
309. </snapshotRepository>
310. ...
311. </distributionManagement>
id, name:仓库的唯一标识
uniqueVersion:true或false,指明控件部署的时候是否获取独立的版本号。
url:repository元素的核心。指定位置和部署协议发布控件到仓库。
layout:布局,default或legacy
site Distribution
多分布存储库,distributionManagement负责定义如何部署项目的网站和文档。
1. <distributionManagement>
2. ...
3. <site>
4. <id>mojo.website</id>
5. <name>Mojo Website</name>
6. <url>scp://beaver.codehaus.org/home/projects/mojo/public_html/</url>
7. </site>
8. ...
9. </distributionManagement>
id, name, url: 这些元素与distributionManagement repository中的相同
relocation
重新部署-项目不是静态的,是活的。他们需要被搬到更合适的地方。如:当你的下个成功的开源项目移到Apache下,重命名为org.apache:my-project:1.0 对你项目更有好处。
1. <distributionManagement>
2. ...
3. <relocation>
4. <groupId>org.apache</groupId>
5. <artifactId>my-project</artifactId>
6. <version>1.0</version>
7. <message>We have moved the Project under Apache</message>
8. </relocation>
9. ...
10. </distributionManagement>
profiles
profile可以让我们定义一系列的配置信息(插件等),然后指定其激活条件
五、maven中的属性
Maven共有6类属性:
1、内置属性(Maven预定义,用户可以直接使用)
${basedir}表示项目根目录,即包含pom.xml文件的目录;
${version}表示项目版本;
p
r
o
j
e
c
t
.
b
a
s
e
d
i
r
同
{project.basedir}同
project.basedir同{basedir};
${project.baseUri}表示项目文件地址;
${maven.build.timestamp}表示项目构件开始时间;
m
a
v
e
n
.
b
u
i
l
d
.
t
i
m
e
s
t
a
m
p
.
f
o
r
m
a
t
表
示
属
性
{maven.build.timestamp.format}表示属性
maven.build.timestamp.format表示属性{maven.build.timestamp}的展示格式,默认值为yyyyMMdd-HHmm,可自定义其格式,其类型可参考java.text.SimpleDateFormat。用法如下:
1. <properties>
2. <maven.build.timestamp.format>yyyy-MM-dd HH:mm:ss</maven.build.timestamp.format>
3. </properties>
2、POM属性(使用pom属性可以引用到pom.xml文件对应元素的值)
${project.build.directory}表示主源码路径;
${project.build.sourceEncoding}表示主源码的编码格式;
${project.build.sourceDirectory}表示主源码路径;
${project.build.finalName}表示输出文件名称;
p
r
o
j
e
c
t
.
v
e
r
s
i
o
n
表
示
项
目
版
本
,
与
{project.version}表示项目版本,与
project.version表示项目版本,与{version}相同;
3、自定义属性(在pom.xml文件的标签下定义的Maven属性)
<properties>
<config.dir>localhost</config.dir>
</properties>
在其他地方使用${config.dir}使用该属性值。
settings.xml文件属性(与pom属性同理,用户使用以settings.开头的属性引用settings.xml文件中的XML元素值)
${settings.localRepository}表示本地仓库的地址;
4、Java系统属性(所有的Java系统属性都可以使用Maven属性引用)
使用mvn help:system命令可查看所有的Java系统属性;
System.getProperties()可得到所有的Java属性;
${user.home}表示用户目录;
5、环境变量属性(所有的环境变量都可以用以env.开头的Maven属性引用)
使用mvn help:system命令可查看所有环境变量;
${env.JAVA_HOME}表示JAVA_HOME环境变量的值;
如有不完善或错误的地方谢谢大家指出☻