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:
帮助我们解决一些问题,比如

  1. jar包不统一,jar包不兼容
  2. 工程升级维护过程操作繁琐

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包)
分类:

  1. 本地仓库:自己电脑上的
  2. 远程仓库:分为中央仓库和私服

如果是我们一个人开发,我们有一个本地仓库,本地仓库中的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,这部分做了解即可

  1. clean:清理工作

pre-clean:执行一些需要在clean之前完成的工作
clean:移除所有上一次构建生成的文件
post-clean:执行一些需要在clean之后立刻完成的工作

  1. default:核心工作,例如编译、测试、打包、部署等

要完成到某个阶段,需要执行该阶段前的所有操作,如编译前,要做校验、初始化、生成源代码等

  1. site:产生报告,发布站点等

插件

  1. 插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能
  2. 默认maven在各个生命周期上绑定有预设的功能(觉得不够可以加其他功能)
  3. 通过插件可以自定义其他功能

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基础相关推荐

  1. Maven学习(基础部分)

    Maven学习(基础部分) 1. Maven是什么 传统项目管理的缺陷:1. jar包不统一,jar包不兼容 2. 工程升级维护过程操作繁琐 ... Maven的本质是一个项目管理工具,将项目开发和管 ...

  2. maven 学习---Maven添加远程仓库

    默认情况下,Maven从Maven中央仓库下载所有依赖关系.但是,有些库丢失在中央存储库,只有在Java.net或JBoss的储存库远程仓库中能找到. 1. Java.net资源库 添加Java.ne ...

  3. maven 学习---Maven本地资源库

    Maven的本地资源库是用来存储所有项目的依赖关系(插件jar和其他文件,这些文件被Maven下载)到本地文件夹. 很简单,当你建立一个Maven项目,所有相关文件将被存储在你的Maven本地仓库. ...

  4. Maven学习(一) - Maven基础

    2019独角兽企业重金招聘Python工程师标准>>> Maven作为Java语言的构建和依赖管理工具,已经被广泛使用.但对于maven的pom.xml的配置以及插件的使用,大部分人 ...

  5. maven 学习笔记(三)创建一个较复杂的 eclipse+android+maven 工程

    前面maven 学习笔记(二)已经说过了怎样通过插件创建一个简单的工程,有了前面的基础,创建一个较复杂的工程就容易了很多.同样是通过已经有了插件,同样如果插件系统中并未存在,还是需要通过Add Arc ...

  6. 黑马程序员Maven学习笔记

    前言 这里是黑马程序员Maven学习笔记分享,这是视频链接. 我还有其它前端内容的笔记,有需要可以查看. 文章目录 前言 基础 Maven简介 Maven是什么 Maven的作用 Maven的下载 M ...

  7. maven学习笔记——尚硅谷

    文章目录 maven学习笔记--尚硅谷 第一章 Maven概述 第一节 为什么要学习Maven 1.Maven 作为依赖管理工具 1.1 jar 包的规模 1.2 jar 包的来源 1.3 jar 包 ...

  8. Maven 学习笔记 - 跳过测试 skipTests

    Maven 学习笔记 - 跳过测试 方案一 idea中操作 方案二 maven命令 方案三 maven打包插件配置 1. 跳过所有测试 2. 详细指定:包含.排除 参考资料 方案一 idea中操作 打 ...

  9. Apache Maven 学习教程

    Blog: https://blog.yilon.top Apache Maven 概述 Maven - 概述 Maven 是什么? Maven 是一个项目管理和整合工具.Maven 为开发者提供了一 ...

最新文章

  1. 小程序实现 Tab 标签栏
  2. LeetCode Course Schedule II(拓扑排序)
  3. 分组合计且排序和显示名称
  4. 你所不知道的Android Studio调试技巧
  5. mysql undrop_MySQL 如何对InnoDB使用Undrop来恢复InnoDB数据
  6. 安卓之实现一个简单的电话拨号功能
  7. OpenShift 4 MTC - 从 OpenShift 3 向 OpenShift 4 迁移应用
  8. java jsch session 多久会断开_What?纯Java居然能实现Xshell!
  9. 信息安全政策(隔离与监控)
  10. python获取当前路径
  11. ActivityGroup简介
  12. 编译原理(整体理解)
  13. 8.10 网络编程——客户端从服务器中下载文件 TFTP协议
  14. 计算机电子科技生产质量标准,SJT9527__微型数字电子计算机 质量分等标准(4页)-原创力文档...
  15. MAC IDEA启动后卡住不动
  16. iOS开发之自定义的framework添加第三方framework,lipo和ar命令看.o文件
  17. plc辅助继电器M的介绍
  18. JavaScript内存溢出
  19. windows 内存映射文件
  20. PHP电商运费模板,拼多多运费模板怎么设置?怎么使用运费模板?

热门文章

  1. HTTP协议知识点总结
  2. Mht制作word模板
  3. Docker入门学习教程
  4. STM32MP157(实验四)——串口通信(串口打印)
  5. 旷视科技2023校园招聘提前批正式启动!
  6. Windows Postman中文版
  7. 模板设计模式的两种方式
  8. VC2008中将CString转换成const char*的一种有效方法
  9. 压敏电阻MOV特性及选用
  10. RGB色彩模型图像/像素深度