EmmmuaCode EmmmuaCode
首页​
导航🚀​
  • 数据结构
  • 计算机网络
  • Java基础

    • JavaSE
    • JVM虚拟机
    • JUC并发编程
  • JavaWeb

    • Servlet
    • MVC
    • filter|listener
  • HTML
  • CSS
  • JavaScript
  • Vue
  • uni-app
  • Spring5
  • SpringMVC
  • SpringBoot2
  • SpringCloud
  • SpringSecurity
  • 搜索引擎

    • ElasticSearch
  • 消息队列

    • RabbitMQ
  • 服务器

    • Nginx🌐
  • 服务框架

    • Dubbo
  • Python基础
  • 数据分析
  • Hadoop
  • SQL 数据库

    • MySQL
  • NoSQL 数据库

    • NoSQL数据库概论
    • Redis
    • MongoDB
    • HBase
  • 框架

    • MyBatis
    • MyBatis-Plus
    • ShardingSphere
  • 部署

    • Linux
    • Docker
  • 管理

    • Maven
    • Git
  • 友情链接
  • 优秀博客文章
  • 索引

    • 分类
    • 标签
    • 归档
  • 其他

    • 关于
Github (opens new window)

wufan

海内存知己,天涯若比邻。
首页​
导航🚀​
  • 数据结构
  • 计算机网络
  • Java基础

    • JavaSE
    • JVM虚拟机
    • JUC并发编程
  • JavaWeb

    • Servlet
    • MVC
    • filter|listener
  • HTML
  • CSS
  • JavaScript
  • Vue
  • uni-app
  • Spring5
  • SpringMVC
  • SpringBoot2
  • SpringCloud
  • SpringSecurity
  • 搜索引擎

    • ElasticSearch
  • 消息队列

    • RabbitMQ
  • 服务器

    • Nginx🌐
  • 服务框架

    • Dubbo
  • Python基础
  • 数据分析
  • Hadoop
  • SQL 数据库

    • MySQL
  • NoSQL 数据库

    • NoSQL数据库概论
    • Redis
    • MongoDB
    • HBase
  • 框架

    • MyBatis
    • MyBatis-Plus
    • ShardingSphere
  • 部署

    • Linux
    • Docker
  • 管理

    • Maven
    • Git
  • 友情链接
  • 优秀博客文章
  • 索引

    • 分类
    • 标签
    • 归档
  • 其他

    • 关于
Github (opens new window)
  • Linux

    • Linux基础篇
    • Linux 目录结构
    • Linux 远程登录到Linux服务器
    • Linux Vi和Vim编辑器
    • Linux 虚拟机关机、重启和用户登录注销
    • Linux 用户管理
    • Linux 实用指令
    • Linux 组管理和权限管理
    • Linux 定时任务调度
    • Linux 磁盘分区、挂载
    • Linux 网络配置
    • Linux 进程管理
    • Linux RPM与YUM
    • Linux 搭建JavaEE环境
    • Linux Shell编程
    • Linux Python开发平台Ubuntu
    • Python定制篇-APT软件管理和远程登录
    • Linux 日志管理
    • Linux 定制自己的Linux
    • Linux 源码介绍&内核升级
    • Linux 备份与恢复
    • Linux 可视化管理-webmin和bt运维工具
  • Docker

    • Docker 简介
    • Docker 安装
    • Docker 常用命令
    • Docker 镜像原理
    • 本地镜像发布到阿里云
    • 将本地镜像推送到私有库
    • Docker 数据卷
    • Docker 软件安装
  • Maven

    • Maven 简介
    • Maven 基础
      • Maven 下载
      • Maven 安装
      • Maven 环境变量配置
      • Maven 基础概念
        • 仓库
        • 坐标
        • 本地仓库配置
        • 远程仓库配置
        • 全局setting与用户setting区别
      • 第一个Maven项目(手工制作)
        • Maven 工程目录结构
        • Maven 项目构建命令
        • Maven 插件创建工程
      • 第一个Maven项目(IDEA生成)
        • 配置Maven
        • 手工创建Java项目
        • 原型创建Java项目
        • 原型创建Web项目
        • 插件
      • 依赖管理
        • 依赖配置
        • 依赖传递
        • 依赖传递冲突问题
        • 可选依赖
        • 排除依赖
        • 依赖范围
        • 依赖范围传递性
      • 生命周期与插件
        • 项目构建生命周期
        • clean生命周期
        • default构建生命周期
        • site构建生命周期
        • 插件
    • Maven 高级
  • Git 基础

    • Git 概述
    • Git 安装
    • Git 常用命令
    • Git 分支操作
    • Git 团队协作机制
    • IDEA 集成Git
    • IDEA 集成 GitHub
    • 自建代码托管平台-GitLab
  • studynotes
  • project-management
  • Maven
wufan
2021-12-20
目录

Maven 基础

# Maven 基础

# Maven 下载

  • 官网:Maven – Welcome to Apache Maven (opens new window)

  • 下载地址:Maven – Download Apache Maven (opens new window)

00

# Maven 安装

  • Maven属于绿色版软件,解压即安装

01

# Maven 环境变量配置

  • 依赖Java,需要配置JAVA_HOME
  • 设置MAVEN自身的运行环境,需要配置MAVEN_HOME

新建系统变量

03

编辑系统Path变量,新建

04

  • 测试环境配置结果

09

# Maven 基础概念

# 仓库

02

  • 仓库:用于存储资源,包含各种jar包
  • 仓库分类:
    • 本地仓库:自己电脑上存储资源的仓库,连接远程仓库获取资源
    • 远程仓库:非本机电脑上的仓库,为本地仓库提供资源
      • 中央仓库:Maven团队维护,存储所有资源的仓库
      • 私服:部门/公司范围内存储资源的仓库,从中央仓库获取资源
  • 私服的作用:
    • 保存具有版权的资源,包含购买或自主研发的jar
      • 中央仓库中的jar都是开源的,不能存储具有版权的资源
    • 一点范围内共享资源,仅对内部开放,不对外共享

# 坐标

05

  • 什么是坐标?

    ​ Maven中的坐标用于描述仓库中资源的位置

    ​ Central Repository: (maven.org) (opens new window)

  • Maven坐标主要组成

    • Maven 存储库:搜索/浏览/探索 (opens new window)

    ​ groupId:定义当前Maven项目隶属组织名称(通常是域名反写,例如:org.mybaits)

    ​ artifactId:定义当前Maven项目名称(通常是模块名称,例如CRM、SMS)

    ​ version:定义当前项目版本号

    packaging:定义该项目的打包方式

  • Maven坐标的作用

    ​ 使用唯一标识,唯一性定位资源位置,通过该标识符可以将资源的识别与下载工作交由机器完成

# 本地仓库配置

  • Maven启动后,会自动保存下载的资源到本地仓库

    在maven文件/conf/settings.xml配置文件中

    • 默认位置

      <localRepository>${user.home}/.m2/repository</localRepository>
      
      1

      当前目录位置为登录用户名所在目录下的.m2文件夹中

    • 自定义位置

      <localRepository>D:\maven\repository</localRepository>
      
      1

      当前目录位置为D:\maven\repository文件夹中

# 远程仓库配置

  • Maven默认连接的仓库位置

    在maven文件/lib/pom-4.0.0.xml配置文件中

      <repositories>
        <repository>
          <id>central</id>
          <name>Central Repository</name>
          <url>https://repo.maven.apache.org/maven2</url>
          <layout>default</layout>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </repository>
      </repositories>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
  • 镜像仓库配置

    • 在setting文件中配置阿里云镜像仓库
    <mirrors>
    	<!-- 配置具体的仓库的下载镜像 -->
    	<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>
    </mirrors>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

# 全局setting与用户setting区别

  • 全局setting定义了当前计算器中Maven的公共配置
  • 用户setting定义了当前用户的配置

# 第一个Maven项目(手工制作)

# Maven 工程目录结构

├── Project
│   └── java-project
│    	└── src
│       	├──	main
│          	|	└── java
│           |	└── resources
│       	├── test
│           	└── java
│          		└── resources
1
2
3
4
5
6
7
8
9
  • 在src同级目录下创建pom.xml
<?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/maven-v4_0_0.xsd">
    <groupId>com.study</groupId>
    <artifactId>project-java</artifactId>
    <version>1.0</version>
    <packaging>jar</packaging>
  <dependencies>
      <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.12</version>
      </dependency>
    </dependencies>
    </project>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# Maven 项目构建命令

  • Maven构建命令使用mvn开头,后面添加功能参数,可以一次执行多个命令,使用空格分割
    • mvn compile #编译
    • mvn clean #清理
    • mvn test #测试

06

测试完之后,target里面有个文件夹surefire-reports里面有两个文件,一个text,还有一个xml文件,是target提供的测试报告。

  • mvn package #打包

07

打包里面会先进行编译,然后测试程序的编译,执行test,测试结果输出,最后执行打包指令。(保证正确性)

  • mvn install #安装到本地仓库

08

groupId决定了一层目录,项目名称又决定了一层目录,版本号又决定了一层目录

# Maven 插件创建工程

  • 创建工程
mvn archetype:generate
-DgroupId={project-packaging} 
-DartifactId={project-name} 
-DarchetypeArtifactId=maven-archetype-quickstart
-DinteractiveMode=false
1
2
3
4
5
  • 创建java工程
mvn archetype:generate -DgroupId=com.frx -DartifactId=java-project -
DarchetypeArtifactId=maven-archetype-quickstart -Dversion=0.0.1-snapshot -
DinteractiveMode=false
1
2
3
  • 创建web工程
mvn archetype:generate -DgroupId=com.frx -DartifactId=web-project -
DarchetypeArtifactId=maven-archetype-webapp -Dversion=0.0.1-snapshot -
DinteractiveMode=false
1
2
3

10

  • web工程与java工程的区别

11

# 第一个Maven项目(IDEA生成)

# 配置Maven

新建一个空白项目,找到File->Settings->Maven,修改Maven_home path、User setting file和Local respository。

12

# 手工创建Java项目

  1. 新建Module,选择右侧的Maven,点击Next,可以指定工程位置,然后GroupId起名称,Artifacted工程名称,Next,Finish.

13

  1. 选中main中的java,点击蓝色的Sources,选中resources,点击灰色的Resources,选中test,右键,new Floder...,选中test中的java,点击绿色的Tests,选中resources,点击红绿三角的Test Resorces,OK。

14

  • test

15

  • 也可以

16

好处:可以打断点,添加一个运行,就可以进行调试

# 原型创建Java项目

  • 使用模板创建Java工程(搜索quick start)

16

# 原型创建Web项目

  • 使用模板创建Web工程(搜索Webapp)

16

  • 搞定

16

# 插件

  • Tomcat7运行插件
<build>
	<plugins>
		<plugin>
			<groupId>org.apache.tomcat.maven</groupId>
			<artifactId>tomcat7-maven-plugin</artifactId>
			<version>2.1</version>
			<configuration>
				<port>9000</port>
				<path>/</path>
			</configuration>
		</plugin>
	</plugins>
</build>

1
2
3
4
5
6
7
8
9
10
11
12
13
14

16

16

换了个端口 访问成功了

<?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/maven-v4_0_0.xsd">
    <!--指定pom的模型版本-->
    <modelVersion>4.0.0</modelVersion>

    <!--打包方式,web工程打包为war,java工程打包为jar-->
    <packaging>war</packaging>

    <name>web01</name>
    <!--name可以删掉-->

    <groupId>com.frx02</groupId>
    <!--组织Id-->

    <!--项目id-->
    <artifactId>web01</artifactId>

    <!--版本号:release(完整版),snapshot(开发版)-->
    <version>1.0-SNAPSHOT</version>

    <!--设置当前工程的所有依赖-->
    <dependencies>
    <!--具体的依赖-->
        <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <!--  构建-->
    <build>
      <plugins>
        <plugin>
          <groupId>org.apache.tomcat.maven</groupId>
          <artifactId>tomcat7-maven-plugin</artifactId>
          <version>2.1</version>
          <configuration>
            <port>9000</port>
            <path>/</path>
          </configuration>
        </plugin>
      </plugins>
    </build>
</project>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

# 依赖管理

# 依赖配置

  • 依赖指当前项目运行所需的jar,一个项目可以设置多个依赖

  • 格式:

      <! --设置当前项目所依赖的所有jar-->
      <dependencies>
          <! --设置具体的依赖-->
        <dependency>
            <! --设置所属群组id-->
          <groupId>junit</groupId>
            <! --依赖所属项目id-->
          <artifactId>junit</artifactId>
            <! --依赖版本号-->
          <version>4.13</version>
          <scope>test</scope>
        </dependency>
      </dependencies>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

# 依赖传递

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

16

比如,把项目三作为一个资源配置到项目二 注意:不考虑依赖范围,项目二就可以使用项目三中所有的依赖

  • 在项目二的pom.xml配置依赖
<dependencies>
    <dependency>
      <groupId>com.frx03</groupId>    
      <artifactId>project03</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>
  </dependencies>
1
2
3
4
5
6
7

# 依赖传递冲突问题

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

根据某一个项目为根,对它所依赖的资源进行深度标注,比如说直接依赖,称为1度资源

16

# 可选依赖

控制别人能不能看到自己的东西

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

例如:将项目二中log4j设为可选依赖

  <dependencies>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.14</version>
      <optional>true</optional>
    </dependency>
  </dependencies>
1
2
3
4
5
6
7
8

# 排除依赖

  • 排除依赖指主动断开依赖的资源,被排除的资源无需指定版本--不需要(排除所有的版本)

你传递过来,我不要

例如:在项目二中排除从项目三依赖的资源log4j

    <dependency>
      <groupId>com.frx03</groupId>
      <artifactId>project03</artifactId>
      <version>1.0-SNAPSHOT</version>
      <exclusions>
        <exclusion>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
1
2
3
4
5
6
7
8
9
10
11

# 依赖范围

  • 依赖的jar默认情况可以在任何地方使用,可以通过scope标签设定其作用范围
  • 作用范围
    • 主程序范围有效(main文件夹范围内)
    • 测试程序范围有效(test文件夹范围内)
    • 是否参与打包(package指定范围内)
scope 主代码 测试代码 打包 范例
compile(默认) Y Y Y log4j
test Y junit
provided Y Y servlet-api
runtime Y jdbc

例如:把项目中mybatis依赖配置范围为test

 <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.3</version>
      <scope>test</scope>
    </dependency>
1
2
3
4
5
6

# 依赖范围传递性

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

16

例如:项目一依赖项目二的资源,把项目一看成直接依赖,项目一的依赖范围为compile;项目二看成间接依赖,项目二的mybaits依赖范围为runtime.最后在项目一中依赖生成的mybatis依赖范围为runtime

注意:这里的直接依赖和间接依赖是对依赖生成后的结果来说的(例如项目一依赖生成的mybatis)

# 生命周期与插件

# 项目构建生命周期

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

16

  • Maven对项目构建的声明周期划分为3套
    • clean:清理工作
    • default:核心工作,例如编译,测试,打包,部署等
    • site:产生报告,发布站点等

# clean生命周期

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

# default构建生命周期

16

  • 注意,如果执行compile,会把compile上面的全部执行完,以此类推。

16

# site构建生命周期

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

# 插件

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

添加打印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>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  • install

16

安装到本地仓库,有两个jar包,一个是它本身的,另一个是maven-sources

当然,也可以添加

<goal>test-jar</goal>
1

这时安装到本地,有三个jar包,有两个jar包,一个是它本身的,另一个是maven-sources,还有一个是测试源代码

16

生命周期指的是运行的阶段,插件是为了支持生命周期那些事情;生命周期可以理解为几岁,插件可以理解为几岁干的那件事.

#Maven
上次更新: 2024/04/21, 09:42:22
Maven 简介
Maven 高级

← Maven 简介 Maven 高级→

最近更新
01
微信支付功能的实现与流程
11-21
02
购物车与结算区域的深入优化与功能完善
11-21
03
购物车与结算区域的功能实现与优化
11-21
更多文章>
Theme by Vdoing | Copyright © 2023-2024 EmmmuaCode | 黔ICP备2022009864号-2
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式