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

 

 https://blog.csdn.net/mzp520lf/article/details/126247543

posted @ 2023-01-25 22:37  塞纳纽斯  阅读(42)  评论(0)    收藏  举报