Maven

参考B站颜群老师Maven教程

Maven基础概念、仓库、构建与部署

  1. Maven的作用
  • 管理jar
  • 将项目拆分成若干个模块

管理Jar

  • 增加第三方Jar
  • 管理Jar包之间的依赖关系 Maven自动帮助下载jar包,通过给定坐标下载
    jar包,jar包的依赖包Maven自动关联下载,并且不会有版本冲突

将项目拆分成多个模块

项目一般会分为三层(UI Service Dao) ,将大项目进行拆分每一层变为一个小项目

Maven的概念

是一个基于Java平台的自动化构建工具,能够完成以下操作,通俗讲就是将原
材料(Java,js,css等)变为产品(可发布的项目)

  • 清理 清空编译的结果,为重新编译
  • 编译 Java->class
  • 测试 对项目的关键点用测试代码测试开发代码
  • 报告 显示测试结果
  • 打包 将项目中的多个文件压缩成一个文件用于安装或部署
  • 安装 将打包后的文件放到本地仓库
  • 部署 放到服务区准备运行

进一步理解安装

将项目放入本地仓库,可以通过本地仓库引用别的项目

进一步理解打包

比如一个在Eclipse中的项目部署是会生成一个对应的部署项目(遵循tomcat
目录结构),这个项目没有源码文件只有编译后的class文件,部署项目与原
项目目录结构不一样,原项目不能直接在tomcat中运行,只能运行部署项目,
如果非要运行原项目,可以将项目打成war包,此时可以运行。Java项目打成
一个jar包,web项目打成一个war包

进一步理解部署

将Java、Js、JSP等文件变成一个可以直接运行的项目而不是项目本身

  • 本地仓库与中央仓库与镜像仓库

本地仓库

项目所需jar包先找本地仓库

中央仓库

本地找不到联网中央仓库一定有

镜像仓库

对中央仓库进行分流,缓解中央仓库压力

Maven安装配置、目录结构、配置文件

在Apache官网下载

  1. 下载配置Maven mvn -v 查看是否配置完成
  • 配置JAVA_HOME
  • 配置MAVEN_HOME
  • 配置path
  • 配置本地仓库
    下载完成后的目录结构

修改本地仓库

1
<localRepository>D:mvnrep</localRepository>

使用Maven

约定优于配置,约定就是使用默认值,Maven约定了目录结构,pom文件中
唯一的坐标gav可以指定一个模块,将模块放入仓库中并且坐标就是唯一指
定的,main和test在同一个目录中相互之间不用导包

  1. Maven目录结构
    • src
    • src/main 写Java代码
    • src/test 写测试方法
    • pom.xml 项目对象模型
    • target
  2. pom文件中的坐标结构
    • groupId 域名翻转.大项目名
    • artifactId 子模块名
    • version 版本号
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.atguigu</groupId>
<artifactId>spring-boot-01-helloworld</artifactId>
<version>1.0-SNAPSHOT</version>
<!--将我们的应用打成一个jar包不需要tomcat服务器直接运行这个jar包也可以访问-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

依赖

在Maven项目中如果要使用一个jar可以通过配置依赖去仓库寻找,jar
包只需要下载一次,jarA依赖于jarB就是A依赖于B,两个项目之间的依
赖,首先将要依赖的项目install放入本地仓库,然后再另一个项目中
引用要依赖的项目

依赖的范围

Maven在编译、测试、运行项目时各自使用一套classpath,jar包在编译
测试运行三种情况时在有些情况会使用有些情况不会使用,在gav后添加
scope标签就可以指定使用范围,默认是compile

compile test provided
编译 有效 无效 有效
测试 有效 有效 有效
运行 有效 无效 无效

依赖排除

如果jarA依赖jarB,本质是jarA中的x.java依赖jarB中的y.java,这时
可以在依赖中添加参数排除jarB

1
2
3
4
5
<exclusions>
<exclusion>
gav坐标
</exclusion>
</exclusions>

依赖的传递性

jarA依赖jarB,jarB依赖jarC,如果要使jarA依赖jarC,那么jarB和
jarC的范围是compile

依赖原则

最短优先原则,如果jarA依赖jarD1.0,而且也满足依赖传递通过jarB
依赖jarD1.1,那么依赖jarD1.0。路径长度相同,后面覆盖前面依赖本
情况不要出现。如果不同的pom中有两个相同依赖,那么先声明的依赖覆
盖后声明的依赖

Maven常用命令

  • mvn compile 只编译main中的文件放入target中
  • mvn test 先编译后测试
  • mvn package jar/war,打包后放入target中
  • mvn install 将打成的包放入本地仓库供其他项目使用,放入位置是根据gav
  • mvn clean 删除target

Maven生命周期

执行某条命令之前会先执行之前的所有命令,默认生命周期从compile到install

Nexus

公司范围类有一个私服,现在本地仓库寻找,如果没有再在私服中寻找,将
jar包放入私服中后其他员工可以使用

在IDEA中指定本地仓库

Maven继承的实现

依赖传递有局限性,必须是compile才可以,通过继承可以不是compile,父工
程打包使用pom,子类引用父工程时发现并没有导入jar包,因为需要指定使用
父类的jar包,在依赖中只写ga,就能引入父类jar,父类中的jar不需要全部引
用,所以需要声明使用哪些

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
  1. 建立父工程
  2. 在父工程中导入依赖需要加一层
    1
    2
    3
    4
    <dependencyManagement> 
    <dependencies>
    </dependencies>
    <dependencyManagement>
  3. 给当前工程加入父工程
    1
    2
    3
    4
    5
    6
    7
    <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.3.RELEASE</version>
    <!-- 当前工程pom.xml到父工程的pom.xml的相对路径-->
    <relativePath/> <!-- lookup parent from repository -->
    </parent>

Maven聚合

Maven项目只能识别自身包含的以及本地仓库中的,Maven1依赖Maven2,
必须先将Maven1 install放入本地仓库中才能使用Maven1,如果Maven1
依赖许多工程,可以使用聚合简化操作。在一个总工程中配置聚合,可以
避免子工程install操作,总工程打包方式必须为pom

1
2
3
4
5
<modules>
<!-- 项目根路径,不用指定顺序 -->
<module>../Maven1</module>
<module>../Maven2</module>
</modules>
Author: 高明
Link: https://skysea-gaoming.github.io/2020/02/28/Maven/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.