Maven学习
第一章 Why
Maven是干什么用的? 这是很多同学在学完这个课程后最大的问题。之所以会提出这个问题,是因为即使不使用Maven,我们仍然可以进行BS结构项目开发。
从表现层,业务逻辑层到持久层再到数据库都有成熟的解决方案--- 不使用Maven我们一样可以开发项目!所以我们有必要通过企业开发中的实际需求来看一看
哪些方面是我们现有技术的不足。
三大框架是解决什么问题?
Springmvc在表现层处理客户端传过来的请求,因为它有contorll方法,通过映射得到请求数据,调用业务层,得到业务层结果,做视图解析,做转发重定向。
Spring,IOC和AOP,主要管理系统当中bean对象的生命周期,以及代码的解耦,分离,把非业务代码和业务代码分离,
非业务代码放到aop中,还提供了声明式事物
Mybaties,可以逆向工程,表设计好了后,接口和映射文件都可以自动生成。
框架是解决代码代码上,分层上的问题,对于项目的管理,只能通过Maven进行解决。
1.1 添加第三方jar包
在今天的JavaEE开发领域,有大量的第三方框架和工具可以供我们使用。要使用这些jar包最简单的方法就是复制粘贴到WEB-INF目录下的lib目录下。但是这会导致每次
创建一个新的工程就需要将jar包重复复制到lib目录下,从而造成工作区中存在大量重复的文件。
而使用Maven后每个jar包只在本地仓库中保存一份,需要jar包的工程只需要维护一个文本形式的jar包的引用,我们称之为“坐标”。不仅极大的节约了存储的空间,让项目
更轻巧,更避免了重复文件太多而造成的混乱。
1.2 jar包之间的依赖关系
jar包往往不是孤立存在的,很多jar包都需要在其他jar包的支持下才能正常工作,我们称之为jar包之间的依赖关系。最典型的例子就是:commons-fileupload-1.3.jar依赖
于commons-io.2.0.1.jar ,如果没有IO包,FileUpload包就不能正常工作。
那么问题来了,你知道你所使用的jar包的依赖关系吗? 当你拿到一个新的从未使用过的jar包。你如何得知他需要哪些jar包的支持呢?如果不了解这个情况,导入的jar包不够
,那么现有的程序将不能正常工作。再进一步,当你的项目中需要用到上百个jar包时,你还会人为的,手工的逐一确认他们的依赖的jar包吗?这简直是不可想像的。
而引入Maven后,Maven就可以替我们自动的将当前jar包所依赖的其他jar包全部导入进来,无需人工参与,节约了我们大量的时间和精力。用实际例子来说明就是:通过
Maven导入common-fileupload1-3.jar后,common-io.1.3.jar会被自动导入,程序员不必了解这个依赖关系。
1.3 处理jar包之间的冲突
上一点说的是jar包不足项目无法正常工作,但其实有的时候jar包多了项目仍然无法正常工作,这就是jar包之间的冲突。
举个例子:我们现在有3个工程,MakeFriend、HelloFriend和Hello。MakeFriend依赖HelloFriend,HelloFriend依赖Hello。
而Hello依赖log4j.1.2.17.jar,HelloFriend依赖log4j.1.2.14.jar,如下图所示:

那么MakeFriend工程的运行时环境中该导入log4j.1.2.17.jar 还是log4j.1.2.14.jar?
这样的问题一个两个还可以手工解决,但如果系统中存在几十个上百个jar包,他们之间的依赖关系会非常复杂,几乎不可能手工实现依赖关系的梳理。
使用Maven就可以自动的处理jar包之间的冲突问题,因为Maven中内置了两条依赖原则:最短路径者优先和先声明者优先,上述问题MakeFriend工程会自动使用log4j.1.2.14.jar。
1. 4 获取第三方jar包
JavaEE开发中需要使用到的jar包种类繁多,几乎每个jar包在其本身官网上的获取方式都不尽相同,为了查找一个jar包找遍互联网,身心俱疲,没有经历过的人或许都体会不到这种折磨
不仅如此,费劲心血找到的jar包里面有时候并没有你需要的那个类,又或者有同名的类没有你要的方法,以不规范的方式获取的jar包往往是不规范的。
使用Maven我们可以享受到一个完整统一的jar包管理体系。你只需要在你的项目中以坐标的方式依赖一个jar包,Maven就会自动从中央仓库进行下载,并同时下载这个jar包所依赖的其他jar包
---规范、完整、准确! 一次性解决所有问题。
TIPS:在这里我们顺便说一下,统一的规范几乎可以说成是程序员的最高信仰。如果没有统一的规范,就意味着每个具体的技术都各自为政,需要以诸多不同的特殊方式加入到项目中,
好不容易加入进来还会和其他技术格格不入,最终受苦的是我们。而任何一个领域的统一规范都能够极大的降低程序员的工作难度,减少工作量。例如:USB接口可以外接各种设备,
如果每个设备,都有自己独特的接口,那么不仅制造商需要维护各个接口的设计方案,使用者也需要详细了解每个设备对应的接口,无疑是非常繁琐的。
第二章 what

如果上面的描述能够使你认识到使用Maven是多么的重要,我们下面就来介绍一下Maven是什么。
2.1 自动化构建工具
Maven这个单词的本意是:专家,内行。
Maven是一款自动化构建工具,专注于服务于Java平台的项目构建和依赖管理,在JavaEE开发的历史上构建
工具的发展也经历了一系列的演化和变迁。
Make-Ant-Maven-Gradle-其他
那么什么是构建呢?
2.2 构建的概念
构建并不是创建,创建一个工程并不等于构建一个项目。要了解构建的含义我们应该由浅入深从以下三个层面来看:
1、纯Java代码
大家都知道,我们Java是一门编译型语言,Java扩展名的源文件需要编译成class,扩展名的字节码文件才能够执行。
所以编写任何Java代码想要执行的话就必须经过编译得到对应的class文件。
2、Web工程
当我们需要通过浏览器访问Java程序时就必须将包含Java程序的Web工程编译的结果"拿"到服务器上的指定目录下,
并启动服务器才行。这个“拿”的过程我们就叫部署。
我们可以将编译的Web工程比喻为一只生的鸡,编译部署的过程就是将鸡炖熟。
Web工程和其编译结果的目录结构对比见下图:

3、实际项目
在实际项目中整合第三方框架,Web工程中除了Java程序和JSP页面、图片等静态资源之外,还包括第三方框架的jar包
以及各种各样的配置文件。所有这些资源都必须按照正确的目录结构部署到服务器上,项目才可以运行。
所有综上所述:构建就是以我们编写的Java代码、框架配置文件、国际化等其他资源文件、JSP页面和图片等静态
资源作为“原材料”,去“生产”出一个可以运行的项目的过程。
那么项目构建的全过程中都包含哪些环节呢?
2.3 构建的环节
2.4 自动化构建
1、清理:删除以前的编译结果,为重新编译做好准备。
2、编译:将Java源程序编译为字节码文件
3、测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
4、报告:在每一次测试后以标准的格式记录和展示测试结果。
5、打包:将一个包含诸多文件的工程封装为一个压缩文件,用于安装或部署。Java工程对应jar包,Web工程对应war包。
6、安装:在Maven环境下特指将打包的结果---jar包或war包安装到本地仓库中。
7、部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行。
2.4 自动化构建
其实上述环节我们在Eclipse中都可以找到对应的操作,只是不太标准。 那么既然IDE已经可以进行构建了,我们为什么还要使用Maven 这样的构建工具呢? 我们来看一个小故事:

能否将这些程式化的工作交给机器自动完成呢?--- 当然可以! 这就是自动化构建。

那么Maven又是如何实现自动化构建的呢? 简单的说来就是它可以自动的从构建过程的起点一直执行到终点。

2.5 Maven的核心概念
Maven之所以能够实现自动化的构建,和它的设计是紧密相关的。我们对Maven的学习就是围绕它的九个核心概念展开:
1、POM 项目对象模型
2、约定的目录结构
3、坐标
4、依赖管理
5、仓库管理
6、生命周期
7、插件和目标
8、继承
9、聚合
第三章 How
在这一节中,我们来看看Maven核心程序的安装和本地仓库的必要配置。然后我们就可以编写第一个Maven程序了。
1、检查JAVA_HOME环境变量。
Maven是使用Java开发的,所以必须知道当前系统环境中 JDK的安装目录。

2、解压Mavne的核心程序。
将apache-maven-3.5.0-bin.zip解压到一个非中文无空格的目录,例如:
E:\apache-maven-3.2.5
3、配置环境变量
Maven_home
E:\apache-maven-3.2.5
path
%Maven_home%\bin 或 E:\apache-maven-3.2.5\bin

4、查看Maven版本信息验证安装是否正确

5、配置本地仓库
1、Maven默认的本地仓库:~\.m2\repository目录
Tips:~表示当前用户的家目录

2、Maven的核心程序并不包含具体功能,仅负责宏观调度。具体功能由插件来完成。
Maven核心程序会到本地仓库中查找插件。如果本地仓库中没有就会从远程中央仓库下载。
此时如果不能上网则无法执行Maven的具体功能。为了解决这个问题,我们可以将Maven的本地仓库指向一个在
互联网情况下载好的目录。
3、Maven的核心配置文件位置:
解压目录:E:\apache-maven-3.2.5\conf\settings.xml

4、设置方式 配置本地仓库路径
<localRepository>以及准备好的仓库位置</localRepository>
<localRepository>E:\maven\repo</localRepository>
配置国内镜像
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
<profile>
<id>jdk-1.4</id>
<activation>
<jdk>1.4</jdk>
</activation>
<repositories>
<repository>
<id>jdk14</id>
<name>Repository for JDK 1.4 builds</name>
<url>http://www.myhost.com/maven/jdk14</url>
<layout>default</layout>
<snapshotPolicy>always</snapshotPolicy>
</repository>
</repositories>
</profile>
第四章 第一个Maven程序(练习常用命令)
1、第一步:创建约定的目录结构

main 目录用于存放主程序。
test 目录用于存放测试程序。
java目录用于存放源代码文件。
resources目录用于存放配置文件和资源文件。
2、第二步:创建Maven的核心配置文件pom.xml
<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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>JWT02</groupId> <artifactId>JWT02</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>JWT02</name> <description/> <properties> <webVersion>2.5</webVersion> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.apache.openejb</groupId> <artifactId>javaee-api</artifactId> <version>5.0-1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.1</version> <scope>provided</scope> </dependency> </dependencies> </project>
3、第三步:编写主代码
在src/main/java/com/atguigu/maven目录下新建文件Hello.java
4、第四步:编写测试代码
在src/test/java/com/atguigu/maven目录下新建测试文件HelloTest.java
5、第五步:运行几个基本的Maven命令
1、 打开cmd命令行,进入Hello项目根目录(pom.xml文件所在目录)执行 mvc compile命令,查看根目录变化
2、cmd中继续录入mvn clean命令,然后再次查看根目录变化
3、cmd中录入mvn clean compile命令,查看根目录变化
4、cmd中录入mvn test-compile命令,查看target目录变化
5、cmd中录入mvn clean test命令,查看target目录变化
6、cmd中录入mvn clean package命令,查看target目录变化
7、cmd中录入mvn source:jar命令,查看target目录变化
注意:运行Maven命令时一定要进入pom.xml文件所在目录!
第五章 POM
Project Object Model:项目对象模型。将Java工程的相关信息封装为对象,作为便于操作和管理的模型。
Maven的工程的核型配置。可以说学习Maven就是学习pom.xml文件中的配置。
第六章 约定的目录结构
现在JavaEE开发领域普遍认同一个观点:约定->配置->编码。意思就是能用配置解决的问题就不编码,
能基于约定就不进行配置。而Maven正是因为指定文件保存的目录才能够对我们的Java工程进行自动化构建。
目录结构含义参见前面的描述。
第七章 坐标
7.1 几何中的坐标
1、在一个平面中使用x、y两个向量可以唯一确定平面中的一个点。
2、在空间中使用x、y、z三个向量可以唯一的确定空间中的一个点。
7.2 Maven的坐标
使用如下三个向量在Maven的仓库中唯一的确定一个Maven工程。
1、groupId:公司或组织的域名倒序+当前项目名称。
2、artifactId: 当前项目的模块名称
3、version:当前模块的版本。
<groupId>JWT02</groupId> <artifactId>JWT02</artifactId> <version>0.0.1-SNAPSHOT</version>
7.3 如何通过坐标到仓库中查找jar包
1、将gav三个向量连起来
com.atguigu.maven+Hello+0.0.1-SNAPSHOT
2、以连起来的字符串作为目标结构到仓库中查找
com/atguigu/maven/Hello/0.0.1-SNAPSHOT.jar
注意:我们自己的Maven工程必须执行安装操作才会进入仓库。安装的命令是:mvn install
第八章 第二个Maven工程
8.1 目录结构
坑1
STS-Maven构建时后的问题
安装好STS和Maven之后,创建一个简单的Maven项目,各种报错,POM.xml 报错 什么compile:3.1

org/codehaus/plexus/archiver/jar/JarArchiver(不受支持的major.minor版本49.0)-Maven构建错误
网上各种资料翻遍了,最后居然是加密引起的,把仓库里面的所有jar都解密了,就好了。
lifecycle-mapping-metadata.xml 也不用自己创建,这个东西会随项目自动生成。
坑2
刚开始安装了已给STS4版本的,JDK1.6也没有报错,能启动,但是跑Junit就是一直报错,简直无语了。最后发现换成JDK1.8就正常,后面了解到然来STS对JDK有要求啊!
STS 大部分版本需要JDK1.8支持,最后找了一个3.7.2的版本支持JDK1.7.
STS历史版本
https://blog.csdn.net/cyn_653620/article/details/81566390
https://www.cnblogs.com/northeastTycoon/p/15201959.html
安装STS插件
https://www.cnblogs.com/northeastTycoon/p/15201966.html
eclipse对应JDK版本
https://blog.csdn.net/tchder/article/details/124835866
学习资料
https://www.bilibili.com/video/BV1Zi4y1L7XX?p=1&vd_source=e6157f1036a95bab7133e4e5193951ef
面试资料
https://zhuanlan.zhihu.com/p/555044367
https://blog.csdn.net/qq_42506411/article/details/106904272

浙公网安备 33010602011771号