1.maven是什么?
Maven 是一个项目管理工具,它包含了一个 项目对象模型 (POM:Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。
2.Maven 能解决什么问题?
项目开发不仅仅是写写代码而已,期间会伴随着各种必不可少的事情要做,下面列举几个感受一下:
1、我们需要引用各种 jar 包,尤其是比较大的工程,引用的 jar 包往往有几十个乃至上百个, 每用到一种 jar 包,都需要手动引入工程目录,而且经常遇到各种让人抓狂的 jar 包冲突,版本冲突。(jar包依赖)
2、我们辛辛苦苦写好了 Java 文件,可是只懂 0 和 1 的白痴电脑却完全读不懂,需要将它编译成二 进制字节码。好歹现在这项工作可以由各种集成开发工具帮我们完成,Eclipse、IDEA 等都可以将代 码即时编译。当然,如果你嫌生命漫长,何不铺张,也可以用记事本来敲代码,然后用 javac 命令一 个个地去编译,逗电脑玩。(编译) 3、世界上没有不存在 bug的代码,计算机喜欢 bug就和人们总是喜欢美女帅哥一样。为了追求美为 了减少 bug,因此写完了代码,我们还要写一些单元测试,然后一个个的运行来检验代码质量。(测试) 4、再优雅的代码也是要出来卖的。我们后面还需要把代码与各种配置文件、资源整合到一起,定型 打包,如果是 web项目,还需要将之发布到服务器,供人蹂躏。(部署)
试想,如果现在有一种工具,可以把你从上面的繁琐工作中解放出来,能帮你构建工程,管理 jar 包,编译代码,还能帮你自动运行单元测试,打包,生成报表,甚至能帮你部署项目,生成 Web 站 点,你会心动吗?Maven 就可以解决上面所提到的这些问题。
3.使用maven,我们要做哪些工作?
1) 下载Maven
为了使用 Maven 管理工具,我们首先要到官网去下载它的安装软件。官网地址:https://maven.apache.org
2)安装Maven
Maven 下载后,将 Maven 解压到一个没有中文没有空格的路径下,比如 D:\software\maven 下面。 解压后目录结构如下: bin:存放了 maven 的命令,比如我们前面用到的mvn tomcat:run boot:存放了一些 maven 本身的引导程序,如类加载器等 conf:存放了 maven 的一些配置文件,如 setting.xml 文件 lib:存放了 maven 本身运行所需的一些 jar 包 至此我们的 maven 软件就可以使用了,前提是你的电脑上之前已经安装并配置好了 JDK。
3)配置MAVEN_HOME环境变量
配置 MAVEN_HOME ,变量值就是你的 maven 安装 的路径(bin目录之前一级目录)
上面配置了我们的 Maven 软件,注意这个目录就是之前你解压 maven 的压缩文件包在的的目录,最 好不要有中文和空格。
4)检查JAVA_HOME环境变量,如下图:
5) 测试Maven是否安装成功
通过 mvn -v命令检查 maven 是否安装成功,看到 maven 的版本为 3.5.2 及 java 版本为 1.8 即为安装 成功。
找开 cmd 命令,输入 mvn –v命令,如下图:
我们发现 maven 的版本,及 jdk 的版本符合要求,这样我们的 maven 软件安装就成功了。
6) idea 的 的 maven 配置
4.什么是Maven仓库?
1)Maven 的仓库分为两大类
-
本地仓库
-
远程仓库
中央仓库:https://mvnrepository.com/(全球唯一,速度比较慢)
私服:私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的 Maven 用户使用。当 Maven 需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为 Maven 的下载请求提供服务。我们还可以把一些无法从外部仓库下载到的构件上传到私服上。(可以Nexus搭建私服 )
其它公共库:例如http://maven.aliyun.com/nexus/content/groups/public,我们可以通过配置镜像的方式来配置。
2)本地仓库的配置
在 MAVE_HOME/conf/settings.xml 文件中配置本地仓库位置(maven 的安装目录下):
打开 settings.xml文件,配置如下:
5.Maven工程的标准目录结构有哪些内容?
Maven 工程的目录结构
作为一个 maven 工程,它的 src目录和 pom.xml 是必备的。 进入 src目录后,我们发现它里面的目录结构如下:
src/main/java —— 存放项目的.java 文件 src/main/resources —— 存放项目资源文件,如 spring, hibernate 配置文件 src/test/java —— 存放所有单元测试.java 文件,如 JUnit 测试类 src/test/resources —— 测试资源文件 target —— 项目输出位置,编译后的class 文件会输出到此目录 pom.xml——maven 项目核心配置文件 注意:如果是普通的 java 项目,那么就没有webapp 目录。
6.Maven 常用命令有哪些?
-
compile
compile 是 maven 工程的编译命令,作用是将 src/main/java 下的文件编译为 class 文件输出到 target 目录下。
cmd 进入命令状态,执行mvn compile,如下图提示成功:
-
test
test 是 maven 工程的测试命令 mvn test,会执行src/test/java下的单元测试类。
-
clean
clean 是 maven 工程的清理命令,执行 clean 会删除 target 目录及内容。
-
package
package 是 maven 工程的打包命令,对于 java 工程执行 package 打成 jar 包,对于web 工程打成war 包。
-
install
install 是 maven 工程的安装命令,执行 install 将 maven 打成 jar 包或 war 包发布到本地仓库。
注意事项:当后面的命令执行时,前面的操作过程也都会自动执行。
7.maven工程坐标包括哪几个部分?
每个 maven 工程都需要定义本工程的坐标,坐标是 maven 对 jar 包的身份定义:
groupId:项目名称,定义为组织名+项目名,类似包名
artifactId:模块名称
version:当前项目版本号,snapshot 为快照版本即非正式版本,release为正式发布版本
packaging:打包类型
jar:执行 package 会打成 jar 包 war:执行 package 会打成 war 包 pom :用于 maven 工程的继承,通常父工程设置为 pom
8.Maven常见的依赖范围有哪些?
添加坐标:
添加坐标时需要指定依赖范围,依赖范围包括:
compile:编译范围,指 A在编译时依赖 B,此范围为默认依赖范围。编译范围的依赖会用在 编译、测试、运行,由于运行时需要所以编译范围的依赖会被打包。 provided:provided 依赖只有在当 JDK 或者一个容器已提供该依赖之后才使用, provided 依 赖在编译和测试时需要,在运行时不需要,比如:servlet api 被 tomcat 容器提供。 runtime:runtime 依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如:jdbc 的驱动包。由于运行时需要所以 runtime 范围的依赖会被打包。 test:test 范围依赖 在编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用, 比如:junit。由于运行时不需要所以test范围依赖不会被打包。 system:system 范围依赖与 provided 类似,但是你必须显式的提供一个对于本地系统中 JAR 文件的路径,需要指定 systemPath 磁盘路径,system依赖不推荐使用。
依赖范围由强到弱的顺序是:compile>provided>runtime>test
9.Maven中出现jar包冲突问题,如何解决?
Maven项目中的依赖关系: 直接依赖:A依赖B 间接依赖:A依赖B,B依赖C,A间接依赖C,间接依赖,也称之为传递性依赖。
问题:如果一个项目,同时依赖另外一个jar的不同版本,就可能导致jar冲突问题。这就是传递性依赖的Jar版本冲突问题。
测试代码:
<!--导入相关依赖包-->
<dependencies>
<!--引入spring-context,它所以来的包都会导入进来-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
</dependencies>
当jar出现冲突时,有两种做法
-
1)maven根据上面的两个调解原则,自动处理
-
2)使用exclusions标签手动,排除不需要的jar
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.4.RELEASE</version>
<!--直接排除-->
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
</dependencies>
10.dependencyManagement标签的作用是什么?
面对众多的依赖,有一种方法不用考虑依赖路径、声明优化等因素可以采用直接锁定版 本的方法确定依赖构件的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,以锁定 的版本的为准添加到工程中,此方法在企业开发中常用。 如下的配置是锁定了 spring-beans 和 spring-context 的版本:
还可以把版本号提取出来,使用<properties>标签设置成变量。
注意:在工程中锁定依赖的版本并不代表在工程中添加了依赖,如果工程需要添加锁定版本 的依赖则需要单独添加<dependencies></dependencies>标签,如下:
上边添加的依赖并没有指定版本,原因是已在<dependencyManagement>中锁定了版本, 所以在<dependency>下不需要再指定版本。
11.你是如何理解继承和聚合的?
通常继承和聚合同时使用。 何为继承? 继承是为了消除重复,如果将 dao、service、web 分开创建独立的工程则每个工程的 pom.xml 文件中的内容存在重复,比如:设置编译版本、锁定 spring的版本的等,可以将这些重复的 配置提取出来在父工程的 pom.xml 中定义。 何为聚合? 项目开发通常是分组分模块开发,每个模块开发完成要运行整个工程需要将每个模块聚合在 一起运行,比如:dao、service、web 三个工程最终会打一个独立的war 运行。
12.当下载jar时,由于断网或者连接超时导致无法正常下载,如何解决?
当下载jar的时候,如果断网,或者连接超时的时候,会自动在文件夹中创建一个名为*.lastupdate的文件,当有了这个文件之后,当你再次联网的时候,那么该文件不会再自动联网,必须手动删除,才能正常下载使用。如何删除呢?
使用工具:
如何使用?打开工具