maven的基本使用

在学习Spring框架的过程中,要导入很多jar包,不但非常麻烦,初学时还很容易忘记要用哪些jar包,尤其是有依赖关系的jar包。偶然看到有使用maven构建web项目的方法,可以非常方便的管理jar包还可以,就深入研究了一下。

一、jar包的导入引发的问题

在学习使用框架的时候,要先导入一些jar包,比如:spring-webmvc-4.1.5.RELEASE.jar。
使用SSM框架时要导入十几个jar包,需要手动一个一个导入,非常繁琐,还容易遗忘有依赖关系的一些jar包,(比如,要使用A包,A依赖于B,C,D,要使用A,就要先导入B,C,D,有些依赖容易忘记,有些依赖可能根本不知道)。

为了解决这种依赖关系,可以使用maven来构建和管理项目。

二、maven是什么?

maven是工具,是基于项目对象模型(POM project object model),可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具。

我认为maven的核心功能是合理描述项目间的依赖关系,就是通过pom.xml文件的配置获取jar包,而不用手动去添加jar包,如果需要使用pom.xml来获取jar包,那么首先该项目就必须为maven项目,maven项就是在java项目和web项目的上面包了一层maven,本质上java项目还是java项目,web项目还是web项目,但是包了maven之后,就可以使用maven提供的一些功能了(比如:通过pom.xml添加jar包)。

三、maven的安装

(一),手动安装maven

  1. 官网下载,并解压到一个目录。

  2. 配置环境变量,打开系统环境变量新建一个M2_HOME将解压后的maven存放路径放在此,然后在path路径加入M2_HOME\bin路径
    在mac中加入~/.bash_profile中

    mvn.png

  1. 输入mvn-v检测是否安装成功


    mvn-v.png
  1. 复制M2_HOME/conf/setting.xml文件到$user.home/.m2/setting.xml,这样用户每次升级后就不要在次修改setting.xml文件了。如果不设置setting.xml,就会按照默认的设置执行。根目录下的设置是全局的,用户目录下的设置只对当前用户起作用。

(二),高版本的Eclipse,MyEclipse中已集成了maven,可以直接使用。


MyEclipseMaven.png

设置maven为自己安装的版本


MyEclipseMaven2.png

这两种方式的区别是,自己安装的可以自己设置配置文件,并使用命令行来管理项目,而集成的配置是默认好的,且使用不了命令行。

四、仓库的概念

通过pom.xml中的配置,就能够获取到想要的jar包,但是这些jar是在哪里呢?我们从哪里获取到的这些jar包?答案是仓库。
仓库分为:本地仓库、第三方仓库(私服)、中央仓库

  • 本地仓库,Maven会将工程中依赖的构件(Jar包)从远程下载到本机一个目录下管理,每个电脑默认的仓库是在 $user.home/.m2/repository下
  • 第三方仓库,又称为内部中心仓库,也称为私服。一般是由公司自己设立的,只为本公司内部共享使用。它既可以作为公司内部构件协作和存档,也可作为公用类库镜像缓存,减少在外部访问和下载的频率。(使用私服为了减少对中央仓库的访问)。注意:连接私服,需要单独配置。如果没有配置私服,默认不使用
  • 中央仓库,Maven内置了远程公用仓库:http://repo1.maven.org/maven2。这个公共仓库是由Maven自己维护,里面有大量的常用类库,并包含了世界上大部分流行的开源项目构件。目前是以java为主,工程依赖的jar包如果本地仓库没有,默认从中央仓库下载。

五、在MyEclipse中使用maven创建web项目

步骤

  1. 右键,new maven project


    new1.png
  1. 选中Create a simple project


    new2.png
  1. 填写项目名


    new3.png

或者选择用模板创建项目

  1. 不选Create a simple project,直接下一步,在弹出的对话框中选择类型


    new4.png
  1. 填写项目名


    new5.png

创建完项目后,有几点要注意:

  • 更改jre版本


    new6.png
  • 如果是使用simple project创建项目,则需要生成web.xml文件(使用模板创建的项目会自动生成)


    new7.png

项目结构如下

structure.png

此时正常部署项目到服务器,并运行:


run.png

可能出现的问题

1)创建maven project时提示内存不足,要修改MyEclipse安装目录下的eclispe.ini 文件,把内存分配修改一下(如:1024m改成2048m)


err.png
q_0.png

2)pom.xml文件报错: Cannot detect Web Project version,


q_1.png

这是因为simple project 要指定编译war的版本,在pom.xml中加入以下代码:


q_2.png

在这里指定JRE版本是因为,使用maven update项目时,会在配置文件中查找版本号,默认的是1.5,如果你用的是1.7或1.8,没有在这里写明,就会update 项目后变成1.5而导致其他问题。

3)jsp报错,The superclass "javax,servlet.http.HttpServlet" was not found on the Java Build Path


q_3.png

在pom.xml添加依赖:


q_3_.png

4)导入maven项目时,Referenced file contains errors,这个错一般发生在导入maven项目时,


q_4.png

这时,只需update project即可:


q_4_.png

5)Cannot upgrade/downgrade to Dynamic Web Module 3.0 facet.


q_5.png

解决这个问题要更改一下web.xml中的版本约束:


q_6.png

6)WEB-INF文件夹下lib中没有jar包的问题:
maven用dependency来引用仓库中的jar包,所以,在lib文件夹下是没有jar包的,如果,我想引用自己写的一个jar包,就可以放在lib下,在部署到服务器时,会一同部署过去:


new8.png

六、pom.xml的依赖关系

在pom.xml中添加dependency即可引入jar包


depen.png

比如:我想添加spring-webmvc的jar包到项目中,可以在mavenRepository中央仓库中查找到相应的版本,把代码直接拷贝到pom.xml中即可:

mvnrepository.png

dependency有9个属性,或子节点


dependele.png
  1. groupId ---> 组名,一般是反向域名,基本属性,不可少

  2. artifactId ---> 项目名,基本属性,不可少

  3. version ---> 版本,基本属性,不可少

  4. type ---> 依赖的类型,比如是jar包还是war包等,默认为jar

  5. classifier ---> 定义构件输出的一些附属构件

  6. scope ---> 依赖范围,意思就是通过pom.xml加载进来的jar包,来什么范围内使用生效,范围包括编译时,运行时,测试时。

    • compile:默认值,如果选择此值,表示编译、测试和运行都使用当前jar
    • test:表示只在测试时当前jar生效,在别的范围内就不能使用该jar包。
    • runtime,表示测试和运行时使用当前jar,编译时不用该jar包。例如:JDBC驱动。JDBC驱动,在编译时(也就是我们写代码的时候都是采用接口编程,压根就没使用到JDBC驱动包内任何东西,只有在运行时才用的到,所以这个是典型的使用runtime这个值的例子),此处不写也不报错,理由同上
    • provided,表示编译和测试时使用当前jar,运行时不在使用该jar了。例如:servlet-api、jsp-api等。【必须填写】什么意思呢? 在我们以前创建web工程,编写servlet或者jsp时,没导入过jar包,因为myeclipse帮我们提供了这两个jar包,内置了,所以我们在编译期测试期使用servlet都不会报缺少jar包的错误,而在运行时期,离开了myeclipse,就相当于缺失了这两个jar包,但此时tomcat又会帮我们提供这两个jar,以便我们不会报错。如果使用maven开发项目,就不是web项目了,那么myeclipse就不会在给我们提供这两个jar包,我们就必须自己手动通过坐标从仓库中获取,但是针对上面的分析,当运行的时候,tomcat会帮我们提供这两个jar包,所以我们自己从仓库中获取的jar包就不能和tomcat中的冲突,那么就正好可以通过provided这个属性,来设置这两个jar的作用范围,就是在变异时期和测试时期生效即可。
    • system:表示我们自己手动加入的jar包,不属于maven仓库(本地,第三方等),属于别得类库的这样的jar包,只在编译和测试期生效,运行时无效。一般不用
  7. systemPath ---> 当maven依赖本地而非repository中的jar包,sytemPath指明本地jar包路径

  8. exclusions ---> 排除传递依赖,解决jar冲突问题。
    依赖传递的意思就是,A项目 依赖 B项目,B项目 依赖 C项目,当使用A项目时,就会把B也给加载进来,这是传递依赖,依次类推,C也会因此给加载进来。这个有依赖传递有好处,也有坏处,坏处就是jar包的冲突问题,比如,A 依赖 B(B的版本为1),C 依赖 B(B的版本为2),如果一个项目同时需要A和C,那么A,C都会传递依赖将B给加载进来,问题就在这里,两个B的版本不一样,将两个都加载进去就会引起冲突,这时候就需要使用exclusions这个属性配置了。

  9. optional ---> 标记依赖是否可选。默认值false

依赖调节的两个原则

这个就是maven解决传递依赖时jar包冲突问题的方法:
1、第一原则:路径近者优先原则
A-->B-->C-->D-->X(1.6)
E-->D-->X(2.0)
使用X(2.0),因为其路径更近

2、第二原则:第一声明者优先原则。就是如果路径相同,maven 默认配置在前面的优先使用
A-->B--> X(1.6)
C-->D--> X(2.0)
这样就是路径相同,那么如果A在前面,C在后面,则使用X(1.6)
maven会先根据第一原则进行选择,第一原则不成,则按第二原则处理。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281

推荐阅读更多精彩内容

  • Maven的基本了解 什么是Maven? Maven就是Apache下的一个开源项目。它是用纯java开发的。是一...
    Bcome阅读 2,693评论 0 7
  • 一、下载及安装 1、 下载最新版本的maven先到官网下载最新版本,下载完成后,解压到某个目录(本文中是C:\Ja...
    贱小得阅读 1,418评论 0 0
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,432评论 6 342
  • 简介 概述 Maven 是一个项目管理和整合工具 Maven 为开发者提供了一套完整的构建生命周期框架 Maven...
    闽越布衣阅读 4,212评论 6 39
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,112评论 18 139