Java-Maven详解

文章目录

    • 一、什么是Maven?
      • 1)Maven好处
      • 2)作用
    • 二、Maven的基本原理
    • 三、Maven安装
      • 1)Window安装Maven
        • 1、解压
        • 2、Maven环境变量配置
        • 3、验证
        • 4、配置本地仓库(资源下到哪)
        • 5、配置阿里镜像仓库(资源从哪来)
      • 2)Linux安装Maven
        • 1、下载解压
        • 2、配置环境变量
        • 3、验证
    • 四、创建Maven项目
      • 1)手动构建maven项目
        • 1、创建文件
        • 2、编译(mvn compile)
        • 3、清理(mvn clean)
        • 4、测试(mvn test)
        • 5、打包(mvn package)
        • 6、安装到本地仓库(mvn install)
      • 2)通过maven插件构建项目(命令行操作)
        • 1、构建工程(模板)
        • 2、构建java工程
        • 3、构建web工程
      • 3)通过IDEA创建空项目来构建maven java项目
        • 1、创建一个Empty Project
        • 2、配置jdk
        • 3、配置maven
        • 4、创建maven工程
        • 5、编写测试代码
        • 6、编译构建
        • 7、配置运行环境
      • 4)通过IDEA模板构建maven java项目
        • 1、搜索quickstart模板创建
        • 2、默认的目录结构
        • 3、手动创建缺少的目录
        • 4、修改目录属性
      • 5)通过IDEA模板构建maven java-web项目
        • 1、搜索webapp模板创建
        • 2、默认目录结构
        • 3、手动创建没创建的目录
        • 4、创建一个index.jsp文件
        • 5、添加tomcat插件
        • 6、运行web工程
        • 7、配置快捷运行方式
    • 五、Maven依赖管理
      • 1)依赖配置
      • 2)依赖传递
      • 3)依赖管理
        • 1、依赖传递冲突问题
        • 2、可选依赖
        • 3、排除依赖
        • 4、依赖范围
        • 5、依赖范围的传递性
    • 六、生命周期与插件
      • 1)项目构建生命周期
      • 2)Maven对构建的生命周期划分三个阶段
        • 1、clean生命周期
        • 2、default构建生命周期
        • 3、site构建的生命周期
      • 3)插件
    • 七、工程版本管理
    • 八、多环境资源配置
    • 九、跳过测试
      • 1)跳过测试环节的应用场景
      • 2)跳过测试的两种方法

一、什么是Maven?

Apache Maven是一个软件项目管理的综合工具。基于项目对象模型(POM)的概念,提供了帮助管理构建、文档、报告、依赖、发布等方法,Maven简化和标准化项目建设过程。处理编译,分配,文档,团队协作和其他任务的无缝连接。 Maven增加可重用性并负责建立相关的任务。

在这里插入图片描述

1)Maven好处

  • 可以将项目过程规范化、自动化、高效化以及强大的可扩展性,利用maven自身及其插件还可以获得代码检查报告、单元测试覆盖率、实现持续集成等等。

  • 使得项目的管理变得容易,构建项目的速度更快,由于Maven提供了仓库的概念去管理jar包,所以用git或者svn的时候,存储构建的项目体积会更小。

2)作用

管理项目的构建、文档生成、报告、依赖、SCMs(software configuration Management)、分布、分发、邮件列表。

二、Maven的基本原理

采用远程仓库和本地仓库以及一个核心的配置文件pom.xml,pom.xml中定义的jar文件从远程仓库下载到本地仓库,各个项目使用同一个本地仓库的jar,同一个版本的jar只需下载一次,而且避免每个应用都去拷贝jar。同时它采用了现在流行的插件体系架构,所以maven的核心非常的小,只有几兆大小的文件,在执行maven任务时,才会自动下载需要的插件。

具体的概念模型如下图:
在这里插入图片描述
Maven官方把maven定义为一个项目管理工具,下面我们来看看maven给我们的项目管理做了哪些工作?

  • 项目标准化

Maven项目具有统一的项目结构,这个项目结构是参考业界的最佳实践而成,为后面使用统一的maven命令打下了基础,如测试mvn test、打包mvn package等,无需写一行脚本,就可以方便的实现众多功能。

  • 文档和报告

使用mvn site可以快速生成项目站点,apache很多开源项目站点都采用maven生成,会出现built by maven字样的图标。

  • 类库管理

类库管理是maven一个比较核心的功能,我们就需要将项目所依赖的类库加入到pom.xml中,那么maven会自动将依赖的类库下载到本地,并且下载的类库如果还依赖其他的类库,它也会自动下载过来,这样我们就不需要一个一个类库去下载了。

发布管理

使用maven可以方便的进行项目发表管理。在项目开发到一定阶段,可以使用mvn package打包,它会自动先运行mvn test,跑所有的Test Case,只有全部通过才能正确打包。生成的war包(如果项目的packaging为war)在target目录下。这个 war包与使用ant脚本生成一样,但无需一行脚本,这也是maven对比ant的优势之一。使用mvn install将编译和打包好的文件发布到本地仓库中。使用mvn deploy在整合或者发布环境下执行,将最终版本的包拷贝到远程的repository。

三、Maven安装

官网地址:http://maven.apache.org/
Maven下载地址:http://maven.apache.org/download.cgi
在这里插入图片描述
这里我两个环境的版本都下载,分别在我本机和linux虚拟机安装。

1)Window安装Maven

1、解压

# 解压的目录
D:\software\Maven\apache-maven-3.8.4-bin

在这里插入图片描述
Maven根目录文件介绍:

  • bin:Maven的运行脚本。bin\mvn.cmd是基于windows的脚本。在cmd中每输入一条mvn的命令都是在调用并执行这些脚本。
  • boot:该项目只有一个文件plexus-classworlds-2.5.2.jar。他是一个类加载器的框架,相当于对JDK中的类的加载器,提供了丰富的语法以此用来方便配置,Maven使用该框架加载自己的类库。
  • conf:该目录包含了一个非常重要的文件setting.xml。配置该文件就可以在Project中定制Maven的行为。
  • lib:包含了所有Maven运行时需要的Java类库以及用到的第三方类库。
  • LICENSE:软件许可
  • NOTICE:软件引用的三方软件
  • README.txt:包含了Maven的简介

2、Maven环境变量配置

  • 依赖Java,需要配置JAVA_HOME,没有装jdk的还得先装jdk

  • 设置Maven自身自身的运行环境,需要配置MAVEN_HOME

  • 配置完JAVA_HOME和MAVEN_HOME,还得配置Path,在Path加上:%JAVA_HOME%\bin和%MAVEN_HOME%\bin

在这里插入图片描述

3、验证

# 这里使用git bash
$ java -version
$ mvn -v

在这里插入图片描述

4、配置本地仓库(资源下到哪)

# 创建本地存放jar包目录
D:\software\Maven\repository
# 找到maven安装目录下conf/settings.xml

在这里插入图片描述

5、配置阿里镜像仓库(资源从哪来)

先查找默认的配置,在lib目录下随便找个jar包用解压工具打开-》再回到上层目录-》ctrl+F搜索pom*.*找到pom-4.0.0.xml-》把这个文件拖出来打开
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
但是注意不是去修改jar包里面的这个配置,还是回到conf/setting.xml这个配置文件,修改这个配置文件。

<mirror><!-- 此镜像的唯一标识,用来区分不同的mirror元素 --><id>nexus-aliyun</id><!-- 对哪种仓库进行镜像,简单的就是替代哪个仓库 --><mirrorOf>central</mirrorOf><!-- 镜像名称 --><name>Nexus aliyun</name><!-- 镜像url --><url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

在这里插入图片描述

2)Linux安装Maven

1、下载解压

$ mkdir -p  /opt/software
$ cd /opt/software
$ wget https://dlcdn.apache.org/maven/maven-3/3.8.4/binaries/apache-maven-3.8.4-bin.tar.gz
$ tar -zvxf apache-maven-3.8.4-bin.tar.gz -C /opt/software/

2、配置环境变量

# 在/etc/profile
export PATH=/opt/software/apache-maven-3.8.4/bin:$PATH# 加载生效
$ source /etc/profile

3、验证

$ java -version
$ mvn -v

在这里插入图片描述

四、创建Maven项目

1)手动构建maven项目

默认git bash是没有tree命令的,这里提供下载地址:
官网下载地址:http://gnuwin32.sourceforge.net/packages/tree.htm
百度云下载地址:
链接:https://pan.baidu.com/s/17fc79rQUQSnBhWzej9xd9g
提取码:6666
把tree.exe放到git安装目录下的usr/bin/目录下

1、创建文件

### 查看创建的目录和目录结构
$ tree hello/
$ cat hello/src/main/java/com/test2022/Hello.java
$ cat hello/src/test/java/com/test2022/HelloTest.java
$ cat hello/pom.xml

在这里插入图片描述
在这里插入图片描述

2、编译(mvn compile)

$ cd hello
$ mvn compile

发现编译报错了:

【问题】 [ERROR] 不再支持源选项 5。请使用 7 或更高版本。
[ERROR] 不再支持目标选项 5。请使用 7 或更高版本。

在这里插入图片描述

  • 【解决方案一】修改全局,修改maven安装目录下conf/setting.xml文件,配置jdk,内容如下:
<profile><id>jdk-13</id><activation><activeByDefault>true</activeByDefault><jdk>13</jdk></activation><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>13</maven.compiler.source><maven.compiler.target>13</maven.compiler.target></properties>
</profile>
  • 【解决方案二】修改局部,修改项目目录下的 pom.xml文件,配置jdk,内容如下:
<properties><!-- 这里填jdk的版本,我使用的是jkd13 --><maven.compiler.target>13</maven.compiler.target><maven.compiler.source>13</maven.compiler.source>
</properties>

这里我采用【解决方案一】修改全局的配置

再编译,编译成功

$ mvn compile

在这里插入图片描述

3、清理(mvn clean)

$ mvn clean
# 发现上面编译产生的target目录会删掉
$ tree .

在这里插入图片描述

4、测试(mvn test)

$ mvn test

在这里插入图片描述

5、打包(mvn package)

【温馨提示】这里只打包编译好的源程序(xxx.class文件)

$ mvn package

在这里插入图片描述

6、安装到本地仓库(mvn install)

【温馨提示】这里groupid决定放在仓库的哪个文件下,配置<groupId>com.hello</groupId>,所以生成的包就会放在仓库目录的com/hello目录下。
在这里插入图片描述
在这里插入图片描述

会经历编译(compile)-》测试(test)-》打包(package) -》安装(install)的过程。

在这里插入图片描述

2)通过maven插件构建项目(命令行操作)

1、构建工程(模板)

模板:

mvn archetype:generate
-DgroupId={project-packaging}
-DartifactId={project-name}
-DarchetypeArtifactId=maven-archetype-quickstart
-DinteractiveMode=false

示例:

2、构建java工程

$ mvn archetype:generate -DgroupId=com.test2022 -DartifactId=java-project -DarchetypeArtifactId=maven-archetype-quickstart -Dversion=0.0.1-snapshot -DinteractiveMode=false

在这里插入图片描述
目录结构
在这里插入图片描述

3、构建web工程

$ mvn archetype:generate -DgroupId=com.test2022 -DartifactId=web-project -DarchetypeArtifactId=maven-archetype-webapp -Dversion=0.0.1-snapshot -DinteractiveMode=false 

在这里插入图片描述
目录结构
在这里插入图片描述

3)通过IDEA创建空项目来构建maven java项目

【温馨提示】IDEA官网下载地址:https://www.jetbrains.com/idea/

1、创建一个Empty Project

在这里插入图片描述
在这里插入图片描述

2、配置jdk

在这里插入图片描述

3、配置maven

File->Settings,把默认配置自带的maven修改上面下载的版本
在这里插入图片描述

4、创建maven工程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5、编写测试代码

在这里插入图片描述

6、编译构建

在这里插入图片描述

7、配置运行环境

在这里插入图片描述
配置编译
在这里插入图片描述
配置清理
在这里插入图片描述
右上角就有两个运行的快捷选项了
在这里插入图片描述

4)通过IDEA模板构建maven java项目

1、搜索quickstart模板创建

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、默认的目录结构

会默认创建一个org.example的demo,可以删掉
在这里插入图片描述

3、手动创建缺少的目录

发现main和test里面都没创建resources,下面我们手动创建
在这里插入图片描述

4、修改目录属性

如果创建的是普通目录,则可以右键目录修改目录属性
在这里插入图片描述

5)通过IDEA模板构建maven java-web项目

1、搜索webapp模板创建

在这里插入图片描述
在这里插入图片描述

2、默认目录结构

在这里插入图片描述

3、手动创建没创建的目录

在这里插入图片描述
在这里插入图片描述

4、创建一个index.jsp文件

在这里插入图片描述

5、添加tomcat插件

在maven库中搜索tomcat:https://mvnrepository.com/

在这里插入图片描述
在这里插入图片描述
这里使用2.1版本的
在这里插入图片描述
在这里插入图片描述

<build><plugins><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>

在这里插入图片描述

6、运行web工程

【温馨提示】默认端口是8080,上面配置的80
在这里插入图片描述
发现报错了
严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener

【原因&解决】是因为默认创建的web.xml配置文件里有spring的配置,先把这些配置删掉就行。最后web.xml只保留如下内容:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"></web-app>

再运行
在这里插入图片描述
在这里插入图片描述

7、配置快捷运行方式

在这里插入图片描述
在这里插入图片描述

五、Maven依赖管理

1)依赖配置

依赖指当前项目运行所需的jar包,一个项目可以设置多个依赖,示例如下:

<!-- 设置当前项目所有依赖的所有jar包 -->
<dependencies><!-- 设置具体的依赖 --><dependency><!-- 依赖所属群组id --><groupId>junit</groupId><!-- 依赖所属项目id --><artifactId>junit</artifactId><!-- 依赖版本号 --><version>4.12</version></dependency>
</dependencies>

2)依赖传递

依赖具有传递性:

  • 间接依赖:在当前项目中通过依赖配置建立的依赖关系
  • 直接依赖:被资源的资源如果依赖其它资源,当前项目间接依赖其它资源

3)依赖管理

1、依赖传递冲突问题

  • 路径优先:当前依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高。
  • 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的。
  • 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的。

2、可选依赖

可选依赖指对外隐藏当前所依赖的资源—-不透明

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><!-- 配置不透明 --><optional>true</optional>
</dependency>

3、排除依赖

排除依赖指主动断开依赖的资源,被排除的资源无需指定版本—-不需要

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><!-- 配置排除依赖 --><exclusions><exclusion><groupId>org.hamcrest</groupId><artifactId>hamcrest-core</artifactId></exclusion></exclusions>
</dependency>

4、依赖范围

  • 依赖的jar默认情况可以在任何地方使用,可以通过scope标签设定起作用范围
  • 作用范围
    1. 主程序范围有效(main文件夹范围内)
    2. 测试程序范围有效(test文件夹范围内)
    3. 是否参与打包(package指令范围内)

在这里插入图片描述

5、依赖范围的传递性

带有依赖范围的资源在进行传递时,作用范围将受到影响

在这里插入图片描述

六、生命周期与插件

1)项目构建生命周期

Maven构建生命周期描述的是一次构建过程经历了多少的事件

在这里插入图片描述

2)Maven对构建的生命周期划分三个阶段

  • clean:清理工作
  • default:核心工作,例如编译、测试、打包、部署等。
  • site:产生报告,发布站点等。

1、clean生命周期

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

2、default构建生命周期

  • validate (校验):校验项目是否正确并且所有必要的信息可以完成项目的构建过程。
  • initialize (初始化):初始化构建状态,比如设置属性值。
  • generate-sources (生成源代码):生成包含在编译阶段中的任何源代码。
  • process-sources (处理源代码):处理源代码,比如说,过滤任意值。
  • generate-resources (资源文件):生成将会包含在项目包中的资源文件。
  • process-resources (处理资源文件):复制和处理资源到目标目录,为打包阶段最好准备。
  • compile (编译):编译项目的源代码。
  • process-classes (处理类文件):处理编译生成的文件,比如说对Java class文件做字节码改善优化。
  • generate-test-sources (生成测试源代码):生成包含在编译阶段中的任何测试源代码。
  • process-test-sources (处理测试源代码):处理测试源代码,比如说,过滤任意值。
  • generate-test-resources (生成测试资源文件):为测试创建资源文件。
  • process-test-resources (处理测试资源文件):复制和处理测试资源到目标目录。
  • test-compile (编译测试源码):编译测试源代码到测试目标目录。
  • process-test-classes (处理测试类文件):处理测试源码编译生成的文件。
  • test (测试):使用合适的单元测试框架运行测试(Juint是其中之一)。
  • prepare-package (准备打包):在实际打包之前,执行任何的必要的操作为打包做准备。
  • package (打包):将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件。
  • pre-integration-test (集成测试前):在执行集成测试前进行必要的动作。比如说,搭建需要的环境。
  • integration-test (集成测试):处理和部署项目到可以运行集成测试环境中。
  • post-integration-test (集成测试后):在执行集成测试完成后进行必要的动作。比如说,清理集成测试环境。
  • verify (验证):运行任意的检直来验证项目包有效达到质量标准。
  • install (安装):安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖。
  • deploy (部署):将最终的项目包复制到远程仓库中与其他开发者和项目共享。

【温馨提示】:像compile、test、test-compile、package、install等,排在它们前面的步骤都会执行。图示如下:

在这里插入图片描述

3、site构建的生命周期

  • pre-site:执行一些需要在生成站点文档之前完成的工作
  • site:生成项目的站点文档
  • post-site:执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
  • site-deploy:将生成的站点文档部署到特殊的服务器上

3)插件

插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能,默认maven在各个生命周期上绑定有预设的功能,通过插件可以自定义其他功能。

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-source-plugin</artifactId><version>2.2.1</version><executions><execution><goals><goal>jar</goal></goals><phase>generate-test-resources</phase></execution></executions></plugin></plugins>
</build>

七、工程版本管理

  • SNAPSHOT (快照版本)

项目开发过程中,为方便团队成员合作,解决模块间相互依赖和时时更新的问题,开发者对每个模块进行构建的时候,输出的临时性版本叫快照版本(测试阶段版本),快照版本会随着开发的进展不断更新。

  • RELEASE (发布版本)

项目开发到进入阶段里程碑后,向团队外部发布较为稳定的版本,这种版本所对应的构件文件是稳定的,即便进行功能的后续开发,也不会改变当前发布版本内容,这种版本称为发布版本。

工程版本号约定规范:

【版本格式】<主版本>.< 次版本>.<i曾量版本 >.<里程碑版本>

  • 主版本:表示项目重大架构的变更,如:spring5相较于spring4的迭代
  • 次版本:表示有较大的功能增加和变化,或者全面系统地修复漏洞
  • 增量版本:表示有重大漏洞的修复
  • 里程碑版本:表明一个版本的里程碑(版本内部)。这样的版本同下一个正式版本相比,相对来说不是很稳定,有待更多的测试。

【范例】

5.1.9.RELEASE或5.1.9-RELEASE

八、多环境资源配置

一般公司至少有三套环境(开发、测试、生产),如果每次把程序打包好上传到对应的环境之前就得更改一下配置,是很烦的操作,所以就有了这里的多环境资源配置了。
在这里插入图片描述
示例:

<!-- 创建多环境 -->
<profiles><!-- 定义具体的环境:开发环境 --><profile><id>dev</id><!--…… --></profile><!-- 定义具体的环境:测试环境 --><profile><id>test</id><!--…… --></profile><!-- 定义具体的环境:生产环境 --><profile><!-- 定义环境对应的唯一id --><id>pro</id><!-- 定义环境中专用的属性 --><properties><jdbc.url>jdbc:mysql://127.1.1.1:3306/ssm_db</jdbc.url></properties><!-- 设置默认启动 --><activation><activeByDefault>true</activeByDefault></activation></profile>
</profiles>

通过命令加载指定环境

【调用格式】mvn 指令 -P 环境定义id

【示例】

$ mvn install -P pro

九、跳过测试

1)跳过测试环节的应用场景

  • 整体模块功能未开发
  • 模块中某个功能未开发完毕
  • 单个功能更新调试导致其他功能失败
  • 快速打包

2)跳过测试的两种方法

  • 使用命令跳过测试

【调用格式】mvn 指令 –D skipTests

  • 使用配置跳过测试
<plugin><artifactId>maven-surefire-plugin</artifactId><version>2.22.1</version><configuration><!-- 设置跳过测试 --><skipTests>true</skipTests><!-- 包含指定测试用例 --><includes> <include>**/User*Test.java</include></includes><!-- 排除指定测试用例 --><excludes><exclude>**/User*TestCase.java</exclude></excludes></configuration>
</plugin>

Published by

风君子

独自遨游何稽首 揭天掀地慰生平