从初识Maven到使用Maven进行依赖管理和项目构建
前些天就安装了Maven,以备自己以后整合项目用,尤其是我们的ssh,ssm项目。想必好多人在开始的时候并不清楚Maven是什么,它能够帮助我们干什么。
所以在学习Maven之前我们一定要知道它是什么,并且知道它能够帮助我们干什么!
Maven是什么:
这里博主就偷个懒,引用了百度百科上面的解释,它的解释可能不一定完全描述这个Maven,但是对于初学者我们知道这个就行了。
Maven能够帮助我们干什么:
它的主要两个功能:
- 依赖管理(jar包管理)
- 构建项目
①我们知道java项目(web)在开发的过程中需要大量的jar包,这个导致我们的项目会非常的庞大,通过Maven,我们web项目再也不用导jar包了,我们只需要在Maven的主配置文件中添加相应jar包的标识(标识:公司或者组织名+项目名+版本号)就好了。
②项目的构建,我们可以通过Maven构建Maven项目,它开创了一套目录结构,对各种文件的分类更加的细致。
简单的介绍就到这里,更深入的我们后面慢慢提及。
(一)下载安装
废话少说,接下来我们到官网上下载Maven:http://maven.apache.org/
下载你想要的版本,然后解压到你的本地磁盘(路径不能有中文),最后就是配置环境变量(Maven的工作环境要有jdk,即要使用Maven就要有jdk环境),关于配置环境变量:前些天我碰到个小问题在也在我的一篇博文中简单描述了一下:
http://blog.csdn.net/qq_39266910/article/details/78708412
有兴趣的同学可以去看看!
(二)Maven仓库分类及配置
解压Maven过后就要配置Maven本地仓库,在说本地仓库前,我们先了解下Maven的分类:
(图片来自网络)
这个就是Maven仓库的三种类型,一个是我们程序员本地计算机上的本地仓库,默认目录为:C:\Users\john.m2\repository
当然我们可以修改这个路径,也就是配置我们的本地仓库了:
再涂鸦的路径下的setting文件下,找到<localRepository>
标签(原来在注释中,需要我们将它复制出来),并填上你想要的本地仓库路径。
(三)在eclipse中创建Maven项目
和我们通常创建项目一样,我们可以在File→new→
填写工作组,项目名,就可以完成创建Maven项目了。
下面我们来看看Maven项目的目录结构:
(四)Maven常用的命令
以下所有的命令都要在项目的根目录下进行。
Maven提供了一套命令,我们可以在dos小黑窗中使用,当对Maven项目使用这些命令的时候我们应该切换到该项目的根目录下。
命令一:
mvn clean
这个命令可以清除我们的target文件夹(这个文件夹存放编译后的.class文件)
命令二:
mvn compile
和上面的命令相反,这个命令是编译一个项目的,前提是我们当前命令行位置为该项目的根目录下。
命令三:
mvn test
这个命令可以进行单元测试,测试test文件夹下的方法(test文件夹下的java文件格式名为:XxxTest.java)
命令四:
mvn package
将项目打包,如果是java项目就打包为.jar文件,如果是web项目及打包成.war文件。
命令五:
mvn install
将一个项目打包放在本地仓库中,以便多个项目使用。
(五)在eclipse中配置Maven
我们之前在eclipse中创建了项目,那个使用eclipse中自带的Maven插件,我们想要用自己安装的Maven,需要在eclipse中配置:
在首选项的Maven中安装,add→directory中选择自己安装的目录。
然后别忘了勾选我们自己的Maven。
我们还需要指定我们Maven的仓库位置,也就是让eclipse知道我们的仓库在哪,我们只要将Maven中已经设置好的setting.xml指定给它就行,因为里面已经含有我们自定义仓库的位置,设置后下面就会自动出现我本地仓库的位置。
完成上面的操作后,我们还需要重构索引,即将仓库中的内容让eclipse加载一下:
这样就能在eclipse local Repository中查看我们本地仓库的内容了。
如果你完成了上述的操作,那么恭喜你,你的eclipse就完全支持maven操作了!
(六)创建Maven项目容易出现的问题
在创建好Maven项目后老是会出现一些问题:
①jdk版本出错
Maven(我的这个版本)默认是使用jdk1.5,如果你想要使用自己的jdk的话需要右击项目,build path ,edit一下当前项目使用的jdk就ok了。
②缺少web.xml
当我们创建好项目的时候可能缺少web.xml,这个时候我们需要自己手动的添加。
③刷新项目,jdk版本又返回jdk1.5
我们在做项目的时候,依赖在不断的增加,所以需要刷新项目来使得eclipse知道我们的jar包在哪,所以需要更新Maven项目:
右击项目→Maven→Update Project,然后我们的jdk会返回jdk1.5(因为项目默认jdk1.5),所以需要我们手动添加对jdk的约束:
设置全局的jdk,在setting.xml文件中的profiles元素下添加如下profile元素:
<profile>
<id>jdk17</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
设置局部的jdk,在项目的pom,xml文件中添加如下build元素:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
(七)添加依赖
做了那么多准备工作,下面我们就来试试Maven怎么进行依赖管理。
我们在Maven项目中创建一个Servlet,我们需要导入servlet-api.jar,只要在pom.xml 的dependencies视图下进行add就好了,如下图:
在涂鸦的搜索栏里搜索你想要的jar包,然后update Maven项目就ok了。
容易出现的问题:
搜索不出结果,试着做如下操作:
首选项→Maven→勾选涂鸦的选项
然后点击:
这样就会帮你下载一些常用jar包,过程有点慢,等待片刻!
最后Update Index 就ok了!
这样就可以放心的添加依赖了。
(八)依赖范围
在我们设置依赖的时候,会有一项Scope,里面有:
compile,provided,runtime,test,system五项。
(图片来自网络)
Maven默认的是compile,即对于编译classpath,测试classpath,运行时classpath 都需要这个jar包。
尤其值得注意的是provided,这个就像servlet-api那样,我们编译测试都需要这个jar包,但是当上传到服务器的时候就不再需要了(Tomcat的lib下有),如果这里我们默认compile,那么当程序在服务器上运行的时候将出现jar包的冲突!
(九)使用Maven运行web项目
在eclipse中,我们是直接打开Tomcat,并将项目添加到Tomcat上,Maven也可以直接启动Tomcat而不需要借助Eclipse,具体的步骤:
右击项目→Run As→Maven Build ...
然后在Goals中输入:
tomcat:run,这样我们就将这个项目发布到服务器上了。
Debug:
右击项目→Debug As→Maven Build ...
然后在Goals中输入:
tomcat:run,和发布不同的是,我们需要将项目的源码关联进来!
过程:点击Source→add→Project→你想Debug的项目。
(十)依赖冲突解决
什么叫依赖冲突,在介绍它和解决它之前,我们先来了解下什么事传递依赖:
在一个Maven项目中,我们导入一个包后,Maven会帮你把它的依赖包全部导入进来,例如:你导入Struts2-core-2.3.5.jar,它会帮你把Struts2工程所需要的包全部导入进来,如果导入进来的jar包又依赖其他jar包,Maven会继续导入这个其他jar包。
所以就会产生这样一个状况:
A依赖B,B依赖C,A依赖C,这样叫一个传递依赖。
在上述的情况下,如果这个时候导入依赖D,D依赖C,这个时候就可能出现两个C,就会产生依赖冲突!
解决方案:
其实Maven不会让这两个jar包冲突,它有一套默认的调节原则:
①声明优先原则:
如果B依赖的C和D依赖的C冲突,那么使用B依赖的C jar包,因为B提前导入。
②最短路径原则:
如果我们就是想要使用D依赖的C jar包,我们只需要自己手动add依赖即可,Maven优先使用我们手动添加的依赖!
除了上面的两种方案,还有两种叫分别叫做
①依赖排除
具体的实在pom.xml的依赖层次视图下进行:
这样就可以手动的排除你不想使用的依赖jar包了。
②版本锁定(推荐使用)
<dependencyManagement>
<dependencies>
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</dependency>
</dependencies>
</dependencyManagement>
在配置文件里添加上面这个依赖管理,就可以指定我们想要的jar包版本,同时我们还可以使用ognl表达式来管理版本(当版本更新的时候)
当我们版本需要更新的时候,不必一个个去更换,只需要更换properties中的版本信息就Ok了!
总结:
Maven给我们构建项目和依赖管理带来了很大的便利,再也不需要我们苦恼导入jar包,和jar包版本冲突,并且提供了一套从编译到发布的方法,大大提高和加快了我们项目的项目进度。
本章主要就Maven的一些简单用法做出了一点介绍,希望给大家一点启发,如果错误,不吝赐教,万分感激!
从初识Maven到使用Maven进行依赖管理和项目构建的更多相关文章
- 使用Maven进行依赖管理和项目构建
什么是Maven 1 依赖的管理:仅仅通过jar包的几个属性,就能确定唯一的jar包,在指定的文件pom.xml中,只要写入这些依赖属性,就会自动下载并管理jar包. 2 项目的构建:内置很多的插件与 ...
- 使用maven-pom进行依赖管理与自动构建
使用maven-pom进行依赖管理与自动构建 span.kw { color: #007020; font-weight: bold; } /* Keyword */ code > span.d ...
- Maven(六)之依赖管理
前面讲了maven一些关于Maven的简单知识,今天我给大家分享一些Maven的依赖管理.我相信用过maven的人都知道,它很重要的功能就是通过依赖来添加jar包. 让我们领略一下Maven是怎么管理 ...
- 如何查看Maven项目的jar包依赖
问题 十年以前写java项目总会干这么一个事情: 调包. java项目往往依赖了很多第三方jar包,而这些jar包又有他自己依赖的第三方jar包,从而就能形成一个依赖树. 而程序运行要把这些所有的依赖 ...
- Maven学习(十八)-----Maven依赖管理
其中一个Maven的核心特征是依赖管理.管理依赖关系变得困难的任务一旦我们处理多模块项目(包含数百个模块/子项目). Maven提供了一个高程度的控制来管理这样的场景. 传递依赖发现 这是很通常情况下 ...
- Maven学习(十七)-----Maven外部依赖
Maven外部依赖 正如大家所了解的那样,Maven确实使用 Maven 库的概念作依赖管理.但是,如果依赖是在远程存储库和中央存储库不提供那会怎么样? Maven 提供为使用外部依赖的概念,就是应用 ...
- Apache Maven(四):依赖
依赖管理是Maven的特性之一,它是用户最为熟悉的特性之一,也是Maven擅长的领域之一.管理单个项目的依赖并没有太大困难,但是当您开始处理由数十或数百个模块组成的多模块项目和应用程序时,Maven可 ...
- maven 学习---Maven依赖管理
其中一个Maven的核心特征是依赖管理.管理依赖关系变得困难的任务一旦我们处理多模块项目(包含数百个模块/子项目). Maven提供了一个高程度的控制来管理这样的场景. 传递依赖发现 这是很通常情况下 ...
- 我们为什么要使用maven,公司推行maven杂谈
最近在公司内推荐使用maven,推荐一个落后于业内十年的技术,实在没什么好说的,可是没想到遇到了前所未有的阻力,总是听到各种各样的质疑,我就闹不明白了,推行这个东西是为了更规范的管理项目成果,方便大家 ...
随机推荐
- StackExchange.Redis学习笔记(四) 事务控制和Batch批量操作
Redis事物 Redis命令实现事务 Redis的事物包含在multi和exec(执行)或者discard(回滚)命令中 和sql事务不同的是,Redis调用Exec只是将所有的命令变成一个单元一起 ...
- Cache类缓存
此处主要总结System.Web.Caching.Cache类 该类是用于存储常用信息的类,HttpRuntime.Cache以及HttpContext.Current.Cache都是该类的实例. 该 ...
- js判断手机或Pc端登陆.并跳转到相应的页面
<script src="~/Web/js/jquery-1.10.1.min.js"></script> <script> $(functio ...
- 2017EIS CTFwriteup
EIS2017也就是2017年高校网络信息安全管理 运维挑战赛,全国一百多所高校参赛,侥幸拿了个地区三等奖,事先不知道理论赛占分比,不然就会是二等奖(吐槽),生活没有如果,下次努力吧. 比赛已经结束大 ...
- eclipse自定义代码模板
eclipse自定义代码模板 Eclipse 提供了非常多的代码模板,我们可以通过 Windows->Preferences->Java->Editor->Templates ...
- 操作系统学习笔记----进程/线程模型----Coursera课程笔记
操作系统学习笔记----进程/线程模型----Coursera课程笔记 进程/线程模型 0. 概述 0.1 进程模型 多道程序设计 进程的概念.进程控制块 进程状态及转换.进程队列 进程控制----进 ...
- Mysql第一周
前言:好久不见,我又来写博客拉.上个月只写了几篇django-rest-framework的,而且还是根据官网的英文写的.干货不多,内心还是有点羞耻的…… 简单说下我11月去干嘛了.11月初美图给我发 ...
- 在centos上搭建SVN服务器和MySQL
----------搭建MySQL--------------- 1.查看yum库中的mysql yum list | grep mysql //查看yum库中的mysql 2.选择需要的mysql进 ...
- 虚拟机下 solr7.1 cloud 集群搭建 (手动解压和官方脚本两种方式)
准备工作: vmware workstation 12,OS使用的是ubuntu16.04,三台虚拟机搭建一个solr集群,zookeeper共用这三台虚拟机组成zookeeper集群. zookee ...
- Python函数篇(二)之递归函数、匿名函数及高阶函数
1.全局变量和局部变量 一般定义在程序的最开始的变量称为函数变量,在子程序中定义的变量称为局部变量,可以简单的理解为,无缩进的为全局变量,有缩进的是局部变量,全局变量的作用域是整个程序,而局部变量的作 ...