Java-SSM-Day01 Maven理论
一、Maven的入门进阶
1.1什么是Maven:掌控软件安装配置以及项目构建依赖管理的软件。
1.3选用Maven-3.6.3
二、基于IDEA的Maven工程创建
2.1梳理Maven工程GAVP属性:GroupId、ArtifactId、Version、Packaging
GroupId格式:com.mingxi.业务线.子业务线
ex: com.mingxi.java
ArtifactID格式: 产品线名-模块名
ex: tc-client
Version格式:主版本号.次版本号.修订好 1.0.0
ex.1.1.1
Pacaging格式:jar:打包Java工程、war:打包web工程、pom:不会打包,用作继承的父工程
|-- pom.xml # Maven 项目管理文件
|-- src
|-- main # 项目主要代码
| |-- java # Java 源代码目录
| | `-- com/example/myapp # 开发者代码主目录
| | |-- controller # 存放 Controller 层代码的目录
| | |-- service # 存放 Service 层代码的目录
| | |-- dao # 存放 DAO 层代码的目录
| | `-- model # 存放数据模型的目录
| |-- resources # 资源目录,存放配置文件、静态资源等
| | |-- log4j.properties # 日志配置文件
| | |-- spring-mybatis.xml # Spring Mybatis 配置文件
| | `-- static # 存放静态资源的目录
| | |-- css # 存放 CSS 文件的目录
| | |-- js # 存放 JavaScript 文件的目录
| | `-- images # 存放图片资源的目录
| `-- webapp # 存放 WEB 相关配置和资源
| |-- WEB-INF # 存放 WEB 应用配置文件
| | |-- web.xml # Web 应用的部署描述文件
| | `-- classes # 存放编译后的 class 文件
| `-- index.html # Web 应用入口页面
`-- test # 项目测试代码
|-- java # 单元测试目录
`-- resources # 测试资源目录
三、Maven核心功能以来和构建管理
3.1依赖管理和配置
定义 POM 文件,Maven 能够自动解析项目的依赖关系,并通过 Maven 仓库自动下载和管理依赖,从而避免了手动下载和管理依赖的繁琐工作和可能 引发的版本冲突问题。
<!-- 申明版本号 --> <version>1.0.0</version> <!-- 申明打包方式 --> <packaging>jar</packaging> <!-- 第三方依赖信息申明 dependencies :项目依赖信息的集合 dependency :每个依赖项 [gav] :依赖的信息,就是其他maven的工程[jar] 第三方以来信息怎么知道? 例如找 jackson-core 1.maven官网 mvnrepository.com里搜索 然后找到Maven信息 2.maven插件:maven-search Tools-maven&search 扩展: 1.提取版本号 2.可选属性scope scope 引用依赖的作用域 - compile :main目录 test目录 打包打包 [默认] - provided:main目录 test目录 Servlet - runtime: 打包运行 MySQL JDBC - test: test目录 junit 依赖传递:A>B 导入A则自动导入B[确定版本不冲突] 依赖冲突:A-B-C-A [避免重复依赖]
前提:
A 1.1 -> B 1.1 -> C 1.1
F 2.2 -> B 2.2
pom声明:
F 2.2
A 1.1
B 2.2
最后会有 F2.2 A1.1 B2.2
-->
3.3依赖导入失败以及解决方案
在使用 Maven 构建项目时,可能会发生依赖项下载错误的情况,主要原因有以下几种:
1. 下载依赖时出现网络故障或仓库服务器宕机等原因,导致无法连接至 Maven 仓库,从而无法下载依赖。
2. 依赖项的版本号或配置文件中的版本号错误,或者依赖项没有正确定义,导致 Maven 下载的依赖项与实际需要的不一致,从而引发错误。
3. 本地 Maven 仓库或缓存被污染或损坏,导致 Maven 无法正确地使用现有的依赖项,并且也无法重新下载!
解决方案:
1. 检查网络连接和 Maven 仓库服务器状态。
2. 确保依赖项的版本号与项目对应的版本号匹配,并检查 POM 文件中的依赖项是否正确。
3. 清除本地 Maven 仓库缓存(lastUpdated 文件),因为只要存在lastupdated缓存文件,刷新也不会重新下载。本地仓库中,根据依赖的gav属性依次 向下查找文件夹,最终删除内部的文件,刷新重新下载即可!
bat脚本清理
@echo off
rem 这里写你的仓库路径
set REPOSITORY_PATH=D:\Java-SSM\repository
rem 正在搜索...
for /f "delims=" %%i in ('dir /b /s "%REPOSITORY_PATH%\*lastUpdated*"') do (
del /s /q %%i
)
rem 搜索完毕
pause
3.4扩展构建管理和插件配置
项目构建:源代码、依赖库和资源文件等转换成可执行或可部署的应用程序的过程。
**主动触发场景:**
- 重新编译 : 编译不充分, 部分文件没有被编译!
- 打包 : 独立部署到外部服务器软件,打包部署
- 部署本地或者私服仓库 : maven工程加入到本地或者私服仓库,供其他工程使用
命令的方式构建:mvn 构建命令 构建命令 ...
命令 | 描述 |
---|---|
mvn clean | 清理编译或打包后的项目结构,删除target文件夹 |
mvn compile | 编译项目,生成target文件 |
mvn test | 执行测试源码 (测试) |
mvn site | 生成一个项目依赖信息的展示页面 |
mvn package | 打包项目,生成war / jar 文件 |
mvn install | 打包后上传到maven本地仓库(本地部署) |
mvn deploy | 只打包,上传到maven私服仓库(私服部署) |
可视化方式构建:
**构建命令周期:**
构建生命周期可以理解成是一组固定构建命令的有序集合,触发周期后的命令,会自动触发周期前的命令!也是一种简化构建的思路!
- 清理周期:主要是对项目编译生成文件进行清理
包含命令:clean
- 默认周期:定义了真正构件时所需要执行的所有步骤,它是生命周期中最核心的部分
包含命令:compile - test - package - install / deploy
- 报告周期
包含命令:site
打包: mvn clean package 本地仓库: mvn clean install
最佳方案
打包: mvn clean package
重新编译: mvn clean compile
本地部署: mvn clean install
**周期,命令和插件:**
周期→包含若干命令→包含若干插件!
使用周期命令构建,简化构建过程!
最终进行构建的是插件!
<build> <!-- jdk17 和 war包版本插件不匹配 --> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.2.2</version> </plugin> </plugins> </build>
四、Maven继承和聚合特性
4.1Maven工程继承
继承特性:在父工程中统一管理项目中的依赖信息,进行统一版本管理!
语法:
<groupId>com.atguigu.maven</groupId> <artifactId>pro03-maven-parent</artifactId> <version>1.0-SNAPSHOT</version> <!-- 当前工程作为父工程,它要去管理子工程,所以打包方式必须是 pom --> <packaging>pom</packaging>
<!-- 使用parent标签指定当前工程的父工程 --> <parent> <!-- 父工程的坐标 --> <groupId>com.atguigu.maven</groupId> <artifactId>pro03-maven-parent</artifactId> <version>1.0-SNAPSHOT</version> </parent> <!-- 子工程的坐标 --> <!-- 如果子工程坐标中的groupId和version与父工程一致,那么可以省略 --> <!-- <groupId>com.atguigu.maven</groupId> --> <artifactId>pro04-maven-module</artifactId> <!-- <version>1.0-SNAPSHOT</version> -->
父工程依赖统一管理
父工程声明版本
1 <!-- 使用dependencyManagement标签配置对依赖的管理 --> 2 <!-- 被管理的依赖并没有真正被引入到工程 --> 3 <dependencyManagement> 4 <dependencies> 5 <dependency> 6 <groupId>org.springframework</groupId> 7 <artifactId>spring-core</artifactId> 8 <version>4.0.0.RELEASE</version> 9 </dependency> 10 <dependency> 11 <groupId>org.springframework</groupId> 12 <artifactId>spring-beans</artifactId> 13 <version>4.0.0.RELEASE</version> 14 </dependency> 15 <dependency> 16 <groupId>org.springframework</groupId> 17 <artifactId>spring-context</artifactId> 18 <version>4.0.0.RELEASE</version> 19 </dependency> 20 <dependency> 21 <groupId>org.springframework</groupId> 22 <artifactId>spring-expression</artifactId> 23 <version>4.0.0.RELEASE</version> 24 </dependency> 25 <dependency> 26 <groupId>org.springframework</groupId> 27 <artifactId>spring-aop</artifactId> 28 <version>4.0.0.RELEASE</version> 29 </dependency> 30 </dependencies> 31 </dependencyManagement>
子工程引用版本
1 <!-- 子工程引用父工程中的依赖信息时,可以把版本号去掉。 --> 2 <!-- 把版本号去掉就表示子工程中这个依赖的版本由父工程决定。 --> 3 <!-- 具体来说是由父工程的dependencyManagement来决定。 --> 4 <dependencies> 5 <dependency> 6 <groupId>org.springframework</groupId> 7 <artifactId>spring-core</artifactId> 8 </dependency> 9 <dependency> 10 <groupId>org.springframework</groupId> 11 <artifactId>spring-beans</artifactId> 12 </dependency> 13 <dependency> 14 <groupId>org.springframework</groupId> 15 <artifactId>spring-context</artifactId> 16 </dependency> 17 <dependency> 18 <groupId>org.springframework</groupId> 19 <artifactId>spring-expression</artifactId> 20 </dependency> 21 <dependency> 22 <groupId>org.springframework</groupId> 23 <artifactId>spring-aop</artifactId> 24 </dependency> 25 </dependencies>
4.2Maven聚合关系
概念:Maven 聚合是指将多个项目组织到一个父级项目中,通过触发父工程的构建,统一按顺序触发子工程构建的过程!!
作用:统一管理子项目构建:通过聚合,可以将多个子项目组织在一起,方便管理和维护。
优化构建顺序:通过聚合,可以对多个项目进行顺序控制,避免出现构建依赖混乱导致构建失败的情况。
语法:
父项目中包含的子项目列表。
<project> <groupId>com.example</groupId> <artifactId>parent-project</artifactId> <packaging>pom</packaging> <version>1.0.0</version> <modules> <module>child-project1</module> <module>child-project2</module> </modules> </project>