资料来源
这里我不在介绍基本概念了,放一些核心干货 需要基本概念请参考;
我们知道所有的核心都在pom.xml中,所以一步步看这个pom文件各个标签
下面这个图我解释一下: 我们先创建了个maven java项目,然后我们通过mvn install 把这个jar包安装到我们本地仓库, 现在新建个maven web项目,pom引入 我java项目中的jar(通过依赖中的坐标) 然后打包就会发现lib下有个java项目的jar包
纯命令创建maven项目:
用命令构建普通java项目:mvn archetype:generate
第一次会下载一会,过会会让你选择一个模板 7 走默认即可 然后会让你填写那三个坐标
用命令构建普通Web项目:mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeVersion=1.4
用命令查看当前Web工程所依赖的jar包的列表:mvn dependency:list
以树形结构查看当前Web工程的依赖信息:mvn dependency:tree
关于maven中依赖范围如何验证测试
可选值以下6个 import含义可参考此视频
runtime
汇总 先说如何测试:核心思想就是 在对应目录引入它范围jar包中类,然后执行编译,看编译报不报错 具体如下,首先我这个项目有如下几个作用范围 验证compile在 main目录(空间) 有效:在main目录(空间)引入compile范围的jar包中的类
接下来验证compile在 test目录(空间) 有效:在test目录(空间)引入compile范围的jar包中的类 接下来验证compile在 开发过程(时间) 有效: 这个就是开发中你导入IDEA后,我能不能点出提示,能出来自然有效。正常来说开发过程中都是有效的,但是runtime范围是个特例。 这个就是开发的时候我们用不到具体实现,等运行的时候才会用到具体实现。
接下来验证compile在 部署到服务器(时间) 有效: 去看打完包后lib下有没有对应jar包 验证test在 main目录(空间) 无效:在main目录(空间)引入test范围的jar包中的类
其他的验证我这里都不赘述了,开发中基本上99%都是compile范围,既然占比这么大都设置为compile(默认就是此范围)行不行?
其实人间提供这个scope标签就是为了去除test、provided,为什么要去除? 比如说test你只是测试用到,你部署到服务器,那不是增加服务器的负担了(你把无关jar包一股脑扔到服务器上上,显得乱,服务器压力增加,性能就会降低,开发维护也不方便) 再看看provided,已提供的,人家都有了你就没必要打包进去,你非要,那可能就会造成冲突,到时候代码报错,这就不好排查了啊,jar包里面源码也不是直接能改的,你动人家源码,你这个解决问题的方法就不对,这就是你jar冲突导致的,它表面上抛出的异常就不是你解决问题的一个思路方向。 当然你也不用顾虑我不知道jar包的依赖范围怎么办? 你去maven官网搜jar包的时候,人家把作用范围都写好了,你直接复制即可。
测试依赖的传递性
这块不好书写建议视频学习 依赖的传递性 A 依赖 B,B 依赖 C,那么在 A 没有配置对 C 的依赖的情况下,A 里面能不能直接使用 C? 验证:这块不好书写建议视频学习
这也就是为什么SpringBoot为什么引入几个start就能完事,它就利用了Maven的依赖传递性
测试依赖的排除
配置依赖的排除其实就是阻止某些 jar 包的传递。因为这样的 jar 包传递过来会和其他 jar 包冲突。 欲知详情参考视频
配置方式<exclusions> 标签配置依赖的排除
<dependency>
<groupId>com.atguigu.maven</groupId>
<artifactId>pro01-maven-java</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
继承
实操:运行 mvn archetype:generate 命令来创建模块工程。 创建好之后修改父工程打包方式 删除测试的依赖
在父工程里模拟创建3个子工程 创建完3个子工程发现父工程pom自动多了如下内容 下面 modules 和 module 标签是聚合功能的配置 先去看看子工程:解读子工程的pom.xml
<parent>
<groupId>com.atguigu.maven</groupId>
<artifactId>pro03-maven-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>pro04-maven-module</artifactId>
在父工程中配置依赖的统一管理
使用dependencyManagement 标签配置对依赖的管理,被管理的依赖并没有真正被引入到工程
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
子工程中引用那些被父工程管理的依赖 关键点:省略版本号
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</dependency>
</dependencies>
我们知道父工程配好了版本号子工程可以不写,那么写了会怎么样几种情况无外乎如下图所示: 你也可以去子pom对应标签配置,定义子pom想要的版本,配了会覆盖副版本哦
聚合(部分组成整体)
聚合测试视频
在IDEA中执行Maven命令
先看看maven下的这几个常用图标含义
至于Plugins就是maven的插件 ,它跟Lifecycle关系是 Lifecycle中的插件就是绑定的Plugins中的插件 Dependencies 就是所有引入的依赖常用来查看某个模块的依赖信息
第一种 找到maven 直接执行 这个大家都会没啥可说的
手动输入,你点M那个图标进来后,下面有很多提示命令,点一下就会填充此命令到输入框, 如果没有你想用的命令模板就自己收到敲,后回车执行 多模块项目注意要考虑一下命令的执行范围呦 当然你也可以在IDEA终端运行maven命令,前提是在对应pom里 你可以通过cd命令进入也可以如下快速到此目录下, 这块我输入maven命令报错了(‘mvn’ 不是内部或外部命令),然后我用cmd在此目录下执行maven命令没有问题,百度给出解决方案,我也是这么解决的。(网上说环境变量什么的我觉得自己cmd能出来就没问题,就没参考)直接管理员身份运行完美解决问题
mvn clean install -Dmaven.test.skip=true
下面几个比较常用: maven常用命令
1. 跳过测试:-Dmaven.test.skip(=true)
2. 指定端口:-Dmaven.tomcat.port=9090
3. 忽略测试失败:-Dmaven.test.failure.ignore=true 当然,如果你的其它关联项目有过更新的话,
一定要在项目根目录下运行mvn clean install来执行更新,再运行mvn tomcat:run使改动生效.
4.只测试而不编译,也不测试编译:mvn test -skipping compile -skipping test-compile
( -skipping 的灵活运用,当然也可以用于其他组合命令)
生命周期
对应视频
导入Maven项目
感兴趣请参考笔记
这块我说一下,分工程导入跟模块导入 导入Maven项目作为单独的一个项目,你就需要单独开个窗口,还得设置好maven依赖。平时练习的话我建议都放在一个工程项目里,设置一次maven依赖,我们只需要引入模块即可,这样很多个模块 项目都用一个窗口,方便管理。
如果你是引入模块的话,注意修改一下 pom.xml 如果是web工程你还得去看看,反正多点点看看里面有没有版本不合适的,爆红的,改改
仓库
建议听下下Nexus作用
父级
生成微服务可运行jar包
学习视频
超级POM大揭秘
破案视频
版本仲裁
视频
自定义maven插件
对应文档 视频1 视频2
还有默认 profile、搭建 Maven 私服:Nexus、第二节、体系外 jar 包引入 顺着视频看吧
创建Maven,SpringBoot子工程
这篇博客介绍的挺详细我就不赘述了
课外题
配置文件为什么要放到Web工程里面?
为什么要统一返回数据格式 分布式、SOA、微服务、SpringBoot关系
我的项目作为你war下lib的jar上一讲听下可以串起来
|