1 Maven的基本概念
Maven(翻译为"专家","内行")是跨平台的项目管理工具。主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。
1.1 什么是maven
如今我们构建一个项目需要用到很多第三方的类库,如写一个使用Spring的Web项目就需要引入大量的jar包。一个项目Jar包的数量之多往往让我们瞠目结舌,并且Jar包之间的关系错综复杂,一个Jar包往往又会引用其他Jar包,缺少任何一个Jar包都会导致项目编译失败。
以往开发项目时,程序员往往需要花较多的精力在引用Jar包搭建项目环境上,而这一项工作尤为艰难,少一个Jar包、多一个Jar包往往会报一些让人摸不着头脑的异常。而Maven就是一款帮助程序员构建项目的工具,我们只需要告诉Maven需要哪些Jar 包,它会帮助我们下载所有的Jar,极大提升开发效率。
1.2 项目构建
项目构建过程包括【清理项目】→【编译项目】→【测试项目】→【生成测试报告】→【打包项目】→【部署项目】这六个步骤,这六个步骤就是一个项目的完整构建过程。
理想的项目构建是高度自动化,跨平台,可重用的组件,标准化的,使用maven就可以帮我们完成上述所说的项目构建过程。
1.3 依赖管理
依赖指的是jar包之间的相互依赖,比如我们搭建一个Struts2的开发框架时,光光有struts2-core-2.3.16.3.jar这个jar包是不行的,struts2-core-2.3.16.3.jar还依赖其它的jar包,依赖管理指的就是使用Maven来管理项目中使用到的jar包,Maven管理的方式就是“自动下载项目所需要的jar包,统一管理jar包之间的依赖关系”。
1.3.1 maven的依赖机制
我们以一个案例来了解maven的依赖是如何工作的,假设你想使用 Log4j 作为项目的日志。
1.3.1.1 传统的方式
(1)访问 Log4j – Apache Log4j™ 2,下载 Log4 j的 jar 库。
(2)复制 jar 到项目类路径,手动将其包含到项目的依赖。
(3)所有的管理需要一切由自己做
(4)如果有 Log4j 版本升级,则需要重复上述步骤一次。
1.3.1.2 Maven的方式
(1)你需要知道 log4j 的 Maven 坐标,例如:
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
(2)它会自动下载 log4j 的1.2.14 版本库。如果“version”标签被忽略,它会自动升级库当有新的版本时。
(3)声明 Maven 的坐标转换成 pom.xml 文件。
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
</dependencies>
(4)当 Maven 编译或构建时,log4j的jar会自动下载,并把它放到 Maven本地存储库中, 所有的工作由 Maven 管理。
1.3.1.4 解释说明
看看有什么不同?那么到底在Maven发生了什么?当建立一个Maven的项目,pom.xml文件将被解析,如果看到 log4j 的 Maven 坐标,然后 Maven 按此顺序搜索 log4j 库:
在 Maven 的本地仓库搜索 log4j
在 Maven 中央存储库搜索 log4j
在 Maven 远程仓库搜索 log4j(如果在 pom.xml 中定义)。
1.3.2 获取jar的maven坐标
(1)以spring core的jar包为例,访问http://www.mvnrepository.com/在最上方中间,输入spring core,点击Search。
(2)搜索结果第一个就是,点击spring core。
(3)有很多版本,这里点击4.3.10.RELEASE。
(4)点击maven栏里面的内容,允许访问,会复制到剪贴板。然后直接粘贴到pom.xml文件的<dependencies>里面,eclipse右下角就会提示下载。下载完成完,项目中就会成功添加这两个包。
1.3.3选择jar包版本
刚才可以看到,spring5.M已经出来了,要不要选择最新版本?拉到下面回顾一下spring4.M
(1)版本号的完整含义
第一个数字:主版本,有可能进行大的架构调整,各大版本之间并不一定兼容。
第二个数字:次版本,在主版本架构不变的前提下,增加了一些新的特性或变化。
第三个数字:增量版本,bug修复,细节的完善。
M: 里程碑版本,测试版本,发布版本的前兆。
RC: 候选发布版本,稳定版本,并不一定会发布。
RELEASE: 发布版本,稳定版本,在项目中真正可用的版本。
可以看出,如spring5.0.0.M离RELEASE版还有一段距离,但即使出了5.0.0.RELEASE,除非是新项目或者功能上的需要,否则没有必要急着升级,因为通常还不完善,还有一些bug需要修复。一般在5.1出来的时候,代表官方已经把重心移到了5.1,这时就可以认为5.0.X.RELEASE的最大版本已经比较完善了。
1.3.3 传递依赖
如果我们的项目引用了一个Jar包,而该Jar包又引用了其他Jar包,那么在默认情况下项目编译时,Maven会把直接引用和间接引用的Jar包都下载到本地。
1.3.4 排除依赖
如果我们只想下载直接引用的Jar包,那么需要在pom.xml中做如下配置:(将需要排除的Jar包的坐标写在中)。
<exclusions>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</exclusion>
</exclusions>
1.3.5依赖冲突
若项目中多个Jar同时引用了相同的Jar时,会产生依赖冲突,但Maven采用了两种避免冲突的策略,因此在Maven中是不存在依赖冲突的。
(1)短路优先
本项目——>A.jar——>B.jar——>X.jar
本项目——>C.jar——>X.jar
若本项目引用了A.jar,A.jar又引用了B.jar,B.jar又引用了X.jar,并且C.jar也引用了X.jar。在此时,Maven只会引用路径最短的Jar。
(2)声明优先
若引用路径长度相同时,在pom.xml中谁先被声明,就使用谁。
1.4 Maven仓库
1.4.1 概述
在Maven中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。Maven在某个统一的位置存储所有项目的共享的构件,这个统一的位置,我们就称之为仓库。(仓库就是存放依赖和插件的地方)任何的构件都有唯一的坐标,Maven根据这个坐标定义了构件在仓库中的唯一存储路径。
1.4.2 Maven在仓库中的存储路径
(1)基于groupId准备路径,将句点分隔符转成路径分隔符,就是将"."转换成 "/" ;org.apache.logging.log4j --->org\apache\logging\log4j。
(2)基于artifactId准备路径,将artifactId连接到后面:org\apache\logging\log4j\log4j-core。
(3)使用version准备路径,将version连接到后面:org\apache\logging\log4j\log4j-core\2.5。
(4)将artifactId于version以分隔符连字号连接到后面:org/testng/testng/5.8/tesng-5.8。
(5)判断如果构件有classifier,就要在第4项后增加分隔符连字号再加上classifier,org/testng/testng/5.8/tesng-5.8-jdk5。
(6)检查构件的extension,如果extension存在,则加上句点分隔符和extension,而extension是由packing决定的,org/testng/testng/5.8/tesng-5.8-jdk5.jar。
1.4.3 分类
maven的仓库只有两大类:
1.4.3.1本地仓库
顾名思义,就是Maven在本地存储构件的地方。maven的本地仓库,在安装maven后并不会创建,它是在第一次执行maven命令的时候才被创建。maven本地仓库的默认位置:无论是Windows还是Linux,在用户的目录下都有一个.m2/repository/的仓库目录,这就是Maven仓库的默认位置。
1.4.3.2远程仓库
(1)中央仓库
中央仓库是默认的远程仓库,是Maven官方提供的远程仓库。maven在安装的时候,自带的就是中央仓库的配置。中央仓库的路径为:http://repo.maven.apache.org/maven2。中央仓库包含了绝大多数流行的开源Java构件,以及源码、作者信息、SCM、信息、许可证信息等。一般来说,简单的Java项目依赖的构件都可以在这里下载得到。
(2)私服
私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用。当Maven需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。我们还可以把一些无法从外部仓库下载到的构件上传到私服上。
Maven私服的优点:
①节省自己的外网带宽:减少重复请求造成的外网带宽消耗。
②加速Maven构建:如果项目配置了很多外部远程仓库时,构建速度就会大大降低。
③部署第三方构件:有些构件无法从外部仓库获得的时候,我们可以把这些构件部署到内部仓库(私服)中,供内部maven项目使用。
④提高稳定性,增强控制:Internet不稳定的时候,maven构建也会变的不稳定。
⑤降低中央仓库的负荷:maven中央仓库被请求的数量是巨大的,配置私服也可以大大降低中央仓库的压力。
当前主流的maven私服:
① Apache的Archiva
②JFrog的Artifactory
③Sonatype的Nexus
(3)镜像仓库
如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。换句话说,任何一个可以从仓库Y获得的构件,都能够从它的镜像中获取。举个例子,开源中国提供的镜像仓库
http://maven.oschina.net/content/groups/public是中央仓库http://repo.maven.apache.org/maven2 在中国的镜像,由于地理位置的因素,该镜像往往能够提供比中央仓库更快的服务。因此,可以配置Maven使用该镜像来替代中央仓库。
1.5 坐标
1.5.1为何要有坐标的概念
Maven的一个核心的作用就是管理项目的依赖,引入我们所需的各种jar包等。为了能自动化的解析任何一个Java构件,Maven必须将这些Jar包或者其他资源进行唯一标识,这是管理项目的依赖的基础,也就是我们要说的坐标。包括我们自己开发的项目,也是要通过坐标进行唯一标识的,这样才能在其它项目中进行依赖引用。
1.5.2 何为Maven坐标
坐标就好比每一个Java构件的身份证一样。Maven的世界是拥有非常多的Java构件的,可能是jar、可能是war、也可能是其他的一些东西。假如Maven中没有坐标的概念,我们是无法来区分这些构件的,所以我们要唯一标识每一个构件。不然就和传统的手工方式一样,你需要spring就去spring下载spring的包,需要mysql又要去mysql下载mysql的包,没有统一的规范又怎么能够自动化的去依赖这些构件。
Maven便给我们制定了一套规则那就是使用坐标进行唯一标识。Maven的坐标元素包括groupId、artifactId、version、packaging、classfier。只要我们提供正确的坐标元素,Maven就能找到对应的构件,首先去你的本地仓库查找,没有的话再去远程仓库下载。如果没有配置远程仓库,会默认从中央仓库http://repo1.maven.org/maven2下载构件,该中央仓库包含了世界上大部分流行的开源项目构件,但不一定所有构件都有,在以前的开发中就遇到过找不到oracle数据库jar包的问题,不知道现在是否依然如此。
在我们自己开发项目的时候,也是要给我们的项目定义坐标的,这是强制性要求,只有这样,其他项目才能引用该项目的构件。
1.5.3 坐标详细说明
Maven坐标是通过groupId、artifactId、version、packaging、classfier这些元素来定义的,我们来看看示例:
我们在平时的开发中一般只需要使用必要的几个元素就好了,不必要的一些元素往往是用不着的,我们来看看每个元素所代表的含义。
●groupId :定义当前Maven项目隶属的实际项目。首先,Maven项目和实际项目不一定是一对一的关系。比如SpringFrameWork这一实际项目,其对应的Maven项目会有很多,如spring-core,spring-context等。这是由于Maven中模块的概念,因此,一个实际项目往往会被划分成很多模块。其次,groupId不应该对应项目隶属的组织或公司。原因很简单,一个组织下会有很多实际项目,如果groupId只定义到组织级别,而后面我们会看到,artifactId只能定义Maven项目(模块),那么实际项目这个层次将难以定义。最后,groupId的表示方式与Java包名的表达方式类似,通常与域名反向一一对应。上例中,groupId为junit,是不是感觉很特殊,这样也是可以的,因为全世界就这么个junit,它也没有很多分支。
●artifactId : 该元素定义当前实际项目中的一个Maven项目(模块),推荐的做法是使用实际项目名称作为artifactId的前缀。比如上例中的junit,junit就是实际的项目名称,方便而且直观。在默认情况下,maven生成的构件,会以artifactId作为文件头,如junit-3.8.1.jar,使用实际项目名称作为前缀,就能方便的从本地仓库找到某个项目的构件。
●version : 该元素定义了使用构件的版本,如上例中junit的版本是3.8.1,你也可以改为4.0表示使用4.0版本的junit。
●packaging :定义Maven项目打包的方式,使用构件的什么包。首先,打包方式通常与所生成构件的文件扩展名对应,如上例中没有packaging,则默认为jar包,最终的文件名为junit-3.8.1.jar。也可以打包成war等。
●classifier: 该元素用来帮助定义构建输出的一些附件。附属构件与主构件对应,如上例中的主构件为junit-3.8.1.jar,该项目可能还会通过一些插件生成如junit-3.8.1-javadoc.jar,junit-3.8.1-sources.jar, 这样附属构件也就拥有了自己唯一的坐标。
上述5个元素中,groupId、artifactId、version是必须定义的,packaging是可选的(默认为jar),而classfier是不能直接定义的,需要结合插件使用。一个构件的名称就是由这几个元素的值所组成的,junit-3.8.1.jar,自己去比对一下,不仅如此,Maven仓库的布局也是基于Maven坐标的,本地仓库的布局也是如此。
1.6-----聚合
什么是聚合?
将多个项目同时运行就称为聚合。
如何实现聚合?
只需在pom中作如下配置即可实现聚合:
<modules>
<module>../模块1</module>
<module>../模块2</module>
<module>../模块3</module>
</modules>
1.7------继承
什么是继承?
在聚合多个项目时,如果这些被聚合的项目中需要引入相同的Jar,那么可以将这些Jar写入父pom中,各个子项目继承该pom即可。
如何实现继承?
父pom配置:将需要继承的Jar包的坐标放入标签即可。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.2.2</version>
</dependency>
</dependencies>
</dependencyManagement>
子pom配置:
<parent>
<groupId>父pom所在项目的groupId</groupId>
<artifactId>父pom所在项目的artifactId</artifactId>
<version>父pom所在项目的版本号</version>
</parent>
1.8 使用Maven的好处
Maven中使用约定,约定java源代码代码必须放在哪个目录下,编译好的java代码又必须放到哪个目录下,这些目录都有明确的约定。
Maven的每一个动作都拥有一个生命周期,例如执行 mvn install 就可以自动执行编译,测试,打包等构建过程
只需要定义一个pom.xml,然后把源码放到默认的目录,Maven帮我们处理其他事情
使用Maven可以进行项目高度自动化构建,依赖管理(这是使用Maven最大的好处),仓库管理。
2 Maven下载和安装
2.1 maven的下载
下载地址:Maven – Download Apache Maven
下载完成后,得到一个压缩包,解压,可以看到maven的组成目录
Maven目录分析
|—bin:含有mvn运行的脚本。
|—boot:含有plexus-classworlds类加载器框架。
|—conf:含有settings.xml配置文件。
|—lib:含有Maven运行时所需要的java类库。
|—LICENSE.txt, NOTICE.txt, README.txt针对Maven版本,第三方软件等简要介绍。
2.2 maven的安装
(1)首先要确保电脑上已经安装了JDK(要jdk 1.6+的版本),配置好JDK的环境变量,使用如下命令检查检查JDK安装的情况。
(2)对apache-maven-3.2.3-bin.zip进行解压缩,例如解压到如下目录(解压目录最好不要有中文)
2.3 maven环境变量配置
(1)设置系统环境变量:MAVEN_HOME
(2)设置环境变量Path,将%MAVEN_HOME%\bin加入Path中,一定要注意要用分号“;”与其他值隔开,如下图所示:
2.4验证Maven安装是否成功
打开cmd窗口,输入"mvn –v"命令 查看Maven的相关信息,如下图所示:
能够出现这样的信息就说明Maven的安装已经成功了。
2.5设置MAVEN_OPTS环境变量(可选配置)
由于Maven命令实际上是执行了Java命令,所以可以通过JAVA命令参数的方式来设置MAVEN运行参数。MAVEN_OPTS环境变量正是用于此用途
MAVEN_OPTS -Xms128m -Xmx512m,分别设置JVM的最小和最大内存,如下图所示:
2.6 配置远程仓库
如果要想进行Maven的操作,默认情况下使用的是都是远程的国外的仓库进行连接,那么这个速度实在是太慢了,所以为了让开发包的下载速度变快,建议将现在的仓库变为国内仓库(不用过墙)。
2.6.1 中央仓库配置
maven中央仓库默认是配置好的。其文件存放的位置在lib文件夹下。如下图:
解压此文件,一次进入到目录~\lib\maven-model-builder-3.5.0\org\apache\maven\model中,找到pom-4.0.0.xml,打开,如下图:
2.6.2 远程仓库配置方式
2.6.2.1 setting文件配置远程仓库镜像
一次进入目录D:\Java\apache-maven-3.5.0-bin\apache-maven-3.5.0\conf找到setting.xml文件,打开查找mirrors。如图
2.6.2.2 setting文件全局远程仓库配置
各标签的含义,请看下面一条的详解。
2.6.2.3 项目pom文件远程仓库配置
●repository:在repositories元素下,可以使用repository子元素声明一个或者多个远程仓库。
●id:仓库声明的唯一id,尤其需要注意的是,Maven自带的中央仓库使用的id为central,如果其他仓库声明也使用该id,就会覆盖中央仓库的配置。
●name:仓库的名称,让我们直观方便的知道仓库是哪个,暂时没发现其他太大的含义。
●url:指向了仓库的地址,一般来说,该地址都基于http协议,Maven用户都可以在浏览器中打开仓库地址浏览构件。
●releases和snapshots:用来控制Maven对于发布版构件和快照版构件的下载权限。需要注意的是enabled子元素,该例中releases的enabled值为true,表示开启JBoss仓库的发布版本下载支持,而snapshots的enabled值为false,表示关闭JBoss仓库的快照版本的下载支持。根据该配置,Maven只会从JBoss仓库下载发布版的构件,而不会下载快照版的构件。
●layout:元素值default表示仓库的布局是Maven2及Maven3的默认布局,而不是Maven1的布局。基本不会用到Maven1的布局。
●其他:对于releases和snapshots来说,除了enabled,它们还包含另外两个子元素updatePolicy和checksumPolicy。
●updatePolicy用来配置Maven从远处仓库检查更新的频率,默认值是daily,表示Maven每天检查一次。其他可用的值包括:never-从不检查更新;always-每次构建都检查更新;interval:X-每隔X分钟检查一次更新(X为任意整数)。
●checksumPolicy用来配置Maven检查校验和文件的策略。当构建被部署到Maven仓库中时,会同时部署对应的检验和文件。在下载构件的时候,Maven会验证校验和文件,如果校验和验证失败,当checksumPolicy的值为默认的warn时,Maven会在执行构建时输出警告信息,其他可用的值包括:fail-Maven遇到校验和错误就让构建失败;ignore-使Maven完全忽略校验和错误。
2.6.3 远程仓库认证
大部分公共的远程仓库无须认证就可以直接访问,但我们在平时的开发中往往会架设自己的Maven远程仓库,出于安全方面的考虑,我们需要提供认证信息才能访问这样的远程仓库。配置认证信息和配置远程仓库不同,远程仓库可以直接在pom.xml中配置,但是认证信息必须配置在settings.xml文件中。这是因为pom往往是被提交到代码仓库中供所有成员访问的,而settings.xml一般只存在于本机。因此,在settings.xml中配置认证信息更为安全。
上面代码我们配置了一个id为releases的远程仓库认证信息。Maven使用settings.xml文件中的servers元素及其子元素server配置仓库认证信息。认证用户名为admin,认证密码为admin123。这里的关键是id元素,settings.xml中server元素的id必须与pom.xml中需要认证的repository元素的id完全一致。正是这个id将认证信息与仓库配置联系在了一起。
2.6.4 多仓库配置
2.6.4.1 配置多个镜像仓库
在日常工作中,我们使用maven下载需要的jar包,但是很多的时候由于中央仓库没有,所以我们没有办法下载到需要的jar包,手动去下载上,然后放入到lib下,然后build path有的时候会感到很不舒服,不是很是不实用。所以此处可以在maven的设置中心添加多个下载仓库,这样丰富了中央仓库的下载地址。
2.6.4.2 全局多仓库配置
全局多仓库设置,是通过修改maven的setting文件实现的。
设置思路:在setting文件中添加多个profile(也可以在一个profile中包含很多个仓库),并激活(即使是只有一个可用的profile,也需要激活)。修改maven的setting文件,设置两个仓库(以此类推,可以添加多个)。特别注意的是id不可设置为“central”。
2.6.4.3 项目中配置多仓库
在项目中添加多个仓库,是通过修改项目中的pom文件实现的。实现思路:在项目中pom文件的repositories节点(如果没有手动添加)下添加多个repository节点,每个repository节点是一个仓库。修改项目中pom文件,设置两个仓库(以此类推,可以添加多个)。同样id不可设置为“central”。
2.6.4.4 国内常用的镜像仓库
(1)阿里云的镜像站(首推,速度暴快)
<mirror>
<id>nexus-aliyun</id>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
(2)maven官方运维的2号仓库
<mirror>
<id>repo2</id>
<name>Mirror from Maven Repo2</name>
<url>http://repo2.maven.org/maven2/</url>
<mirrorOf>central</mirrorOf>
</mirror>
(3)maven在UK架设的仓库(有时候速度会比官方2号仓库快)
<mirror>
<id>ui</id>
<name>Mirror from UK</name>
<url>http://uk.maven.org/maven2/</url>
<mirrorOf>central</mirrorOf>
</mirror>
(4)JBoss的仓库
<mirror>
<id>jboss-public-repository-group</id>
<mirrorOf>central</mirrorOf>
<name>JBoss Public Repository Group</name>
<url>http://repository.jboss.org/nexus/content/groups/public</url>
</mirror>
2.6.5 私服仓库配置
私服仓库本质上是一种特殊的远程仓库,配置的方法参见远程仓库的配置。私服仓库的具体使用方法,请参照2.9 maven私服搭建。
2.6.6 项目部署到远程仓库
(1)我们使用自己的远程仓库的目的就是在远程仓库中部署我们自己项目的构件以及一些无法从外部仓库直接获取的构件。这样才能在开发时,供其他对团队成员使用。Maven除了能对项目进行编译、测试、打包之外,还能将项目生成的构件部署到远程仓库中。首先,需要编辑项目的pom.xml文件。配置distributionManagement元素,代码如下:
(2)distributionManagement包含了2个子元素:repository和snapshotRepository, 前者表示发布版本构件的仓库,后者表示快照版本的仓库。这两个元素都需要配置 id(该远程仓库的唯一标识),name,url(表示该仓库的地址)。
(3)向远程仓库中部署构件,需要进行认证。配置同上
(4)配置正确后运行: mvn clean deploy
(5)正确的看待快照
我们在配置pom的时候,对于快照的配置都很谨慎,或者说很少用快照的版本,原因是它还很不稳定,极容易给我们的系统带来未知的错误,让我们很难查找。其实快照版本也并不是一无是处,快照最大的用途是用在开发的过程中,尤其是有模块依赖的时候,比如说AB两个模块同时开发,A依赖于B,开发过程中AB都是持续集成的开发,不断的修改POM文件和构建工程,这时候版本同步就成了一个很大的问题。使用快照就可以达到这一目的。其实在快照版本在发布的过程中,Maven会自动为构件以当前时间戳做标记,有了这个时间戳,我们就可以随时找到最新的快照版本,这样也就解决刚才说的 协作开发的问题。至于A如何检查B的更新,刚刚在讲配置的时候说过,快照配置中有一个元素可以控制检查更新的频率------updatePolicy
我们也可以使用命令行加参数的形式强制执行让maven检查更新:
mvn clean install-U
2.7 配置本地仓库路径地址
如何更改maven默认的本地仓库的位置:这里要引入一个新的元素:localRepository,它是存在于maven的settings.xml文件中。
2.7.1更改配置用户范围的本地仓库:
先在用户目录/.m2/目录下创建settings.xml文件,然后在~/.m2/settings.xml,设置localRepository元素的值为想要的仓库地址。
这时候,maven的本地仓库地址就变成了 D:\maven\.m2\repository,注:此时配置的maven的本地仓库是属于用户范围的。
2.7.2 更改配置全局范围的本地仓库:
在maven的安装文件中更改配置,更改配置的方法同上。
注:此时更改后,所有的用户都会受到影响,而且如果maven进行升级,那么所有的配置都会被清除,所以要提前复制和备份M2_HOME/conf/settings.xml文件。故一般情况下不推荐配置全局的settings.xml。
2.7.3工程使用仓库配置的优先级顺序
这个确实是有个优先级的,应该是pom>用户级别>全局级别。例:如果pom中不配置,就取用户级别,如果用户级别也没有配置,就取全局级别
2.8 maven启用代理访问
2.8.1为什么要设置代理服务器
(1)开发中经常遇到国外的maven服务器无法访问,还有就是服务器没有外网地址,这将依赖包无法下载,解决这个问题很是简单,只需要设置代理服务器就可以了,让maven使用代理服务器去访问库服务。
(2)有时候你所在的公司基于安全因素考虑,要求你使用通过安全认证的代理访问因特网。这种情况下,就需要为Maven配置HTTP代理,才能让它正常访问外部仓库,以下载所需要的资源。
2.8.2 如何开启代理访问
(1)打开Maven配置文件
安装目录中:D:\Java\apache-maven-3.5.0-bin\apache-maven-3.5.0\conf\settings.xml
(2)修改配置文件
(3)填写代理服务器的配置信息
(4)保存文件
完成后,Apache Maven 应该是能够通过代理服务器立即连接到Internet。
2.9 -----maven私服搭建
2.9.1私服概述
在一个项目的团队之中,一定会有多台主机需要通过Maven取得相关的开发包,那么这个时候如果所有的主机都通过Maven的服务器进行开发包的下载,基本上每台电脑上缓存(1G-2G),那么这个时候网络根本就受不了,而且这些包都是重复下载的,没有任何意义,正因为如此,在团队的项目开发之中,会使用Nexus工具搭建一个私服,所有的开发者通过这个私服进行下载,如果现在需要的一个开发包在私服上不存在,那么就会自动通过一个Maven的中央仓库进行下载,并且将这个开发包保存在Nexus服务器上,这样当其他人需要此开发包的时候就不再需要通过网络下载开发包,而是直接使用Nexus服务器上的开发包即可。
Nexus私服的结构
2.9.2 私服的搭建
(1)下载sonatype Nexus来搭建私服
我们可以自己去下载https://www.sonatype.com/download-oss-sonatype。
下载该文件后对该文件进行解压缩。解压缩之后的文件如下。
(2)安装nexus服务
运行该目录下的install-nexus.bat文件(右击以管理员身份运行),该窗口会一闪而过,然后运行start-nexus.bat文件,等该文件运行窗口关闭后,在浏览器访问http://127.0.0.1:8081/nexus/。就会看到欢迎页面。
(3)创建私服仓库
然后点击右上角的login 进行登录,默认用户名:admin,密码:admin123。登陆后在右边选项卡 Views/Repositories下选择 Repositories就可以看到所有仓库,该地方不做过多的介绍,只介绍如何进行私服仓库配置。
选择上方的add按钮,然后选择hosted Repositiry创建一个本机仓库,填入仓库相应的信息即可创建成功。
2.9.3 私服认证
2.9.4 私服的使用
配置私服信息
和本地仓库一样,私服仓库也需要在setting.xml中进行配置,这样才能够访问。
在setting.xml 文件中找到<profiles></profiles>标签,在其中插入如下代码,其中的id,name标签内的内容必须要和在nexus中创建仓库是所填的仓库ID和仓库名称一致,URL标签内的内容就是该仓库创建后后面显示的地址。
<profile>
<id>localRepository</id>
<repositories>
<repository>
<id>myRepository</id>
<name>myRepository</name>
<url>http://127.0.0.1:8081/nexus/content/repositories/myRepository/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
然后还必须要激活改配置,在setting.xml文件的<activeProfiles></activeProfiles>标签内插入如下代码段。
<activeProfile>localRepository</activeProfile>
配置分发构建到私服的验证,在setting.xml文件的<servers></servers>标签内插入如下代码段
<server>
<id>myRepo</id>
<username>admin</username>
<password>admin123</password>
</server>
至此私服仓库就配置成功了。
搭建Nexus私服
Nexus基本结构:
这里写图片描述
这个工具是免费的(Nexus),可以直接通过“http://www.sonatype.com/download-oss-sonatype”网站上下载:
OOS免费开源版本:
这里写图片描述
本次使用的是“nexus-2.14.4-03-bundle.tar.gz”开发版本,这个版本就是一个war文件,上传到linux下即可(不一定要在Linux下配置),各个平台都可以配置,
因为这个地方需要下载包,而且下载包默认都是在C盘,系统受不了。
建议最好有单独的服务器运行私服Nexus
前提:你的Linux系统里面已经配置好了JDK以及JAVA_HOME
1.将nexus开发包进行上传;
2.随后将文件解压缩到“/usr/local/mynexus”目录之中
先建立“/usr/local/mynexus”文件夹:
mkdir /usr/local/mynexus
将上传的压缩文件进行解压缩控制:
tar xzvf /srv/ftp/nexus-2.14.4-03-bundle.tar.gz -C /usr/local/mynexus
cd /usr/local/mynexus
解压缩后可以发现会有两个子文件夹出现,主要使用的是nexus-2.14.4-03,另外一个是“sonatype-work”保存的是所有的配置文件的信息。
3.进入到/usr/local/mynexus/nexus-2.14.4-03目录下
cd /usr/local/mynexus/nexus-2.14.4-03
而后准备启动nexus的项目
nexus自动集成了jetty工具包,这个就属于小型的webContainer
,它可以自动启动一个web服务
进入到bin目录下
cd /usr/local/mynexus/nexus-2.14.4-03/bin
编辑“nexus”文件
vim /usr/local/mynexus/nexus-2.14.4-03/bin/nexus
里边有个RUN_AS_USER,修改为root
这里写图片描述
需要修改运行的用户(没用):RUN_AS_USER = root
启动nexus服务:bin目录下执行
cd /usr/local/mynexus/nexus-2.14.4-03/bin
./nexus start
4.现在相当与内部启动了一个小型的WEB服务器,那么这个服务器可以直接通过IP地址找到
连接地址:http://IP地址:8081/nexus/
就可以进入到控制台:不要随意修改
这里写图片描述
这里写图片描述
5.完成之后进行登陆,用户名为admin,密码为admin123
这里写图片描述
登陆成功:
这里写图片描述
Public Repositories
最关注的是Central
6.将所有的proxy中的下载配置打开
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
选择repair index,否则可能导致无法下载:
这里写图片描述
以后的仓库地址:http://192.168.28.253:8081/nexus/context/groups/public/
这里写图片描述
7.虽然这个时候配置好了maven私服,但是这个私服要想使用还需要在配置文件里面进行引用:
第一种模式,修改每一个项目的pom.xml文件:
<repositories>
<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>Central Repository</name>
<url>http://192.168.28.253:8081/nexus/context/groups/public/</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>Central Repository</name>
<url>http://192.168.28.253:8081/nexus/context/groups/public/</url>
</pluginRepository>
</pluginRepositories>
表示所有的下载都通过私服下载,如果私服没有,则通过网络下载
这个配置只针对一个配置文件有效,多个项目的时候采用第二种模式
第二种模式:在settings.xml文件中配置一个公共的私服下载:
先配置连接服务器:
<servers>
<server>
<id>nexus-releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
配置连接镜像:
<mirror>
<id>nexus-releases</id>
<mirrorOf>*</mirrorOf>
<url>http://192.168.28.253:8081/nexus/context/groups/public/</url>
</mirror>
<mirror>
<id>nexus-snapshots</id>
<mirrorOf>*</mirrorOf>
<url>http://192.168.28.253:8081/nexus/context/groups/public/public-snapshots</url>
</mirror>
设置核心配置文件:
<profiles>
<profile>
<id>env-dev</id>
<repositories>
<repository>
<id>Public</id>
<name>Public Repositories</name>
<url>http://192.168.28.253:8081/nexus/content/groups/public/</url>
<layout>default</layout>
<snapshotPolicy>always</snapshotPolicy>
</repository>
</repositories>
</profile>
<profiles>
启动配置文件:
<activeProfiles>
<activeProfile>env-dev</activeProfile>
</activeProfiles>
这样就表示所有的开发包将通过私服nexus进行下载:
按照之前的javawork项目,在pom.xml新增开发包:servlet包、
jstl包等
这里写图片描述
证明通过私服(在linux远程服务器上)去网络下载,再次下载时只需要通过私服下载,无须通过网络。
查看私服服务器上是否有对应jar包
这里写图片描述
此处是有内容的,表示私服已经开始工作。
二次下载速度得到很大的提升。
Maven和私服Nexus一定是联系紧密的。
一个团队里面一定要有一个专门的nexus私服存在,为所有的开发者提供方便。而且私服还是去标准的中央仓库进行下载,也许速度慢,但是由于就下载一次,所以无所谓。
Eclipse+Maven
私服仓库:http://192.168.28.253:8081/nexus/content/groups/public/
在开发之中对于开发包的管理一直是一件头疼的事情,而我们最初的时候可以使用Eclipse进行开发包的管理的管理操作,并且基本上eclipse都能够保证开发包的正确(很多时候错误的话也让人很头疼)。于是有了Maven之后,现在就可以抛开这种智能化的开发工具,直接使用原生的Eclipse J2EE版工具进行开发。
同时项目之中存在nexus私服,这样也有利于整个项目团队的开发包的管理。
1.如果要想在eclipse之中使用Maven,必须保证已经准备好了Maven相关的开发包,同时已经配置好了settings.xml文件,这个文件里面定义有私服的链接地址。
eclipse首选项 —Maven
这里写图片描述
添加新的Maven配置,安装自己的maven开发工具包,表示已经可以使用。
2.而后还需要将之前开发里面配置的settings.xml文件的路径设置到eclipse之中。
User-Settings
这里写图片描述
3.建立一个maven项目,但是要求是基于webapps结构定义的
速度会比较慢,整个项目的建立可能无法一次性成功,如果不行就多建立几次,重新启动eclipse。
这里写图片描述
此时组织名称为cn.mldn,而项目名称为crm,所以最终的包名称就是cn.mldn.crm。
如果此时发现无法创建的话,有可能是你的网络问题,也有可能是你的环境问题,总之,Maven的处理操作有很多不确定性。
4.但是需要注意的是,此时的Maven的项目默认是基于jdk1.5(j2SE5.0)的,需要将其变更为jdk1.7的环境。
这里写图片描述
更改完成之后:
这里写图片描述
报错,原因可能是没有servlet包,所以需要在本项目的pom.xml中添加servlet包,即可
这里写图片描述
随后更改完级别之后
5.除了更改整个项目的JDK使用库之外,还需要将编译的级别变变更为 jdk1.7。
除此之外:Facets
Project也需要调整为JDK1.7
这里写图片描述
6.还需要修改整个项目之中的整体配置项:
先更新java的版本为1.7
随后取消动态的web配置,先应用,先将其修改为3.1,再应用,在将其选中;
7.随后还要求随意建立一个web项目,目的是拷贝一些文件出来,
(WEB-INF下的web.xml)
将web.xml文件拷贝到新项目之中
8.此时配置完成,随后就可以将其发布到tomcat之中进行使用了。
新建index.jsp
启动tomcat并可以访问得到
总结:
这种配置的处理操作有一些复杂,特别是已经习惯于使用MyEclipse的开发人员,但是这个在很多的开发之中都会使用。
所以Eclipse+Maven这样的开发必须掌握熟练。
包含私服Nexus的使用过程。