Maven项目管理
1、什么是Maven
传统项目管理状态分析
- jar包不统一,jar包不兼容,可能有的升级之后就发生冲突了
- 工程升级维护过程操作繁琐
Maven是什么
- Maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)
- POM (Project Object Model) :项目对象模型
我们现在只需要明白一点:依赖管理是从 中央仓库里拿到的
Maven的作用:
- 项目构建:提供标准的、跨平台的自动化项目构建方式
- 依赖管理:方便快捷的管理项目依赖的资源(jar)包,避免资源间的版本冲突问题
- 统一开发结构:提供标准的、统一的项目结构
2、Maven安装与配置
1、Maven 的安装很简单 ,去官网加载即可,
下载好,解压到目录即可。
2、
- Maven依赖Java 需要配置JAVA_HOME
- 设置Maven自身的运行环境,需要匹配MAVEN_HOME
环境变量这两步就配置好了
打开cmd 输入mvn 如果配置好了就可以看到如图所示
3、Maven基础概念
3.1、仓库
3.2、坐标
什么是坐标:
- MAven坐标作用于描述仓库中资源的位置
Maven坐标的组成
- groupId:定义当前Maven项目隶属组织名称(通常是域名反写)
- artifactId: 定义当前Maven项目名称
- version: 定义当前项目版本号
Maven坐标的作用:
- 使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别于下载工作交由机器完成。坐标不是给人用的而是给Maven 工具用的
3.3 仓库配置
- 更改本地储存的位置,默认储存在c盘所以我将它该到了D盘
- 镜像仓库 我们直接从中央仓库下载jar包(国外网址)速度很慢,所以我们需要从国内的网址下。同样是在那个setting文件下,我们使用阿里云仓库。记得不要放在最外围的mirror标签下面
<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>
4、 第一个Maven项目
4.1、手工制作
第一个Maven项目完全手写,了解一下一个完整的Maven项目的结构
按照对应的结构我们创建文件夹 ,之后写一点简单的代码
我们按照结构把代码写好了,但是这还不是maven工程。我们还需要在src下面有一个pom.xml文件。我们可以在maven随便一个jar下面找到一个最简单的pom文件然后自己修改。
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<!--我们自己的坐标-->
<groupId>com.yubao</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>
- mvn compile 编译
全部写完之后打开cmd,通过命令编译这个项目
编译后会自动下载编译所需要的文件。这时候我们打开我们改过的仓库位置就会发现里面多了很多东西。
第一次编译要下载很多东西,所以比较慢。编译完成后我们的src所在的位置会多一个target文件夹 。
- mvn clean 我们也可以执行清理操作
执行完mvn clean这个target文件夹就被清理掉了
- mvn test 测试
运行完之后可以在target文件夹找到运行结果
- mvn package 打包好出现在target文件夹下
从cmd上我们可以看到在打包之前会先编译和测试
- mvn install 把我们现在打包的东西放在仓库里
箭头分别对应了我们com 项目名 版本号
4.2、插件创建工程
5 、IDEA连接Maven
5.1、连接并创建一个项目
首先我们在IDEA里面创建一个空的项目,创建完选择我们的JDK版本
之后打开我们的设置,搜索Maven,选择我们的版本 settings文件和仓库地址
配置好Maven之后我们新建Module
填写好相关信息,可以给对应的文件夹设置属性,一开始都是空的,test下没有resouces
这样我们的框架就搭好了,之后我们把测试Maven工程的jar加进去。写好记得刷新,否则出现不了。
接下来开始写我们的Maven项目,在main和test目录下把我们之前写的简单代码再cv上去。右侧都是我们之前的命令行操作
那么我们再另外一个地方也可以选择操作
那么这个有什么用呢?
一是我们可以不用让右边的功能栏占地方。
二是 我们Maven工程想打断点,就要再这个地方写一个运行,然后在点击右侧的debug就可以调试了。
5.2、使用模板创建项目
5.2.1Java项目
还是新建一个Modules,这次点击使用模板,并搜索quick,找到的那个就是创建java的
这样创建有什么区别呢?
唯一的区别:就是 在main和test目录下少了resouces这个目录,但是他会自动给我们创建好java类
我们手动添加即可
5.2.2 Web项目
具体步骤跟创建java项目差不多只是选择的模板不同。
创建好之后我们将缺少的东西补全
删除pom文件的这些内容
去Maven的仓库下载tomcat的插件,搜索 tomcat maven 并复制代码
然后在我们的IDEA上 pom文件上写上 加入插件的代码,加载好之后点击run
点击网址就能显示
我们还可以设置端口号和虚拟路径
那么这样启动很麻烦
我们可以像之前一样,设置一个单独的按钮
下面是完整有注解的代码
<?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>web02</name>
<!--组织id 通常是域名反写-->
<groupId>com.yubao</groupId>
<!--项目id -->
<artifactId>web02</artifactId>
<!--版本号 : release 完成版 snapshot 开发版-->
<version>1.0-SNAPSHOT</version>
<!--设置当前工程的所有依赖-->
<dependencies>
<!--具体的依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<!--构建-->
<build>
<!--设置插件-->
<plugins>
<!--具体的插件配置-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!--设置端口号-->
<port>80</port>
<!--设置虚拟路径-->
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
6、依赖管理
- 依赖指当前项目运行所需的jar,一个项目可以设置多个依赖
依赖就是上文注解里写的,在标签里面添加坐标
6.1、依赖传递
-
依赖具有传递性
-
直接依赖: 在当前项目中通过以依赖配置建立的依赖关系
-
间接依赖:以来的资源如果依赖其他资源,当前项目间接依赖其他资源
-
这种依赖关系是相对的
-
我们在java01中添加了对java02的依赖,那么我们在Java01 的依赖中就可以看到有java02的依赖log4j
-
依赖冲突问题
- 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高
- 声明优先:当资源在相同层级被依赖时 ,配置顺序靠前的覆盖配置靠后的 。
-
可选依赖
- 可选依赖指对外隐藏当前所依赖的资源———不透明
在java02的依赖中加上一个语句就可以让添加了java02的java01不知道java02添加了这个依赖。
我们也可以看到java02中依赖的junit里面依赖了另一个包,那么我们怎么将这个隐藏呢?按照我们之前的方法我们需要在写junit依赖的时候将那个包隐藏掉,但这是不可能的因为junit不是我们写的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dVVyNZ1t-1625745984798)(C:\Users\zhang\AppData\Roaming\Typora\typora-user-images\image-20210708100736129.png)]
6.3、排除依赖
-
之前学的可选依赖是我不让你看到,现在我们的做法是我添加依赖的时候不想看见你,就是排除依赖。
-
排除依赖不需要写版本号,可以看到我们在java02添加junit依赖的时候排除了junit下面的依赖
6.4、 依赖范围
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v4fUjgtj-1625745984804)(C:\Users\zhang\AppData\Roaming\Typora\typora-user-images\image-20210708103809410.png)]
在下图的箭头位置显示了依赖的scope
- 依赖范围传递性
7、生命周期与插件
7.1、项目构建生命周期
- Maven对项目构建的生命周期划分为三套
- clean: 清理工作
- default:核心工作,例如编译,测试,打包,部署等
- site: 产生报告,发布站点等
例如我们执行test的时候,test之前的所有活动都要执行。
7.2、插件
- 插件与生命周期内的阶段绑定,在执行到对应的生命周期时执行对应的插件功能。
- 默认maven在各个生命周期上绑定有预设的功能
- 通过插件可以自定义其他功能