
为什么要学习maven?
maven 帮助我们构建项目、依赖管理。
原因1,在团队开发流程中:
从代码托管中心 git,把完整功能宕下来。再部署到linux服务器,但是该服务器里面一定不会安装idea。这个时候,就要借助于专门的构建工具maven来构建。
原因2,maven的依赖管理:
一个模块用到上百个jar包是非常正常的。非常的浪费磁盘空间。maven可以非常方便你的帮我们管理我们的jar包。
maven项目构建
Java项目开发过程中,构建指的是使用『原材料生产产品』的过程。
原材料:Java源代码、基于HTML的Thymeleaf文件、图片、配置文件...
产品:一个可以在服务器上运行的项目(指web应用)
构建是一个过程。构建过程包含的主要的环节:
这里打包、安装、部署的意思呢?
把我们的maven工程(打jar包的maven工程)执行第五步,打包后就跟我们用的第三方jar包一模一样,安装后,让我们的war包去依赖我们当前的jar包,其实就是Web工程里导入的jar包。放在Web工程的WEB-INF/lib目录下,最后让war包部署到服务器运行。要牢记:构建的最终产品就是war包。
打包的结果会存放在target目录下
jar包的名字是 artifactId-version.jar坐标和仓库中jar包的存储路径之间的对应关系
坐标:javax.servlet servlet-api2.5 上面坐标对应的jar包在Maven本地仓库中的位置:
Maven本地仓库根目录javaxservletservlet-api2.5servlet-api-2.5.jar
maven依赖管理:
jar包的种类和版本maven都可以精确的控制!
如果A工程里面用到了B工程的类、接口、配置文件等等这样的资源,那么我们就可以说A依赖B。
比如,junit-4.12依赖hamcrest-core-1.3。thymeleaf的依赖就更多了。。。
jar包统一的下载来源:maven会统一去中央仓库下载。
也可以设置一个镜像,比如阿里云镜像网站下载。
alimaven central aliyun maven http://maven.aliyun.com/nexus/content/groups/public
jar包下载失败:
情况一jar包没有下载完
1.clearLastUpdated.bat工具(把文件中路径改掉,改成我自己的本地maven仓库的地址)
情况二:下载完了但是内容不完全,如报错方法不存在,类不存在
使用文件校验工具,比较俩个值是否相等就可以判断是否丢包了,建议删了重新下载改jar包
创建maven格式的web工程
保证工作空间在我刚创建的d盘下的workspaces
配置好maven
1.设置打包方式
右小角会弹出一个小框,选择import changes
2. 打开项目结构:settings-project structure-moudle
跟idea版本有很大关系啊,最后使用了老师的2019.3.3,才有效果呢。
会自动出现web目录如下,且需要点击+号,手动加入路径
效果就是:会自动在srcmain下生成webapp目录
配置tomcat
点+
选择tomcat server
点击加号,加入maven-web:war exploded
jar包的依赖范围:
在不同的位置是否能够使用这个jar,从空间个时间俩个角度来看。
- 不设置依赖范围默认则compile
- test,测试范围。在主程序和服务器不能用在。在开发时的测试程序中可以使用,如junit, 因为最终打成的jar包没有测试程序
- provided:被服务器提供(不会被部署在服务器,最终这个jar包以tomcat的为准),如jsp-api,servlet-api,由tomcat提供。
测试依赖的传递性:
只有默认范围complie范围的jar才可以传递。
在maven-A工程里引入三种不同依赖范围的依赖,简写如下:
简写如下:servlet-api provided druid junit test
在maven-web工程里引入maven-A工程的依赖
com.atguigu.maven maven-A1.0-SNAPSHOT
效果如下:只有默认范围complie范围的jar才可以有依赖传递。
依赖冲突
路径最短者优先,路径相同者,先配置者优先
依赖排除
com.atguigu.maven maven-A1.0-SNAPSHOT com.alibaba druid
依赖排除后效果如下:
继承和聚合
什么叫聚合:对父工程的所有操作子工程也会跟着做相同的操作(比如清理、打包) ,此乃好处1.
父工程会自动聚合:
子工程maven_son会自动创建到父工程maven-A下,创建后父工程多了一个标签
如下创建maven-A的子工程maven_son
com.atguigu.maven maven-A1.0-SNAPSHOT maven_son pom
子工程多了parent标签,里面写父工程的坐标
子工程groupid和version都保持跟父工程一样,所以子工程只写artifactId
maven-A com.atguigu.maven 1.0-SNAPSHOT 4.0.0 maven_son
这时候有什么好处呢?这是好处2
父工程会无条件把所依赖的所有jar包都继承给子工程【dependencies】
此时可以把任何依赖范围的jar都传下去。
子工程maven_son配置文件里啥都没写呢,就把父工程maven-A中的三种依赖范围的依赖都继承了!
dependecyMangement标签
问题就来了,有时候我不想这样啊,把一堆我用不着的依赖也给我继承了下来。怎么办呢
让父工程管理依赖。
把父工程maven-A中的依赖用
这时候,子工程maven_son的依赖就这样了。就跟没有继承他爹一样
好处是:子工程可以选择性的继承父过程给的依赖,依赖范围和版本号就可以删掉不写了。
javax.servlet servlet-apicom.alibaba druid
此时虽然父工程中有3个依赖,但是子工程只选择性的继承了其中的俩个
自定义属性来管理jar包的版本
维护依赖也只能维护版本号,scope也能不改就别改,
5.3.1
比如spring系列jar包有很多个,设置版本号就可以这么使用,修改版本号的时候就可以一键修改了
${spring.version}