Maven学习——maven基础
maven基础
- 前言
- 一、maven简介
- mave的功能:
- 二、下载和安装
- 三、maven的基础概念
- 1、仓库
- 2、坐标
- 3、本地仓库配置
- 四、制作Maven项目
- 纯手工制作
- 插件制作
- IDEA制作
- 插件的安装——以tomcat为例
- 五、依赖管理
- 依赖配置
- 依赖传递
- 依赖传递的冲突问题
- 可选依赖
- 排除依赖
- 依赖范围
- 六、生命周期与插件
- 构建的生命周期
- 插件
- end...
前言
Maven在我们现在的java项目中运用的非常频繁,通常用来帮我们管理jar包和项目打包。自己也做过一些的项目了,但对maven的使用只停留在表面,虽然也花过一些时间通过看文章的形式学习maven,但效果并不好,仍然对maven很陌生。因此,抽出时间对maven进行系统的学习,以后遇到相关问题就能快速解决了。文章课程链接:黑马程序员Maven全套教程
一、maven简介
maven是什么:
maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM),POM是Project Object Model的简称,译为项目对象模型(将一个项目看做一个对象)。
为什么使用maven:
帮助我们解决一些问题,比如
- jar包不统一,jar包不兼容
- 工程升级维护过程操作繁琐
mave的功能:
依赖管理
一个项目就是一个POM,POM的属性和行为通过解析pom.xml来获取,POM需要的资源可以由依赖管来来做,同时,我们的项目也可以成为一个资源被其他项目使用,因此,是双向箭头,依赖管理的资源从哪来,从计算机上(本地)获取,本地从私服获取,私服从中央库获取。
项目构建
当然,maven也能帮助我们构建生命周期/阶段,常用的就是通过插件打包,如图
统一开发结构
在以前的开发过程中,大家的工程目录结构比较随意,可能都会有些区别,现在你会发现都是这样的
二、下载和安装
1、下载并解压,解压后如下
bin:maven的所有可运行指令
boot:目录中有一个jar包,是它的类加载器(maven是java写的)
conf:配置文件
lib:maven所依赖的jar包
剩下的是协议等
2、配置环境变量:JAVA_HOME和MAVEN_HOME,配置环境变量的目的是可以随处用cmd运行
三、maven的基础概念
1、仓库
仓库用于存储资源(各种jar包)
分类:
- 本地仓库:自己电脑上的
- 远程仓库:分为中央仓库和私服
如果是我们一个人开发,我们有一个本地仓库,本地仓库中的jar包直接从中央服务器(存储jar的位置叫做中央仓库)拿,中央仓库由maven团队管理着。如果我们在公司开发,一般还有一个私服,私服从中央拿,我们从私服拿。
私服的作用:
提升下载速度,方便管理。不对外共享,保存了具有版权的资源,包括购买或者自研的jar
2、坐标
maven中的坐标用于描述仓库中资源的位置(定位资源)
坐标的组成部分:
groupId:定义当前maven项目隶属组织名称(通常是域名反写,例如:org.mybatis)
artifactId:定义当前maven项目名称(通常是模块/项目名称,例如CRM、SMS)
version:定义当前项目版本号
另外还有一个packaging(不属于坐标),用于定义项目打包方式
3、本地仓库配置
1、本地仓库
本地仓库默认在C盘user目录下,我们可以更改配置,让指定的文件夹作为仓库,打开conf文件,加上配置
<localRepository>D:/maven/repository</localRepository>
2、镜像仓库
由于中央仓库在国外,下载速度非常慢,因此,我们需要更改下配置,不让其访问中央仓库,而是访问我们的阿里云镜像站,配置如下
<mirror><!--此镜像的唯一标识符,用来区分不同的mirror元素,随便写--><id>nexus-aliyun</id><!--对哪种仓库进行镜像,简单说就是替代哪个仓库--><mirrorOf>repositoryId</mirrorOf><!--镜像名称,随便写--><name>Human Readable Name for this Mirror.</name><!--镜像URL--><url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
3、全局setting与用户setting的区别
全局setting定义了当前计算机中maven的公共配置
用户setting定义了当前用户的配置
四、制作Maven项目
纯手工制作
编写一个前面讲到的“统一开发结构”的目录(项目就叫test),编写两个java测试类,分别在main/com/itheima和test/com/itheima目录下,然后打开cmd命令行窗口,进入到test目录下,执行相关命令,命令解释如下:
mvn compile # 编译:没有jar包或插件时,先下载jar包、插件,# 然后将java文件编译成字节码文件放到/target/classes目录下
mvn clean # 清理:删除编译好的java文件(删除target目录)
mvn test # 测试:没有相应的jar或插件时,都会先下载,测试会显示测试过程和结果,测试报告在target的surefire-reports目录下
mav package # 打包:先编译,在测试,在打包
mvn install # 安装:将我们的项目打包后放到仓库中
插件制作
创建一个目录test1,该目录最好为空,然后打开cmd进入到该目录(不是test1下),执行命令如下,分为java和web版,命令第四行DarchetypeArtifactId为模板名称
最终生成的工程结构如图,其中web版的pom.xml多了一行,为打成war包的配置(package)
IDEA制作
这里要注意IDEA和maven版本的兼容问题,可自行上网查询
1、下载相应的版本,并修改配置文件(本地仓库和镜像站)
2、在IDEA中配置maven
3、创建一个maven工程,编写测试代码
4、在IDEA软件右上部分,可以快速的管理maven,里面有生命周期的操作(清理、编译、打包等),双击的效果和手工是一样的
我们还可以在idea中运用原型创建java项目和web项目,操作方式为在选择maven项目后,选择相应的原型。
插件的安装——以tomcat为例
这里,我们先用原型创建一个web项目,如图,这里要删除报红和不用的配置文件,不然后面运行不了
web工程需要我们用web容器启动它,这里选择tomcat,我们需要在工程中加入tomcat插件,下面我们就在pom.xml文件添加插件,代码如下:
<!--构建--><build><!--设置插件--><plugins><!--具体的插件--><plugin><!-- https://mvnrepository.com/artifact/org.apache.tomcat.maven/tomcat7-maven-plugin --><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><!--自定义配置端口、路径--><configuration><port>80</port><path>/</path></configuration></plugin></plugins></build>
加入后刷新一下,我们发现,我们就多了一个tomcat7的插件,如图
点开tomcat7,里面有很多它的插件,我们点击run,就可以启动项目了,如图
当然,可以从控制台看到项目的地址等信息(自动生成),我们也可以进行相应的配置,上面的代码已经给出,到这里,我们就基本了解了maven的一些配置,这里做下总结
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><!--指定pom的版本模型--><modelVersion>4.0.0</modelVersion><!--打包方式--><packaging>war</packaging><!--项目名称,可以不要--><name>maven-stu</name><!--组织id,比如com.***.***、org.***--><groupId>org.study</groupId><!--项目id,一般为名称--><artifactId>maven-stu</artifactId><!--项目版本--><version>1.0-SNAPSHOT</version><!--设置当前工程的所有依赖--><dependencies><!--设置具体的依赖--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies><!--构建--><build><!--设置插件--><plugins><!--具体的插件--><plugin><!-- https://mvnrepository.com/artifact/org.apache.tomcat.maven/tomcat7-maven-plugin --><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><!--自定义配置端口、路径--><configuration><port>80</port><path>/</path></configuration></plugin></plugins></build>
</project>
五、依赖管理
依赖配置
依赖指当前项目运行所需的jar,一个项目可以设置多个依赖
在我们导入依赖后,在maven工具处刷新一下,就能看到我们导入的jar包了
代码示例
<dependencies><!--设置具体的依赖--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version></dependency></dependencies>
依赖传递
什么是依赖传递,相信有使用过springboot的你并不陌生,当我们要使用一些jar包,比如mybatis,我们可以直接引入它的starter依赖,starter再帮我们去引入mybatis需要使用到的jar包,例子如下
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.3</version></dependency>
该starter帮我们引入了jar,如:mybatis的jar和jdbc的jar,jdbc的jar又通过stater去引入,如图
当然,我们不仅仅会去导入其他公司的jar,也可能导入自己开发的其他项目模块,或者同事开发的项目模块,比如微服务开发中,我们会写一个基础的模块(base),写一些基础的工具类或其他通用类,其他项目模块可以导入它,避免再写一次(尚硅谷尚融宝项目)
依赖传递分为直接依赖和间接依赖,相对下图自己的模块来说,第二层jar和同事开发的模块为直接依赖,后面的都为间接依赖
依赖传递的冲突问题
上面,我们已经搞懂了什么叫传递依赖,细心的你可能会带着一个疑问,我依赖的几个jar都用到了log4j,而且可能版本不一样,那我自己用到的是哪个版本的呐,这里,我们有三种情况
路径优先:
当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高
声明优先:
当资源在相同的层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的,简单的说就是***在前面的优先
特殊优先:
当同级配置了相同资源的不同版本,后配置的覆盖先配置的,我导入两个log4j,后面导入的生效
可选依赖
可选依赖指对外隐藏当前所依赖的资源——不透明,配置如下,加上一个
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><optional>true</optional></dependency>
想要呈现效果,需要其他项目引入该项目,因为这是你不想让别人看到你所引入的jar
排除依赖
排除依赖指主动断开依赖的资源,被排除的资源无需指定版本——不需要,配置如下
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><!--排除--><exclusions><exclusion><groupId>org.hamcrest</groupId><artifactId>hamcrest-core</artifactId></exclusion></exclusions></dependency>
这样,我们就会排除掉hamcrest-core,效果如图:排除前,排除后
依赖范围
依赖的jar默认情况可以在任何地方使用,可以通过来设置其作用范围,作用范围包括主程序范围有效(main文件夹)、测试程序范围有效(test文件夹)、是否参与打包(package指令范围内)它有五个值,默认是compile
compile:都用
provided:开发时
runtime:项目运行时
system:
test:测试
使用场景如图
log4j在各个环境都要使用,因此是compile,junit只在测试代码中使用,servlet不要打到包里,防止与tomcat等web容器导入的servlet版本冲突,假如你的是3.0,web容器是2.1,最后一个jdbc,我们很少直接操作原生jdbc,在代码中没有相关代码,就不需要引入到开发环境中,但项目运行又必须用到它
这里,我们引入一个问题,当我们配置了scope后,它的依赖传递会是怎样呐,这里做一个了解,如图,当在项目的pom配置的是compile,引入的jar中的配置的某个坐标也是compile,则是compile,如果是test和provided,则不引入,其他参照图示
六、生命周期与插件
构建的生命周期
Maven构建的生命周期描述的是一次构建过程经历的事件
如上图,一个项目要最终上线运行,就要经历编译、测试、打包等过程
Maven对项目构建的生命周期划分为三套,clean、default、site,这部分做了解即可
- clean:清理工作
pre-clean:执行一些需要在clean之前完成的工作
clean:移除所有上一次构建生成的文件
post-clean:执行一些需要在clean之后立刻完成的工作
- default:核心工作,例如编译、测试、打包、部署等
要完成到某个阶段,需要执行该阶段前的所有操作,如编译前,要做校验、初始化、生成源代码等
- site:产生报告,发布站点等
插件
- 插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能
- 默认maven在各个生命周期上绑定有预设的功能(觉得不够可以加其他功能)
- 通过插件可以自定义其他功能
maven插件在官网Maven Plugins菜单下,里面有各式各类的插件
我们就在阶段来对它进行打包操作,示例代码如下
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><version>2.2</version><!--在哪执行,可以是多个地方,对应多个execution--><executions><execution><goals><!--打哪种类型的,也可以多个,这里的jar是源码,test-jar是测试源码--><goal>jar</goal><goal>test-jar</goal></goals><!--生命周期,可以对应前面的表,这里是测试资源文件--><phase>generate-test-resources</phase></execution></executions></plugin></plugins></build>
加入插件后,我们在IDEA的右边点出maven菜单,执行相应的功能,比如打包,因为我们的配置的生命周期是在打包过程中,因此会执行,最终生成3个jar包
end…
如果总结的还行,就点个赞呗 @_@ 如有错误,欢迎指点,下一篇Maven学习——maven高级···
Maven学习——maven基础相关推荐
- Maven学习(基础部分)
Maven学习(基础部分) 1. Maven是什么 传统项目管理的缺陷:1. jar包不统一,jar包不兼容 2. 工程升级维护过程操作繁琐 ... Maven的本质是一个项目管理工具,将项目开发和管 ...
- maven 学习---Maven添加远程仓库
默认情况下,Maven从Maven中央仓库下载所有依赖关系.但是,有些库丢失在中央存储库,只有在Java.net或JBoss的储存库远程仓库中能找到. 1. Java.net资源库 添加Java.ne ...
- maven 学习---Maven本地资源库
Maven的本地资源库是用来存储所有项目的依赖关系(插件jar和其他文件,这些文件被Maven下载)到本地文件夹. 很简单,当你建立一个Maven项目,所有相关文件将被存储在你的Maven本地仓库. ...
- Maven学习(一) - Maven基础
2019独角兽企业重金招聘Python工程师标准>>> Maven作为Java语言的构建和依赖管理工具,已经被广泛使用.但对于maven的pom.xml的配置以及插件的使用,大部分人 ...
- maven 学习笔记(三)创建一个较复杂的 eclipse+android+maven 工程
前面maven 学习笔记(二)已经说过了怎样通过插件创建一个简单的工程,有了前面的基础,创建一个较复杂的工程就容易了很多.同样是通过已经有了插件,同样如果插件系统中并未存在,还是需要通过Add Arc ...
- 黑马程序员Maven学习笔记
前言 这里是黑马程序员Maven学习笔记分享,这是视频链接. 我还有其它前端内容的笔记,有需要可以查看. 文章目录 前言 基础 Maven简介 Maven是什么 Maven的作用 Maven的下载 M ...
- maven学习笔记——尚硅谷
文章目录 maven学习笔记--尚硅谷 第一章 Maven概述 第一节 为什么要学习Maven 1.Maven 作为依赖管理工具 1.1 jar 包的规模 1.2 jar 包的来源 1.3 jar 包 ...
- Maven 学习笔记 - 跳过测试 skipTests
Maven 学习笔记 - 跳过测试 方案一 idea中操作 方案二 maven命令 方案三 maven打包插件配置 1. 跳过所有测试 2. 详细指定:包含.排除 参考资料 方案一 idea中操作 打 ...
- Apache Maven 学习教程
Blog: https://blog.yilon.top Apache Maven 概述 Maven - 概述 Maven 是什么? Maven 是一个项目管理和整合工具.Maven 为开发者提供了一 ...
最新文章
- 小程序实现 Tab 标签栏
- LeetCode Course Schedule II(拓扑排序)
- 分组合计且排序和显示名称
- 你所不知道的Android Studio调试技巧
- mysql undrop_MySQL 如何对InnoDB使用Undrop来恢复InnoDB数据
- 安卓之实现一个简单的电话拨号功能
- OpenShift 4 MTC - 从 OpenShift 3 向 OpenShift 4 迁移应用
- java jsch session 多久会断开_What?纯Java居然能实现Xshell!
- 信息安全政策(隔离与监控)
- python获取当前路径
- ActivityGroup简介
- 编译原理(整体理解)
- 8.10 网络编程——客户端从服务器中下载文件 TFTP协议
- 计算机电子科技生产质量标准,SJT9527__微型数字电子计算机 质量分等标准(4页)-原创力文档...
- MAC IDEA启动后卡住不动
- iOS开发之自定义的framework添加第三方framework,lipo和ar命令看.o文件
- plc辅助继电器M的介绍
- JavaScript内存溢出
- windows 内存映射文件
- PHP电商运费模板,拼多多运费模板怎么设置?怎么使用运费模板?