Maven:核心功能是合理叙述项目间的依赖关系,就是通过pom.xml文件的配置来获取jar包,而不用手动去添加jar包。
Maven主要做了两件事:
下面我们来对比一下,首先建立一个普通的Java工程,是这样的:
这个我们都很熟悉,src下建包写代码,那么配置文件放在哪里?单元测试代码放在哪里?没有一个统一标准,更多时候都是开发者的自由发挥,每个人有自己的风格,这并不十分适合团队协作。接下来,看一下使用maven构建一个普通Java项目之后的目录结构:
看到使用Maven构建的普通Java项目,对源代码、单元测试代码、资源乃至后续需要的文件都有专门的目录规划。
上面的最后有一个pom.xml,这是Maven的核心配置文件,pom称为Project Object Model(项目对象模型),它用于描述整个Maven项目,所以也称为Maven描述文件。
当然事情不会这么简单,接下来,继续进入Maven的世界吧。
4.0.0
com.demo
demo
0.0.1-SNAPSHOT
pom
demo_base
demo_web
子工程:
4.0.0
com.demo
demo
0.0.1-SNAPSHOT
demo_web
war
这是Maven的核心文件:
1、modelVersion
指定了当前Maven模型的版本号,对于Maven2和Maven3来说,它只能是4.0.0。
2、groupId
一般来说groupId是由三个部分组成,每个部分之间以".“分隔,第一部分是项目用途,比如用于商业的就是"com”,用于非营利性组织的就是"org";第二部分是公司名,比如"tengxun"、“baidu”、“alibaba”;第三部分是你的项目名。
3、artifactId
可以认为是Maven构建的项目名,比如你的项目中有子项目,就可以使用"项目名-子项目名"的命名方式。
4、version
版本号,SNAPSHOT意为快照,说明该项目还在开发中,是不稳定的版本。其中groupId、artifactId、version三个元素生成了一个Maven项目的基本坐标,这非常重要。
在上面的这些元素之外,还有一些元素,同样罗列一下:
1、packing
项目打包的类型,可以使jar、war、pom,默认是jar。
2、dependencies和dependency
前者包含后者。前面说了,Maven的一个重要作用就是统一管理jar包,为了一个项目可以build或运行,项目中不可避免的,会依赖很多其他的jar包,在Maven中,这些依赖就被称为dependency。
说到这里,就有一个本地仓库和远程仓库的概念了。
本地仓库和远程仓库是这样的,Maven工程首先会从本地仓库中获取jar包,当无法获取指定jar包时,本地仓库会从远程仓库(中央仓库)中下载jar包,并放入本地仓库以备将来使用。
举个例子,比方说我的项目中用到了MyBatis,那么可以这么配置:
org.mybatis
mybatis
3.2.5
之前有说过groupId、artifactId、version唯一标识一个Maven项目,有了这三个元素,我们就可以去远程仓库下载MyBatis3.2.5.jar到本地仓库了。回想我们之前的做法,如果要MyBatis的jar包,发现没有,然后去网上下载一个,需要另外的jar包,然后去网上下载一个,但是有了Maven,就方便多了,只需要配置jar包对应的dependency依赖,Maven会自动帮助我们去远程仓库中下载jar包到本地仓库中。
3、properties
properties是用来定义一些配置属性的,例如project.build.sourceEncoding(项目构建源码编码方式),可以设置为UTF-8,防止中文乱码,也可定义相关构建版本号,便于日后统一升级。
4、build
build表示与构建相关的配置,比如build下有finalName,表示的就是最终构建之后的名称。
1、我从SVN上下载了一个以Maven构建的工程,下载完毕没有jar包怎么办?
从资源库上下载下来的Maven工程,是没有jar包的,此时可以这么做:
(1)删除Maven工程,但是删除的时候不要删除本地工程里面的Maven工程,只删除MyEclipse或Eclipse中的Maven工程
(2)右键Import->Maven4MyEclipse->Existing Maven Projects,导入你的Maven工程,此时MyEclipse在构建工程的时候,假如你的本地仓库中没有dependcy中的jar包,便会去远程仓库下载jar包到本地仓库中。你的工程导入完毕之后,Library应该是这样的:
2、重新下载Maven工程所依赖的jar包、导入jar包都需要触发Maven工程的build workspace,那么如何才能触发Maven工程的build workspace?
找到一个pom.xml,随便修改一下,加一个空格、减一个空格什么的,ctrl+s保存一下,便会触发Maven工程的build workspace了
3、本地仓库的目录结构是什么样子的?
groupId、artifactId、version确定一个唯一的Maven,比方说我有一个mybatis的dependcy:
org.mybatis mybatis 3.2.5 那么mybatis的jar包应该在%Maven仓库地址%\org\mybatis\mybatis\3.2.5\这一路径下,看到了吧,先groupId,再mybatis,最后version,每个名字都是一个文件夹的名字4、有些jar包在dependcy里面有配置,Import了Maven工程,下载完工程所依赖的jar包之后,发现本地仓库里面却没有,怎么办?
可能是原先下载jar包的时候出了什么问题,从artifactId目录开始删除以下的所有文件/文件夹,然后触发一次Maven工程的build workspace就可以了
5、本地仓库中确定已经有jar包了,工程里面却报错,说找不到jar包,该怎么办?
应该有很多解决办法,目前解决的一种办法是,MyEclipse->Window->Preferences->搜索Maven->User Settings,Update Settings和Reindex点一下就好了。另外,可以尝试一下把本地Maven仓库内的jar包删除一下,然后重新build workspace,可能也可以。
6、Eclipse中的maven module和maven project的关系相当于父子关系。
当新建的项目中不存在父子关系时使用maven project。
当项目中存在父子关系时用project做父工程,module做子工程,module工程必须有父工程。
1、创建父工程
(1).打开eclipse,右键new->project,找到maven,选择maven Project点击next。
勾选创建一个简易工程Create a simple project
(2).填写组名跟项目名,注意packaging一定要选择pom!Finish。
(3).父控制器创建好之后,删除自动生成的src文件夹 。
2、创建子工程
(1).选中刚刚创建的maven项目右键new->project,找到maven,选择maven Module点击next。
(2).Module Name填写自己的子项目名,点击next 。
(3).一般的jar工程选择maven-archetype-quickstart模板,web工程选择maven-archetype-webapp模板。选完之后next 。
(4).Package里是系统默认生成的包,建议改成自己的包名,修改完点finish。
(5).这样就创建好了一个子模块,如果要创建多个子模块重复上面的步骤即可。
这里我创建了1个jar工程1个web工程。如图:
(6).为什么要使用父子工程
相比于原先的创建项目方式,我认为有以下优点:
父子工程对于模块的分离程度更高了
看一个例子:
按照以往的创建项目方式,一个maven项目就是一个大工程,一开始还能进行简单的测试编译,但是随着项目的不断变大和复杂化,后期再做改动则可能牵一发而动全身。但是使用父子工程,每个模块都是独立的,他们通过父控制器聚合在一起,这样当你要改动一个模块的时候你改动的也只是这一个模块而已,并不会影响其他的模块。
父子工程使代码更清晰,提高了重用
看一个例子:
父控制器的存在之一就是为了去除重复
一个项目存在多个模块,可能同时由多个人开发,比如abc3个模块,3个模块都是基于spring的那么3个开发都需要引入spring的核心jar包,这样就引入了3份,但是使用父子工程,则只需要在父工程中引入了,则子工程自动继承。
注意:
新创建的maven项目会出现一些报错信息:
pom.xml会报一些jar找不到的错误:这个时候右键项目–》build path–》:
如果Maven Dependencies报错有红叉,点开看看那个jar找不到,看看对应的路径里面有没有,如果没有添加进去。
maven工程依赖的jar包,在本地仓库有,但是pom.xml文件却报错找不到jar包
例如:Missing artifact com.ibm.db2:db2jcc_license_cisuz:jar:10.1
但在我本地的仓库中却存在这个jar包,解决方法:
在eclipse中的window->show view->other->maven Repositories打开maven Repositories视图,
然后在maven Repositories视图中选中local Repositories->Local Repository, 右键选择Rebuild Index;
3. 如果经过上面的方法后pom.xml文件还报错有红叉,可以试试右键run as -maven install或者clean install进行再次编译,然后maven-update project更新下项目,红叉会不会消失。
有的时候像这种本地明明有jar包,但是pom.xml还报找不到jar包的错误,试了以上各种方法依旧不行,有的时候重启多试几次不知道怎么回事就好了,也是晕乎乎的了