浅谈maven

浅谈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程序: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环境变量的值;

如有不完善或错误的地方谢谢大家指出☻

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值