Maven

Maven

Maven是基于项目对象模型(POM project object model),可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具
pom.xml获取junit的jar包的编写
为什么通过groupId、artifactId、version三个属性就能定位一个jar包?
在每个创建的maven项目都会要求写上这三个属性值的

仓库的概念

本地仓库

  Maven会将工程中依赖的构件(Jar包)从远程下载到本机一个目录下管理。

第三方仓库

  第三方仓库,又称为内部中心仓库,也称为私服
私服:
  一般是由公司自己设立的,只为本公司内部共享使用。它既可以作为公司内部构件协作和存档,也可作为公用类库镜像缓存,减少在外部访问和下载的频率。(使用私服为了减少对中央仓库的访问。私服可以使用的是局域网,中央仓库必须使用外网。也就是一般公司都会创建这种第三方仓库,保证项目开发时,项目所需用的jar都从该仓库中拿,每个人的版本就都一样。
注意:连接私服,需要单独配置。如果没有配置私服,默认不使用

中央仓库

  Maven内置了远程公用仓库。这个公共仓库是由Maven自己维护,里面有大量的常用类库,并包含了世界上大部分流行的开源项目构件。目前是以java为主。工程依赖的jar包如果本地仓库没有,默认从中央仓库下载。
获取jar包的过程

maven java项目结构

—pom.xml    核心配置,项目根下
—src
 —main      
  —java    java源码目录
  —resources  java配置文件目录
 —test
  —java    测试源码目录
  —resources  测试配置目录
在这里插入图片描述
图中有一个target目录,是因为将该java项目进行了编译,src/main/java下的源代码就会编译成.class文件放入target目录中,target就是输出目录。

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 输出目录

命令操作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  --将压缩文件上传私服

maven项目的完整生命周期,当执行生命周期后面命令时,前面步骤的命令自动执行
在这里插入图片描述
红色标记字体的意思就是当我们直接使用mvn install命令对项目进行上传至本地仓库时,那么前面所有的步骤将会自动执行,比如源代码的编译,打包等等。

其他命令

maven java或web项目转换Eclipse工程
mvn eclipse:eclipse
mvn eclipse:clean  清楚eclipse设置信息,又从eclipse工程转换为maven原生项目了

依赖(坐标)的常见配置

    为了避免不知道说的哪些配置属性,看下面图就明白了,就是dependency下的属性配置,全部有9个,讲其中的7个。
    groupId、artifactId、version是依赖的基本坐标,缺一不可,这三个可以不用将,都知道,重要的是除了这三个之外的配置属性需要我们理解
type: 依赖的类型,比如是jar包还是war包等.默认为jar,表示依赖的jar包
注意:pom.lastUpdated 看到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来配置更合理。
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,以便我们不会报错,所以,这两个很特殊。
    所以,根据这个特点,如果使用maven开发项目,就不是web项目了,那么myeclipse就不会在给我们提供这两个jar包,我们就必须自己手动通过坐标从仓库中获取,但是针对上面的分析,当运行的时候,tomcat会帮我们提供这两个jar包,所以我们自己从仓库中获取的jar包就不能和tomcat中的冲突,那么就正好可以通过provided这个属性,来设置这两个jar的作用范围,就是在变异时期和测试时期生效即可。
  • system:表示我们自己手动加入的jar包,不属于maven仓库(本地,第三方等),属于别得类库的这样的jar包,只在编译和测试期生效,运行时无效。一般不用。
依赖调节原则

这个就是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会先根据第一原则进行选择,第一原则不成,则按第二原则处理。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值