Maven入门
一、什么是Maven
Maven是基于项目对象模型(POM project object model),可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具。
二、为什么使用Maven
Maven的功能:
简化、标准化项目建设过程
无缝连接处理,编译,分配
增加可重用性并负责建立相关任务
Maven的核心功能是合理叙述项目间的依赖关系,通俗点讲,就是通过pom.xml文件的配置获取jar包。
三、Maven目录结构
1、Maven项目目录结构
src 项目源码
-main 项目主体根目录
----bin 脚本库
––java java源代码文件
––resources 资源库,会自动复制到classes目录里
––filters 资源过滤文件
––assembly 组件的描述配置(如何打包)
––config 配置文件
––webapp web应用的目录。WEB-INF、css、js等
-test 项目测试根目录
––java 单元测试java源代码文件
––resources 测试需要用的资源库
––filters 测试资源过滤库
-site Site(一些文档)
target 输出根目录
––classes 项目主体输出目录
––test-classes 项目测试输出目录
––site 项目site输出目录
2、Maven目录结构
(1)bin: maven运行脚本,命令。
(2)boot:包含 plexus-classworlds-2.23jar( plexus- classworlds是—个类加载器框
架,相对于java默认类加载器,他提供了更丰富的语法以方便配置, maven使用该框架加载
自己的类库)。
(3)conf:配置文件 setting.xml,修改该文件就可以在机器上全局的制定 maven的行为
但一般情况下,更倾向于复制该文件到~(用户目录)/m2/目录下,然后修改该文件,在用
户范围内制定 maven的行为。
(4)lib:包含 maven运行时所需要的ava类库,包括第三方的依赖类库。
(5)LICENSE. txt:记录了 maven使用该软件的许可证。
(6) NOTICE. txt:记录了 maven包含的第三方软件
(7) README. txt:记录了 maven的简要介绍
3、maven常用命令
(1) mvn help: system:该命令打印出所有的ava系统属性和环境变量
(2) clean:清理输出目录默认 target,。
(3) mvn clean compline:编译项目主代码,默认编译至 target/ classes目录下。
(4) mvn clean test: maven测试,但实际执行的命令有: clean:clean,resource resources, compiler: compile, resources testResources,compiler testcompile, maven在执行test之前,会先自动执行项目主资源处理,主代码编译,测试资源处理,测试代码编译等工作,测试代码编译通过之后默认在 target/ test-classes目录下生成二进制文件,紧接着 surefire:test任务运行测试,并输出测试报告,显示一共运行
了多少次测试,失败成功等
(5) mvn celan package: maven打包, maven会在打包之前默认执行编译,测试等操作,打包成功之后默认输出在 target/目录中
(6) mvn clean instal:! maven安装,让其他的项目直接引用这个项目。
(7) echo% MAVEN HOME%:查看 maven安装路径
(8) mvn:检查是否安装了 maven
(9) mvn dependency;ist:查看当前项目中的已解析依赖
(10) mvn dependency tree:查看当前项目的依赖树
(11) mvn dependency: analyse:查看当前项目中使用未声明的依赖和已声明但未使用的
四、Maven生命周期
1、Maven生命周期lifecycle由各个阶段组成,每个阶段由maven插件的plugin来执行完成,挂接一个goal,goal是任务的最小单元。
2、默认构建的生命周期:校验validate——初始化initialize——编译compile——测试test——打包package——集成测试integrationTest——安装install——部署deploy
3、常用命令 mvn complie;mvn test;mvn package; mvn clean compile;(clean作用是把之前生成的代码删去)
五、坐标
任何一个Maven项目,坐标是唯一标识,Maven坐标的元素包括groupId、artifactId、version、packaging和classifier。Maven的规则是:世界上任何一个构建都可以使用Maven坐标作为唯一标识,也是通过唯一标识,找到对应的Maven构建,如下实例所示:
<groupId>org.sonatype.nexus</groupId>
<artifactId>nexus-indexer</artifactId>
<version>2.0.0</version>
<packaging>jar</packaging>
1、groupId:定义当前Maven项目隶属的实际项目
groupID的标识方式与Java包名的表示方式类似,通常与域名反向一一对应
2、artifactId:该元素定义实际项目中的一个Maven项目(模块),推荐的做法是使用实际项目名称作为artifactId的前缀。
3、version:该元素定义了Maven项目当前所处的版本。
4、packaging:该元素定义Maven项目的打包方式
首先,打包方式通常与所生成构件的文件扩展名对应,比如packaging为jar,最终的文件名为nexus-indexer-2.0.0.jar用war作为打包方式的Maven项目,最终生成的构建会有一个.war文件,不过这不是绝对的。
其次,打包方式会影响构建的生命周期,比如jar打包和war打包会使用不同的命令。
最后,当不定义packaging时,Maven会使用默认值jar。
5、classifier:该元素用来帮助定义构件输出的一些附属构件
上述五个元素,groupId、artifacId、version是必须定义的,packaging是可选的(默认为jar),而calssifer是不能直接定义的。
六、依赖
1、依赖范围
maven中的依赖范围一共有以下几种:
compile 默认,对于编译,测试,运行三个状态都有效;
test 顾名思义,只针对执行test代码;
provided 对于编译和测试时有效,但运行时无效,典型的时servlet-api,运行时这个由容器来提供;
runtime 对测试和运行时有效,但编译时无效;
system 与provided的范围一样,但system必须显示的指定依赖文件,通过来进行指定,是与本机绑定的,所以基本很少用到;
import 不会对3总产生实际的影响,只能在dependencyManagement中使用;
以表格来表示的,如下:
2、传递性依赖
我们的工程,所使用的大多数情况下,不会只有一成依赖关系,例如 a依赖b,我们用a->b表示,那么,a->b,b->c,则a对于b是第一依赖,b对于c是第二依赖,而a对于c是传递性依赖。
3、依赖调节
假如有不同版本的包,他们都存在传递性依赖,如下
a->b->c->x(1.0)
a->b->x(2.0)
那么此时,根据maven依赖调节第一原则最短路径的规则,使用的x包的版本是2.0,如果当2个不同版本的包的依赖相同怎么办?这个时候就启动了第二原则,也就是按pom中声明的顺序,谁先被声明,谁优先的策略去选择包。
七、Maven仓库
1、Maven 仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库。在 Maven 中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。Maven 仓库能帮助我们管理构件(主要是JAR),它就是放置所有JAR文件(WAR,ZIP,POM等等)的地方。
2、Maven 仓库有三种类型:
(1)本地(local):Maven 的本地仓库,在安装 Maven 后并不会创建,它是在第一次执行 maven 命令的时候才被创建。运行 Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。
(2)中央(central):Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了大量常用的库。
中央仓库包含了绝大多数流行的开源Java构件,以及源码、作者信息、SCM、信息、许可证信息等。一般来说,简单的Java项目依赖的构件都可以在这里下载到。
(3)远程(remote):如果 Maven 在中央仓库中也找不到依赖的文件,它会停止构建过程并输出错误信息到控制台。为避免这种情况,Maven 提供了远程仓库的概念,它是开发人员自己定制仓库,包含了所需要的代码库或者其他工程中用到的 jar 文件。
3、Maven 阿里云(Aliyun)仓库
Maven 仓库默认在国外, 国内使用难免很慢,我们可以更换为阿里云的仓库。
第一步:修改 maven 根目录下的 conf 文件夹中的 setting.xml 文件,在 mirrors 节点上,添加内容如下:
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
第二步: pom.xml文件里添加:
<repositories>
<repository>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>