Maven 学习
视频学习:https://www.bilibili.com/video/BV1Fz4y167p5?p=3&spm_id_from=pageDriver
1. 主要内容
2. Maven 的简介
2.1 简介
Maven 作为 Apache 组织中的一个颇为成功的开源项目,Maven 主要服务于基本 java 平台的项目创建,依赖管理和项目信息管理
2.2 项目创建
用软件的方法将繁琐重复的工作进行自动化,使得软件的构建可以像全自动流水线一样,只需要一条简单的命令,就能够自动完成,很快就能得到最终结果
2.3 项目构建工具
Ant 构建
最早的构建工具,基于 IDE,但 XML 脚本编写格式让 XML 文件特别大,对工程构建过程中的过程控制特别好
Maven
项目对象模型,通过其描述信息来管理项目的构建,报告和文档的软件管理工具,它填补了 Ant 缺点,Maven 第一次支持了从网络上下载的功能,仍然采用 xml 作为配置文件格式。Maven 专注的是依赖管理,使用 java 编写
Gradle
结合以上两个的优点,继承了 Ant 的灵活和 Maven 的生命周期管理,最后被 google 作为了 Android 御用管理工具,它最大的区别是不用 XML 作为配置文件格式,采用了 DSL 格式,使得脚本更加简洁
2.4 Maven 的四大特性
2.4.1 依赖管理系统
依赖管理系统 jar 包管理,jar 包升级时修改配置文件即可,可用 groupId、artifactId、version 组成的 Coordination(坐标)唯一标识一个依赖。
任何基于 Maven 构建的项目自身也必须定义这三项属性,生成的包可以是 jar 包,也可以是 war 包,如下依赖引用:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
坐标属性的理解
Maven 坐标为各种组件引入了秩序,任何一个组件都必须明确定义自己的坐标
groupId
定义当前 Maven 项目隶属的实际项目-公司名称。
artifactId
该元素定义实际项目中的一个 Maven 模块-项目名。推荐使用实际项目名称作为 artifactId 的前缀
version
该元素定义 Maven 项目当前所处的版本
2.4.2 多模块构建
在 Maven 中需要定义一个 parent POM 作为一组 module 的聚合 POM,在该 POM 中可以使用
2.4.3 一致的项目结构
制定了一套项目目录结构作为标准的 java 项目结构,解决不同的 IDE 带来的文件目录不一致问题
2.4.4 一致的构建模型和插件机制
3. Maven 的安装配置和目录结构
3.1 Maven 的安装配置
3.1.1 JDK 的版本
JDK 版本 1.7 及以上版本
3.1.2 下载 Maven
下载地址:https://maven.apache.org/download.cgi
3.1.3 配置 Maven 环境变量
- 将解压后的 Maven 的根目录配置到系统环境变量中 MAVEN_HOME
- 把 bin 目录配置到系统变量 path 中
注意:maven 解压后存放的目录不要包含中文和空格
3.1.4 检查 Maven 是否安装成功
打开 cmd,执行 mvn -v
3.2 Maven 目录结构
3.2.1 创建一个文件夹作为项目的根目录
创建 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/xsd/maven-4.0.0.xsd">
<!-- 模型版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.companyname.project-group,maven会将该项目打成的jar包放本地路径:/com/companyname/project-group -->
<groupId>com.xxxx</groupId>
<!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
<artifactId>maven</artifactId>
<!-- 版本号 -->
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>maven</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 这里只能写大的版本号12,不能具体到 12.0.1-->
<maven.compiler.source>12</maven.compiler.source>
<maven.compiler.target>12</maven.compiler.target>
<maven.compiler.compilerVersion>12</maven.compiler.compilerVersion>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
3.2.2 编写主函数
package com.xxxx.demo01
public class Hello {
public static void main(String[] args) {
System.out.println("Hello Maven");
}
}
3.2.3 cmd 下编译并运行
进入项目目录,使用 cmd
-
编译 java 文件
mvn complie
-
执行 main 方法
mvn exec:java -Dexec.mainClass="com.xxxx.demo01.Hello"
-
为了更好的下载依赖,可将镜像更改为 阿里镜像,另可修改默认仓库位置
1.1 修改默认仓库位置 maven-->conf-->settings.xml <localRepository>F:/Java/m2/repository</localRepository> 注意:仓库位置为本机的指定的目录,记得改成 "/" 1.2 更换镜像 <mirror> <id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror>
编译不成功,可能出现的问题:
-
JDK 环境配置有问题
-
代码编写时,类里面没有设置包名(如果编译时类没加包名,执行时也不需要加包名)
-
报 Fatal error compiling: 错误: 无效的目标发行版:12.0.1 错误
解决:将 版本号改成 12 即可
-
4. Maven 命令
Maven 的命令格式如下:
mvn [plugin-name]:[goal-name]
执行 plugin-name 插件的 goal-name 目标
4.1 常用命令
注意:运行 maven 命令,首先需要定位到 maven 项目的目录,也就是 pox.xml 文件所在的目录,否则,需要通过参数来指定项目的目录
5. IDEA 编辑器集成 Maven 环境
5.1 设置 Maven 版本
选择 File --> Other Settings(全局配置) -- > Settings for New Projects --> 搜索 Maven
- 修改 Maven home directory
- 修改 user settings file
6. Maven 项目的创建
6.1 创建 Java 项目
6.1.1 新建项目
选择 File --> New --> Project --> maven --> quickstart
6.1.2 编译项目
选择 edit configurations --> + --> maven
6.2 启动 web 项目
-
创建 web 项目与创建 java 项目步骤基本一致,区别在于选择 Maven 模板 (web 项目选择 webapp)
-
修改 JDK 为当前版本
-
添加 web 部署的插件
在 build 标签中添加 plugins 标签
Jetty 插件 和 tomcat 插件
7. Maven 仓库的基本概念
对于 Maven 来说,仓库只分为两类:本地仓库和远程仓库
当 Maven 根据坐标寻找构件时,会首先查看本地仓库,如果本地仓库存在,则直接使用;如果本地没有,Maven 则会去远程仓库查找,发现需要的构件时之后,下载到本地仓库再使用,如果都没有,则会报错。
远程仓库分为三种:中央仓库、私服、其他公共库
中央仓库是默认配置下,Maven 下载 jar 包的地方
私服是另一种特殊的远程仓库,为了节省带宽和时间,应该在局域网内架设一个私有的仓库服务器,用其代理所有外部的远程仓库。内部的项目还能部署到私服上供其他项目使用。
在 Maven 项目目录下,没有诸如 libs/ 这样用来存放依赖文件的目录。当 Maven 在执行编译或测试时,如果需要使用依赖文件,它总是基于坐标使用本地仓库的依赖文件。
默认情况下,每个用户在自己的用户目录下都有一个路径名 .m2/repository/ 的仓库目录,此仓库默认在 c 盘,可通过 maven 配置文件 conf 目录下 settings.xml 来指定仓库路径
7.1 中央仓库
默认的远程仓库
7.2 私服
私服是一个特殊的远程仓库,假设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的 maven 用户使用,当 maven 需要下载构件时,它去私服当中找,如果私服没有,则从外部远程仓库下载,并缓存在私服上,再为 maven 提供。
7.3 其他公共库
常用的阿里云仓库配置
<mirror>
<id>nexus-aliyun</id>
<mirrorof>Nexus aliyun</mirrorof>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
8. Maven 环境下构建多模块项目
使用 maven 提供的多模块构建的特性完成 maven 环境下多个模块的项目的管理与构建
- 模块 maven_parent -- 基模块(pom)
- 模块 maven_dao -- 数据库的访问层,如 jdbc 操作 (jar)
- 模块 maven_service -- 项目的业务逻辑层 (jar)
- 模块 maven_controller -- 用来接收请求,相应数据 (war)
9. Maven 的打包操作
- 建立对应的目录结构
- 添加 Profile 配置
- 设置资源文件配置
- 执行打包操作
10. Maven 依赖的基本概念
10.1 依赖的基本配置
根元素 project 下的 dependencies 可以包含多个 dependence 元素,以声明多个依赖。
每个依赖应该包含以下元素:
- groupId,artifactId,version:依赖的基本坐标
- Type:依赖的类型,大部分情况下不需要声明。默认值为 jar
- Scope:依赖范围
- Optional:标记依赖是否可选
- Exclusion:用来排除传递性依赖