下载和安装
1:官方下载地址:http://maven.apache.org/download.cgi,选择windown版本下载并解压到你想安装的目录
2:需要配置jdk环境变量,maven就是java语言写的,所以前提是必须配置java的环境变量
Maven3.2 要求 JDK 1.6 或以上版本, 而 Maven 3.0/3.1 需要 JDK 1.5 或以上
3:Maven环境变量配置
4:验证是否安装成功,通过cmd命令窗口运行mvn-v进行查看
Maven基本概念的理解
那么maven中的jar包又是从哪来的呢?
仓库:存放构件( Maven的插件、自己开发的项目的模块,第三方框架或工具的jar包)的地方。
①本地仓库:本地本机放置构件的地方。Maven从远程仓库下载下来的构件,都存放在本 地仓库中,项目可以从本地Maven仓库中获取自己所依赖的文件,为当前本 机电脑上的所有Maven工程服务。
默认位置为系统用户下\.m2\repository
②远程仓库:
a中央仓库:架设在Internet上,为全世界所有Maven工程服务。
http://central.maven.org/maven2/
b私服:架设在当前局域网环境下,为当前局域网范围内的所有Maven工程服务
c 镜像:架设在各个大洲,为中央仓库分担流量,减轻中央仓库的压力,同时更快的响 应用户请求。
http://maven.aliyun.com/nexus/content/groups/public/
执行maven命令的时候,maven首先会到本地仓库查找构件
如果maven在本地仓库中找不到构件,就会去连接外网,到中央仓库去查找
如果无法联网或者找不到构件,则构建失败
settings.xml文件
Maven基本概念的理解
坐标:每个maven所依赖的库或者是maven项目都有一个唯一的标识,这个标识就是坐标。它的作用是让Maven在仓库中找到对应的构件
例如:在一个平面中使用x、y两个向量可以唯一的确定平面中的一个点。
在空间中使用x、y、z三个向量可以唯一的确定空间中的一个点。
1 groupid:公司或组织的域名倒序+当前项目名称
2 artifactId:当前项目的模块名称
3 version:当前模块的版本
如何通过坐标到仓库中查找jar包?
1 将gav三个向量连起来com.test.maven+Hello+0.0.1-SNAPSHOT
2 以连起来的字符串作为目录结构到仓库中查找com/test/maven/Hello/0.0.1-SNAPSHOT/Hello-0.0.1-SNAPSHOT.jar
注意:我们自己的Maven工程必须执行安装操作才会进入本地仓库。安装的命令是:mvn install
Pom.xml文件
Maven核心概念
Maven能够实现自动化构建和依赖管理与内部机制密不可分,想掌握Maven为什么能自动化构建和实现依赖管理,必须了解Maven的九个核心概念
1 POM
2 约定的目录机构
3 坐标
4 依赖
5 仓库
6 生命周期
7 插件和目标
8 继承
9 聚合
POM
POM(Project Object Model):项目对象模型。
将Java工程的相关信息封装为对象作为便于操作和管理的模型。
类比Java OOP:在java中一切皆为对象,包含属性和方法(行为),它大大地降低了软件开发的难度,使编程就像搭积木一样简单。
它是 Maven 中工作的基本单位,这是一个XML文件。
学习Maven就是学习pom.xml文件中的配置,pom.xml文件用来包含各种配置信息,POM也包含了目标和插件。
在执行任务或目标时,Maven 会使用当前目录中的
POM,读取POM得到所需要的配置信息,然后执行目标。
超级POM:所有的POM继承自父类,这个基础的POM被称为超级POM
约定的目录结构
为什么需要约定的目录结构
maven负责我们项目的自动化构建,以编译为例,maven想要自动编译,那么必须知道java源文件保存的位置
tip:我们在开发中如果需要让第三方工具或框架知道我们自己创建的资源文件在哪,那么基本上就是两种方式:
1以配置的方式告诉工具或者框架
spring à applicationContext.xml
2遵守约定
spring boot à application.properties
约定ß配置ß编码:简化开发
架构ß框架ß原始
意思就是能用配置解决的问题就不编码,能基于约定的就不进行配置。而Maven正是因为指定了特定文件保存的目录才能够对我们的Java工程进行自动化构建。
常用maven命令
mvnclean 清理target
mvn compile 编译主程序
mvn test-compile 编译测试程序
mvntest 执行测试程序
mvn package 打包
mvn install 将打包的文件安装到本地仓库
mvndeploy 将打包的文件发布到本地仓库和远程仓库
tips:执行与构建过程相关的maven命令,必须进入pom.xml所在的目录
生命周期理解
什么是生命周期
开发项目的时候,不断地在编译、测试、打包、部署等过程,maven的生命周期就是对所有构建过程抽象与统一,生命周期包含项目的清理、初始化、编译、测试、打包、集成测试、验证、部署、站点生成等几乎所有的过程。
Maven生命周期定义了各个构建环节的执行顺序,Maven自动化的执行构建命令的基石。
tips:生命周期类比为java设计模式之模版方法模式abstract父类具体方法
生命周期的种类了解
提供的几种生命周期
Maven有三套相互独立的生命周期,分别是:
1Clean Lifecycle 在进行构建之前进行一些清理工作。
2Default Lifecycle 构建的核心部分,编译,测试,打包,安装,部署等等。
3Site Lifecycle 生成项目报告,站点,发布站点。
它们是相互独立的,你可以调用clean来清理工作目录,仅仅调用site来生成站点。也可以直接运行mvn
clean install site 运行所有这三套生命周期。
每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。
tip:阶段可以类比为java设计模式之模版方法模式abstract父类抽象方法
Clean生命周期
Clean生命周期一共包含了三个阶段:
1pre-clean 执行一些需要在clean之前完成的工作
2clean 移除所有上一次构建生成的文件
3post-clean 执行一些需要在clean之后立刻完成的工作
Default生命周期
Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。解释一些比较重要和常用的阶段:
validate
............
process-resources 复制并处理资源文件,至目标目录,准备打包。
Compile 编译项目的源代码。
............
process-test-resources 复制并处理资源文件,至目标测试目录。
test-compile 编译测试源代码。
............
test 使用单元测试框架运行测试,这些测试代码不会被打包或部署。
............
package 接受编译好的代码,打包成可发布的格式,如JAR。
............
Install 将包安装至本地仓库,以让其它项目依赖。
Deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享或部署到服务器上运行。
1 maven的核心程序只定义了抽象的生命周期
2 各个构建环节有固定的顺序,必须按照顺序来执行
3 不论执行生命周期的那一个阶段,都是从生命周期最初的位置开始执行
插件
什么是插件
Maven的核心仅仅定义了抽象的生命周期,那么具体的任务是由谁实现的?
具体的任务都是由插件实现
tips:插件类比为java设计模式之模版方法模式继承abstract父类的子类,实现抽象方法(某个阶段),做具体的事情
1 生命周期各个阶段仅仅定义要执行什么任务
2 Maven的生命周期与插件目标相互绑定,以完成某个具体的构建任务
3 每个插件都能实现多个功能,每个功能就是一个插件目标
随着项目越来越大,我们需要将项目拆分成多个模块:
1多个模块之间如何调用和访问呢?
2多个模块之间的复杂jar包关系又该如何管理呢?
依赖
什么是依赖
当A jar包用到了B
jar包中的某些类时,A就对B产生了依赖。
为什么需要依赖?
如果不用依赖,我们需要将上面的包全部收到导入,在maven中只需要在pom.xml文件中配置dependency并可引用jar包
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3 </version>
<scope>compile</scope>
</dependency>
依赖的范围
依赖信息中除了目标jar包的坐标还有一个scope设置,这是依赖的范围。
依赖的范围有几个可选值,
compile、test、provided、 runtime、 system等
我们用得到的是:compile、test、provided三个。
运行时依赖范围(runtime),使用该依赖范围的maven依赖,只对测试和运行的classpath有效,对编译的classpath无效,典型例子就是JDBC的驱动实现,项目主代码编译的时候只需要JDK提供的JDBC接口,只有在测试和运行的时候才需要实现上述接口的具体JDBC驱动。
系统依赖范围(system),系统依赖范围必须通过配置systemPath元素来显示指定依赖文件的路径,此类依赖不是由maven仓库解析的,而且往往与本机系统绑定,可能造成构件的不可移植,因此谨慎使用
从开发和运行这两个不同阶段理解compile和provided的区别
依赖的排除
为什么需要依赖的排除
repository模块引入了一个依赖是dubbo,而dubbo又依赖了commons-logging,因为依赖的传递性将dubbo依赖的commons-logging引入repository模块,但是个别情况下commons-logging有可能是一个不稳定版,或对当前模块有不良影响,这时我们可以在引入dubbo的时候将commons-logging排除
依赖的原则
service模块引入了repository模块,因为依赖的传递性会讲repository依赖的jar包导入到当前模块,但是service模块引用的是最新版本的commons-logging,因为依赖的传递性,controller模块就有两个commons-logging版本,怎能解决呢?
这种情况就需要依靠maven依赖的原则,来解决jar包的冲突
依赖的原则分两种
1 路径最短者优先
2 路径相同时先声明者优先
依赖的统一管理
一般同一个框架的jar包用的都是对应相同的版本号,想要统一升级,怎么办?
这个时候就用到依赖的统一管理,可以将jar包的版本信息统一抽取出来,以后框架升级只需修改抽取出来的版本信息即可
1 在< properties >标签内使用自定义的标签统一声明版本号
2 在需要用的同一版本的位置,使用${自定义标签}引用抽取出来的版本信息即可
继承了解
如果项目中各个模块各自使用的jar包版本不统一(如junit),无法统一管理和统一升级,要统一版本或者统一升级的时候需要到每个模块中手动修改是不可取的那么这个时候怎么办?
由于非compile范围的依赖不能传递,所以必然导致每个模块需要引入自己的junit包,很容易造成版本不一样
这个时候就需要我们继承机制,使用继承机制就可以将这种非compile范围,无法传递的jar包依赖信息提取到父工程模块中进行统一管理。
实现继承
聚合
工程拆分成多个模块后,需要手动逐个按顺序将子模块安装到仓库后才能继续后续的操作。修改代码后也需要逐个手动进行clean操作。不仅麻烦,而且容易出错,这个时候又怎么办呢?
用maven的聚合就可以批量进行Maven工程的安装、清理工作。
实现聚合
在“总的聚合工程”中配置各个需要参与聚合的模块
配置子模块的顺序是可以错乱,maven会自动找到依赖的关系,按先后关系进行安装
多环境部署
在实际的项目开发中,通常会有很多配置环境,比如最基本的:开发、测试、生产;不同的环境,某些文件的配置是不一样的(如:数据库连接信息、properties文件的配置等),如果我们进行开发or测试时每次都得手动去修改配置文件,麻烦且容易出现问题,这个时候就需要maven的profile功能
maven的profile可以让我们定义一系列的配置信息,然后指定其激活条件。这样我们就可以定义多个profile,然后每个profile对应不同的激活条件和配置信息,从而达到不同环境使用不同配置信息的目的。
一般来讲,有三种地方可以定义,不同的地方,作用范围不同,可配置项也不同;
1 针对于特定项目的profile配置,我们可以定义在该项目的pom.xml中。
2 针对于特定用户的profile配置,我们可以在用户的settings.xml文件中定义profile。
3 该文件在用户目录下的“.m2”目录下。全局的profile配置。
建立三种环境的资源文件夹
tips:maven标准目录中,提供了一个filters目录用于存放资源过滤文件。推荐在filters目录下创建,而不是resources目录,因为resources目录中的文件默认情况下是不会被过滤的,还需在resources节点下额外的配置一些东西;这样的话结构也较清晰,resource目录存放公共资源文件,filters目录存放不同环境差异化资源文件。
1 在pom.xml中的project节点下配置profile
2 在pom.xml中的build节点下配置maven-resources-plugin插件
在构建WAR包的时候会经过资源文件处理阶段,maven-resources-plugin
则用来处理资源文件。
3 在pom.xml中的build节点下配置resources节点
4 测试,现在配置已经完成了,然后我们执行maven
update项目之后,资源目录会变化
接下来打包测试一下是否达到了我们的预期效果:mvn
clean package -P test
Maven快照
大型应用软件一般由多个模块组成,一般它是多个团队开发对应模块,这是比较常见的场景。
例如,一个团队正在对应用程序service模块进行开发,他们使用的是repository模块。
现在,它可能会有这样的情况发生,负责repository模块的团队快速地bug修复或增强功能,他们每隔一天就要释放出库到远程仓库。
现在,如果repository团队上传新版本后,会出现下面的问题:
1 repository团队应该发布更新时每次都告诉应用程序service团队,他们已经发布更新了代码。
2
service团队需要经常更新自己pom.xml以获得更新应用程序的版本。
为了处理这类情况,引入快照(SNAPSHOT)的概念
快照(SNAPSHOT )是一个特殊版本,指出目前开发拷贝。不同于常规版本,Maven 每生成一个远程存储库都会检查新的快照版本。
在使用版本时,如果 Maven
下载所提到的版本为repository
:1.0,那么它永远不会尝试在库中下载已经更新的版本1.0。要下载更新的代码,repository的版本必须要升级到1.1。
在使用快照(SNAPSHOT)时,Maven会在每次构建项目时自动获取最新的快照(
repository :1.0-SNAPSHOT)。
在使用快照(SNAPSHOT)时,Maven
自动获取最新的快照版本。
不过我们也可以强制使用 -U
切换到任何
maven
命令来下载最新的快照版本。
mvn clean package -U
专属Repository
目前我们的项目都是直接使用Maven提供的Central
Repository,但是对于公司来说直接使用公共的Maven Central Repository就不见得是件好事。
此时你可以创建一个公司专属的Repository(Internal
Repository),公司的所有项目都只和这个专属的Repository打交道,包括下载依赖,部署等。
1 代理外部Repository(比如Maven
Central Repository)。
2 通过代理,专属Repository还可以起到缓存的作用,这样公司的每个开发者只需要从局域网的专属Repository下载依赖,而不用消耗对外网络资源。
3 发布公司自己的项目,如果你开发的项目需要被公司的其他团队使用,而又不能发布到公司外部的Repository中,那么专属Repository是最好的选择。
4 发布一些购买的第三方软件产品以供公司所有人使用,比如Oracle的数据库Driver。
存在多种专属Repository,比如Nexus和Artifactory等,你甚至可以用一个FTP服务器做一个专属Repository
Nexus搭建
要求:centos7,jdk8
1 下载最新版 Nexus并解压,下载地址:https://www.sonatype.com/download-oss-sonatype,这里现在linux版本
wget https://sonatype-download.global.ssl.fastly.net/nexus/3/nexus-3.9.0-01-unix.tar.gz
tar -xvf nexus-3.9.0-01-unix.tar.gz
2 创建nexus用户,不用从root用户启动
//创建nexus用户
//目录组和用户都是nexus
// nexus3文件设置777
//编写配置文件
# useradd nexus
# chown -R nexus..nexus
nexus3
# chmod 777 -R nexus3
3 修改配置
设置访问端口
设置用户
4 启动nexus,进入nexus服务目录下的bin,然后执行./nexus
start或者./nexus
run
./nexus start //后台启动,不显示日志
./nexus run //后台启动,显示日志
5 浏览器输入http://192.168.1.150:8800即可访问nexus
默认用户名admin,默认密码admin123
Nexus介绍
Group:仓库组
Hosted:宿主仓库,发布内部项目构件和第三方项目构件(oracle驱动JDBC驱动)
Proxy:代理仓库
maven-public:仓库分组,把上面三个仓库组合在一起对外提供服务,在本地maven基础配置settings.xml中使用。
maven-central:maven中央库,默认从https://repo1.maven.org/maven2/拉取jar
maven-releases:私库发行版jar
maven-snapshots:私库快照(调试版本)jar
Nexus使用
配置私服,修改settings.xml
a < server ></server >
b < mirror></mirror>
c < profile></profile>
d <activeProfile></activeProfile>
上传到私服,修改工程配置pox.xml
< distributionManagement></distributionManagement>
也可直接通过nexus上传
网友评论