本文主要讲解maven入门基础部分,关于更深层次的知识请阅读我的另一篇文章:项目管理Maven篇(2)- Sonatype Nexus
介绍
Maven是一个强大的项目管理工具,其构建特性被普遍用于项目管理,Maven本身也是由Java所开发,它的出现给项目管理带来了极大的方便,告别了手动构建的时代,至今使用Maven管理的大小型项目已经数不胜数,且Maven的使用比例一直在大幅增长。
引入背景
问题1:在项目没有引入Maven之前,开发一个项目常常是需要将所需要的jar包拷贝过来放到项目下,当项目不断扩大,项目下所依赖的包也更难管理,比如:spring的包可能会出现2个或3个或是更多的版本,这个时候项目开发成本不断增大,问题也随之而来。
问题2:在多模块项目开发时,项目A开发人员的功能模块依赖项目B开发人员的功能模块,在同步进行开发时常常不能及时有效的进行调试,jar包升级依赖问题得不到快速有效的解决。
概念部分
此部分为初次接触maven的朋友阅读部分,若了解maven的关系急需搭建项目的同学,请移步操作部分
Maven项目核心
Maven项目比普通的项目多一个pom.xml配置文件,这个xml文件主要描述该项目的构成,插件,以及项目依赖的外部jar包,pom全称为project object model。
项目描述
maven对项目坐标进行了统一管理,这里项目描述是指描述
项目的坐标等信息,描述具体如下:
modelVersion指定了当前Maven模型的版本号,目前版本默认是4.0.0
groupId:当前 Maven 项目所属的实际项目,跟 Java 包名类似,通常与域名反向一 一对应(比如org.springframework)
artifactId:当前 Maven 项目的一个模块,一般的,Maven 生成的构件,其文件名会以 artifactId 开头,如 mybatis-spring-1.2.2.jar
version:定义项目版本。
packaging:定义项目打包方式,如 jar,war,pom默认为 jar。
classifier:定义项目的附属构件,如 mybatis-spring-1.2.2-sources.jar,mybatis-spring-1.2.2-javadoc.jar,其中 sources 和 javadoc 就是这两个附属构件的 classifier。classifier 不能直接定义,通常由附加的插件帮助生成。
properties是用来定义一些配置属性的,例如project.build.sourceEncoding(项目构建源码编码方式),可以设置为UTF-8,防止中文乱码,也可定义相关构建版本号,便于日后统一升级
项目依赖
dependencies和dependency:前者为集合,包含多个后者,每个dependency即一个依赖,如上图依赖的junit就是通过唯一坐标去进行依赖的。
那么项目依赖就涉及到仓库的概念了,在开发工具中配置好依赖仓库后,则该项目会去仓库中进行依赖,下面介绍仓库的概念。
maven仓库
Maven仓库(repository)分为本地仓库、和远程仓库。
本地仓库:通俗讲为当前计算机的一个目录,用于存放对应的工程所需组件(jar包)。
远程仓库:是指非本地的远程网络上的仓库。私服、其他公共仓库、中央仓库均被称为远程仓库,远程仓库可以看做为一个庞大的项目组件仓库中心,私服是一种特殊远程仓库,它是部署局域网内的仓库。
我们安装开发工具带有maven功能后会被默认被初始化一个本地仓库,其路径在当前用户的.m2目录下,如下图:
仓库核心配置
那么maven项目究竟是怎么依赖上仓库的,依赖的步骤是什么呢?
-
maven项目是通过settings.xml文件对仓库进行依赖,开发工具配置好settings.xml文件后,其内容会被自动解析,settings.xml主要内容是描述仓库配置,仓库连接代理等具体参数等。开发工具设置图如下(原默认为该用户.m2目录仓库)。
此处已配置为自己的仓库,给大家先看看,下面会进行详细的讲解
依赖查找步骤如下:比如我前面项目我依赖了junit包,Maven工程首先会去本地仓库找这个jar包,当使junit的坐标无法在本地获取指定jar包时,本地仓库会从远程仓库中下载jar包,并放入本地仓库以备将来使用。
说了这么多估计作为初学者的你还是不太明白,怎么运用呢,怎么新建项目进行管理呢,那下面我们进入maven环境搭建,本地仓库设置,项目创建环节
操作部分
下载安装
其实常用的一些开发工具都已经集成了maven插件了,但一般我们开发人员都是自行下载进行安装,以免插件集成的bug问题
下载地址:http://maven.apache.org/download.cgi
下载后解压出来放到指定的目录,并且配置环境变量,和JDK环境变量类似,此步骤这里就不进行描述了,配置完后打开CMD命令窗口输入 mvn –version,若打出版本信息则表示安装成功,如下:
仓库配置
进入conf目录下会有一个settings.xml的配置文件,编辑修改本地仓库路径
集成Maven
我这里使用myeclipse进行演示,其他开发工具类似
-
添加指定刚刚下载解压出来的目录,选中bin上一层即可
修改User Settings保存
Maven项目创建(单项目)
此处你需要进行选择,若你需要创建一个简单的java项目选择此项即可,如下:
未勾选artifactId创建web项目时出现了Maven Webapp,如下:
我这里选择了quickstart创建普通java项目,接着下一步,这些属性maven描述那块已经描述过了,不明白的朋友可以仔细查看上述概念部分
大家可以看看你的仓库路径是否存在依赖的包了,如果不存在则会去远程中央仓库下载,依赖就是通过这个描述文件的唯一坐标识别的
下面我们添加一个spring-mybatis.jar包的坐标配置查看情况,去网上搜索下找到spring-mybatis的坐标
将中央库的唯一坐标添加进来,然后保存
保存后查看本地仓库,jar已经被下载下来了,因为你本地目录没有,所以会去中央库下载,若后续使用该版本的jar,则会首先通过坐标找到本地库的jar,如下图:
注:其实大家会发现本地仓库突然多了很多包,这是因为都是刚刚使用到的junit和spring-mybatis所依赖的包,也一起被下载了下来,大家是不是能够想明白呢?自己依赖了别的包,别的包当然也会依赖其他的包,这就是依赖传递,这里暂时不做详细介绍。
这样建立起来的项目结构并不能称为一个完整的maven项目,一个完整的maven项目应该包含如下部分结构,所以需要新建src/main/resource和src/test/resource资源,这个大家自己去创建就行了如下图:
Maven项目创建(多模块)
在实际开发中一般都是多模块进行开发了,比如spring下面含很多子模块,下面简单介绍多模块的创建
-
新增一个简单的父项目壳子,我这里选择site-simple,其实选什么都无所谓,只需要确定该项目pom.xml的package的值为pom
-
删除其中不要的东西,留下pom.xml即可
-
为parent项目添加1个子模块,这里选择module
-
取名core-edu,其Parent Project一定要选择刚刚那个项目作为父项目
-
继续下一步,这里我只建立一个普通的jar,选择quickstart即可
-
默认点击完成,即可看到工程目录下多了一个项目,而且在父项目下多了一个文件夹,此时可以查看父pom.xml文件
-
然后我们再在parent下面新建一个web项目,创建选择web app即可
我们来查看下子项目的pom.xml,大家可以看到出现了parent部分,那么这里有小知识点:凡是被parent圈住的项目,它的类型一定是pom,不可能是jar或war
Maven知识点很多,项目间的引用以及三方包管理一时也讲解不全,这里暂时不做讲解,大家有具体的问题可以具体查看网络资料,如有问题大家也可以提出来。