// 打包并且实行单元测试mvn clean package// 如果想跳过单元测试mvn clean package -DskipTests=true
有更多问题,欢迎大家不才面留言哈,我懂的一样平常都会解答,后期我会写一篇总结性的文章。
然后对maven不理解的看入门文章:
用了maven不用手动导入jar包,还能自己搭私服,发布自己的jar
先容我记得在搞懂maven之前看了几次重复的maven的传授教化视频。不知道是自己悟性太低还是怎么滴,便是搞不清楚,现在弄清楚了,基本上入门了。写该篇博文,便是为了帮助那些和我一样对付maven迷迷糊糊的人。有福了,看完基本上你就会创造原来这么大略。
maven的先容,初步认识,获取jar包的三个关键属性 --> 先容仓库(获取的jar包从何而来)-->用命令行管理maven项目(创建maven项目) --> 用myeclipse创建maven项目 -->详细先容pom.xml中的依赖关系(坐标获取、定位jar包的各种属性讲解。
一、大略的小问题?阐明之前,提1个小问题。
1.1、如果你正在Eclipse下开拓两个Java项目,姑且把它们称为A、B,个中A项目中的一些功能依赖于B项目中的某些类,那么如何维系这种依赖关系的呢?
很大略,这不便是跟我们之前写程序时一样吗,须要用哪个项目中的哪些类,也便是用别人写好了的功能代码,导入jar包即可。以是这里也如此,可以将B项目打成jar包,然后在A项目的Library下导入B的jar文件,这样,A项目就可以调用B项目中的某些类了。
这样做几种毛病
如果在开拓过程中,创造B中的bug,则必须将B项目修恰好,并重新将B打包并对A项目进行重编译操作
在完成A项目的开拓后,为了担保A的正常运行,就须要依赖B(就像在利用某个jar包时必须依赖其余一个jar一样),两种办理方案,第一种,选择将B打包入A中,第二种,将B也发布出去,等别人须要用A时,见告开拓者,想要用A就必须在导入Bjar包。两个都很麻烦,前者可能造成资源的摧残浪费蹂躏(比如,开拓者可能正在开拓依赖B的其它项目,B已经存储到本地了,在导入A的jar包的话,就有了两个B的jar),后者是我们常碰着的,找各种jar包,非常麻烦(有了maven就不一样了)
1.2、我们开拓一个项目,或者做一个小demo,比如用SSH框架,那么我们就必须将SSH框架所用的几十个依赖的jar包依次找出来并手动导入,超级繁琐。
上面两个问题的描述,实在都属于项目与项目之间依赖的问题[A项目利用SSH的所有jar,就说A项目依赖SSH],人为手动的去办理,很繁琐,也未便利,以是利用maven来帮我们管理
二、maven到底是什么?Maven是基于项目工具模型(POM project object model),可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具[百度百科]
这种又是大口语,如果没明白maven是什么,那么上面这句话跟没说一样,我自己以为,Maven的核心功能便是合理阐述项目间的依赖关系,普通点讲,便是通过pom.xml文件的配置获取jar包,而不用手动去添加jar包,而这里pom.xml文件对付学了一点maven的人来说,就有些熟习了,怎么通过pom.xml的配置就可以获取到jar包呢?pom.xml配置文件从何而来?等等类似问题我们须要搞清楚,如果须要利用pom.xml来获取jar包,那么首先该项目就必须为maven项目,maven项目可以这样去想,便是在java项目和web项目的上面包裹了一层maven,实质上java项目还是java项目,web项目还是web项目,但是包裹了maven之后,就可以利用maven供应的一些功能了(通过pom.xml添加jar包)。
以是,根据上一段的描述,我们终极的目的便是学会如何在pom.xml中配置获取到我们想要的jar包,在此之前我们就必须理解如何创建maven项目,maven项目的构造是若何,与普通java,web项目的差异在哪里,还有如何配置pom.xml获取到对应的jar包等等,这里提前理解一下我们如何通过pom.xml文件获取到想要的jar的,详细后面会详细讲解该配置文件。
pom.xml获取junit的jar包的编写。
为什么通过groupId、artifactId、version三个属性就能定位一个jar包?
加入上面的pom.xml文件属于A项目,那么A项目肯定是一个maven项目,通过上面这三个属性能够找到junit对应版本的jar包,那么junit项目肯定也是一个maven项目,junit的maven项目中的pom.xml文件就会有三个标识符,比如像下图这样,然后别的maven项目就能通过这三个属性来找到junit项目的jar包了。以是,在每个创建的maven项目时都会哀求写上这三个属性值的。
三、maven的安装
这一步maven环境的配置,我以为有必要安装一下,目的为了利用命令行创建maven项目,和利用命令行操作maven项目。这里不细讲,给出链接,跟安装jdk环境类似,maven的安装教程和配置
还有把稳,我以下用的是maven3.0.4版本(比较低的),你们可以下载最新的版本,最好是利用jdk1.7.
四、仓库的观点通过pom.xml中的配置,就能够获取到想要的jar包(还没讲解如何配置先须要理解一下仓库的观点),但是这些jar是在哪里呢?便是我们从哪里获取到的这些jar包?答案便是仓库。
仓库分为:本地仓库、第三方仓库(私服)、中心仓库
4.1、本地仓库
Maven会将工程中依赖的构件(Jar包)从远程下载到本机一个目录下管理,每个电脑默认的仓库是在 $user.home/.m2/repository下
例如我的就在:C:\Users\Administrator\.m2\repository
一样平常我们会修合法地仓库位置,自己创建一个文件夹,在从网高下载一个拥有相对完全的所有jar包的结合,都丢到本地仓库中,然后每次写项目,直接从本地仓库里拿就行了
这里面有很多各种各样我们须要的jar包。
修合法地库位置:在$MAVEN_HOME/conf/setting.xml文件中修正,
D:\java\maven\repository:便是我们自己创建确当地仓库,将网高下载的所有jar包,都丢到该目录下,我们就可以直接通过maven的pom.xml文件直接拿。
4.2、第三方仓库
第三方仓库,又称为内部中央仓库,也称为私服
私服:一样平常是由公司自己设立的,只为本公司内部共享利用。它既可以作为公司内部构件协作和存档,也可作为公用类库镜像缓存,减少在外部访问和下载的频率。(利用私服为了减少对中心仓库的访问
私服可以利用的是局域网,中心仓库必须利用外网
也便是一样平常公司都会创建这种第三方仓库,担保项目开拓时,项目所需用的jar都从该仓库中拿,每个人的版本就都一样。
把稳:连接私服,须要单独配置。如果没有配置私服,默认不该用
4.3、中心仓库
Maven内置了远程公用仓库:http://repo1.maven.org/maven2
这个公共仓库是由Maven自己掩护,里面有大量的常用类库,并包含了天下上大部分盛行的开源项目构件。目前因此java为主
工程依赖的jar包如果本地仓库没有,默认从中心仓库下载
总结:获取jar包的过程
五、利用命令行管理maven项目
5.1、创建maven java项目
自己创建一个文件夹,在该文件夹下按shift+右击,点开利用命令行模式,这样创建的maven[java]项目就在该文件夹下了。
命令:mvn archetype:create -DgroupId=com.wuhao.maven.quickstart -DartifactId=simple -DarchetypeArtifactId=maven-archetype-quickstart
mvn:核心命令
archetype:create:创建项目,现在maven高一点的版本都弃用了create命令而利用generate命令了。
-DgroupId=com.wuhao.maven.quickstart :创建该maven项目时的groupId是什么,该浸染在上面已经阐明了。一样平常利用包名的写法。由于包名是用公司的域名的反写,独一无二
-DartifactId=simple:创建该maven项目时的artifactId是什么,便是项目名称
-DarchetypeArtifactId=maven-archetype-quickstart:表示创建的是[maven]java项目
运行的条件:须要联网,必须上网下载一个小文件
运行成功后
在D:\java\maven\demo下就会天生一个simple的文件,该文件便是我们的maven java项目
5.2、maven java项目构造
simple
---pom.xml 核心配置,项目根下
---src
---main
---java java源码目录
---resources java配置文件目录
---test
---java 测试源码目录
---resources 测试配置目录
图中有一个target目录,是由于将该java项目进行了编译,src/main/java下的源代码就会编译成.class文件放入target目录中,target便是输出目录。
5.3、创建 maven web 项目
命令:mvn archetype:create -DgroupId=com.wuhao.maven.quickstart -DartifactId=myWebApp -DarchetypeArtifactId=maven-archetype-webapp -Dversion=0.0.1-snapshot
其他都差不多,创建maven web项目的话 -DarchetypeArtifactId=maven-archetype-webapp 比创建java项目多了一个 -Dversion=0.01-snapshot, 在创建java项目的时候也可以加上这个,如果不写,会默认帮我们加上1.0-snapshot。
在D:\java\maven\demo下就会天生一个myWebApp的文件
5.4、maven web项目构造
pom.xml 核心配置
src/main/java java源码
src/main/resources java配置
src/main/webapp myeclipse web项目中 WebRoot目录
|-- WEB-INF
|-- web.xml
src/test 测试
target 输出目录
5.5、命令操作maven java或web项目
编译:mvn compile --src/main/java目录java源码编译天生class (target目录下)
测试:mvn test --src/test/java 目录编译
清理:mvn clean --删除target目录,也便是将class文件等删除
打包:mvn package --天生压缩文件:java项目#jar包;web项目#war包,也是放在target目录下
安装:mvn install --将压缩文件(jar或者war)上传到本地仓库
支配|发布:mvn deploy --将压缩文件上传私服
5.6、例子:利用命令操作maven java项目
把稳:利用命令时,必须在maven java项目的根目录下,及可以看到pom.xml
描述:将maven java项目打包上传到本地仓库供别人调用
利用 mvn install
在本地仓库中查看是否有该项目
D:\java\maven\repository\com\wuhao\maven\quickstart\simple\1.0-SNAPSHOT
通过在本地仓库中的目录可以创造为什么通过groupId、artifactId、version可以定位到仓库中得jar包,也可以知道为什么groupId要利用公司域名的反写(由于这样唯一,不会与别的项目重名导致查找到的内容禁绝确)
5.7、maven项目的完全生命周期,当实行生命周期后面命令时,前面步骤的命令自动实行
赤色标记字体的意思便是当我们直策应用mvn install命令对项目进行上传至本地仓库时,那么前面所有的步骤将会自动实行,比如源代码的编译,打包等等。
5.8、其他命令
maven java或web项目转换Eclipse工程
mvn eclipse:eclipse
mvn eclipse:clean 清楚eclipse设置信息,又从eclipse工程转换为maven原生项目了
...转换IDEA工程
mvn idea:idea
mvn idea:clean 同上
六、利用Myeclipse创建maven自定义项目利用myeclpse创建项目前,须要在myeclipse中配置maven的一些信息
比如:配置本地仓库、安装自定义maven(myeclipse中高版本自带了maven)等,这里省略。
6.1、java项目
1、选择maven project,如果右键新建没有,通过other得到
2、创建一个大略项目(跳过骨架选择)
3、设置项目参数,创建java项目
4、创建java项目结果
6.2、创建maven web项目
1、同上
2、同上
3、设置项目参数,其他一样,选择打包办法不一样。
4、创建web项目结果
5、可能报错1:pom.xml报错
结果如下
然后须要更新一下项目,就不报错了。
6、报错2,编写jsp时报错
缺点信息为短缺serlvet-jar和jsp-jar包
办理:利用pom.xml定位导入相应的jar包
找到jsp-jar包,scope的浸染是表示该jar包的浸染范围,provided表示在编译和测试期有效,在运行期则无效。详细后面讲解pom.xml时会讲解到。
找到servle-jar包
pom.xml中检讨,修正
修正完后,创造两个jar包都加载进来了,项目无缺,不在报错了。
6.3、创建maven项目
都一样,在项目参数那里修正即可
结果
maven项目一样平常没用,在开拓中将一个项目拆分成多个项,就须要利用maven项目(pom项目)将其他子项目进行整合,下一章节讲解,很主要。很主要。
6.4、myeclipse maven操作
6--9 都是快捷办法
9 测试,相称于命令行 mvn test
8 安装,相称于命令行 mvn install 浸染:将其上传到本地仓库,详细见上面讲解
7 关联源码,这个不须要阐明吧,平常我们利用别的jar包也关联过源码
6 清理,mvn clean
5 maven bulid 实行maven命令,等效 mvn
4 maven build 5快速的操作
如果没有操作过,与5相同
如果操作过一次,将直接实行上一次5的命令
如果操作多次,将供应选择框
6.5、例子,将maven web项目发布到tomcat运行
命令:tomcat:run
通过网址即可访问,同时会将该项目上传到本地仓库。
七、pom.xml的依赖关系讲解(重点)之前一贯在利用pom.xml中找jar包最关键的三个属性,groupId、artifactId、version,该当有些印象了,也知道为什么通过这三个能找到对应的jar包,但是没有细讲个中的一些小的知识点,比如上面添加servlet-jar和jsp-jar的依赖时,涌现的一些属性就不太懂,以是,这一章节,就将依赖关系全面剖析。
7.1、如何获取坐标(也便是三个关键属性值)
办法1:利用网站搜索[从中心仓库拿]
步骤一:百度搜索关键字“maven repository”
步骤二:输入关键字查询得到须要内容,确定须要版本
步骤三、得到坐标
办法2、利用本地仓库,通过myeclipse得到坐标
上面已经先容过了如何从本地仓库获取对应jar,这里在大略阐述一下
步骤一:添加依赖,pom.xml文件中,右键
步骤二:得到坐标
7.2、依赖(坐标)的常见配置
为了避免不知道说的哪些配置属性,看下面图就明白了,便是dependency下的属性配置,全部有9个,讲个中的7个。
groupId、artifactId、version是依赖的基本坐标,缺一不可,这三个可以不用将,都知道,主要的是除了这三个之外的配置属性须要我们理解
type:依赖的类型,比如是jar包还是war包等
默认为jar,表示依赖的jar包
把稳:<type>pom.lastUpdated</type> 这个我们在上面添加servlet-jar的时候就碰着过,看到lastUpdated的意思是表示利用更新描述信息,占位符浸染,普通点讲,选择该类型,jar包不会被加载进来,只是将该jar包的一些描述信息加载进来,使别的jar包在引用他时,能够看到一些干系的提示信息,仅此而已,以是说他是个占位符,只要记住他的jar包不会被加载进来。
optional:标记依赖是否可选。默认值false
比如struts2中内置了log4j这个记录日志的功能,便是将log4j内嵌入struts2的jar包中,而struts2有没有log4j这个东西都没紧要,有它,提示的信息更多,没它,也能够运行,只是提示的信息就相对而言少一些,以是这个时候,就可以对它进行可选操作,想要它就要,不想要,就设置为false。
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这个属性配置了。maven也会有一个机制避免两个都加载进去,maven 默认配置在前面的优先利用,但是我们还是须要利用exclusions来配置更合理,这里利用spring bean 和 struts2 spring plugin 来举例子解释这个问题并利用exclusions办理这个问题。(spring bean 和 struts2 spring plugin都须要依赖spring-core,但版本不一样)
从本地仓库中找到这两个jar包
maven自己的办理方案如下
maven 默认配置在前面的优先利用,下面是证明
先将spring-beans加载进去的,以是会将spring-beans依赖的spring-core的版本加载进来。
先将struts2-spring-plugin加载进来,那么就会将其依赖的spring-core的版本加载进来
利用exclusions来配置
纵然struts2-spring-plugin 配置在前面,也须要利用3.2.0版本。则须要为struts2-spring-plugin 打消依赖(不该用3.0.5依赖)
把稳:这样,就将struts2-spring-plugin依赖的spring-core的版本打消依赖了,也便是该依赖的spring-core不会在加载进来,查看代码,看是否符合哀求,如果不符合哀求,须要手动的修正
scope:依赖范围,意思便是通过pom.xml加载进来的jar包,来什么范围内利用生效,范围包括编译时,运行时,测试时
compile:默认值,如果选择此值,表示编译、测试和运行都利用当前jar
test:表示只在测试时当前jar生效,在别的范围内就不能利用该jar包。例如:junit 。此处不写也不报错,由于默认是compile,compile包扩了测试
runtime,表示测试和运行时利用当前jar,编译时不用该jar包。例如:JDBC驱动。JDBC驱动,在编译时(也便是我们写代码的时候都是采取接口编程,压根就没利用到JDBC驱动包内任何东西,只有在运行时才用的到,以是这个是范例的利用runtime这个值的例子),此处不写也不报错,情由同上
provided,表示编译和测试时利用当前jar,运行时不在利用该jar了。例如:servlet-api、jsp-api等。【必须填写】
什么意思呢? 在我们以前创建web工程,编写servlet或者jsp时,就没导入过jar包把,由于myeclipse或者别的ide帮我们供应了这两个jar包,内置了,以是我们在编译期测试期利用servlet都不会报短缺jar包的缺点,而在运行期间,离开了myeclipse或别的ide,就相称于缺失落了这两个jar包,但此时tomcat又会帮我们供应这两个jar,以便我们不会报错,以是,这两个很分外。看图
1、开拓阶段(MyEclipse供应),看下图以此证明我们说的
java web 5.0项目:
java web 6.0项目:
2、运行阶段(tomcat供应)
以是,根据这个特点,如果利用maven开拓项目,就不是web项目了,那么myeclipse就不会在给我们供应这两个jar包,我们就必须自己手动通过坐标从仓库中获取,但是针对上面的剖析,当运行的时候,tomcat会帮我们供应这两个jar包,以是我们自己从仓库中获取的jar包就不能和tomcat中的冲突,那么就恰好可以通过provided这个属性,来设置这两个jar的浸染范围,便是在变异期间和测试期间生效即可。
这个例子就可以阐明上面创建maven web时产生的缺点和解决方案了。
system:表示我们自己手动加入的jar包,不属于maven仓库(本地,第三方等),属于别得类库的这样的jar包,只在编译和测试期生效,运行时无效。一样平常不用
7.3、依赖调节原则
这个便是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会先根据第一原则进行选择,第一原则不成,则按第二原则处理。
八、总结这篇文章的篇幅有点长,也花费了我挺多的韶光的,由于个中碰着一些bug,一贯找不出缘故原由,一度想放弃,但还是坚持了下来,这也只是maven的入门,知道大概怎么用,看别的该当就看得懂,实在项目中真正用的还是下一节所要讲解的。
原文:https://www.cnblogs.com/whgk/p/7112560.html