Maven day01
1 Maven简介
项目开发过程中除了关键的编码配置部分,还需要搭建项目开发环境(创建项目结构,管理依赖…)。Maven是apache组织孵化提供的开发的项目构建工具,简化项目构建的过程。
传统的项目开发过程中存在的问题:
- 不同的集成开发工具(eclipse、MyEclipse、IDEA)有不同的项目目录结构。直接使用集成开发工具创建项目,项目结构和开发工具绑定,不利于团队的开发工具的升级。
- 手动管理依赖:麻烦,后期依赖升级管理非常困难。
解决方案:使用项目构建工具 Maven
2 Maven的安装
-
解压缩apache-maven-3.x.x-bin.zip,将解压缩后的文件放到非中文路径下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ux5J2VQQ-1627219850313)(Maven day01.assets/image-20200421105252407.png)]
-
将.m2文件夹直接复制到
C:/用户/{当前用户名}
文件夹[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i1pkvg5B-1627219850315)(Maven day01.assets/image-20200421110114990.png)]
-
配置环境变量
JAVA_HOME=C:\Program Files\Java\jdk1.8.0_192 M2_HOME=D:\apache\apache-maven-3.6.3 Path=原来其它值;%M2_HOME%\bin
-
验证安装是否成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PFzPvZtn-1627219850316)(Maven day01.assets/image-20210601145110754.png)]
注意:以管理员身份运行cmd,输入mvn -version
3 Maven的项目结构
+项目名
+src //存放源代码+配置文件
+main //存放主要的功能代码+配置文件
+java //存放功能代码
+resources //存放配置文件
+webapp //web项目独有,类似于eclipse的WebContent目录
+test //存放测试的代码+配置文件
+java //存放测试文件
+resources //存放测试时的配置文件
+target //存放编译后class文件
-pom.xml //Project Object Model 配置项目的基本信息
4 Idea下使用Maven
4.1 Idea下关联Maven
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zbxQl5Tm-1627219850317)(Maven day01.assets/1622445564746.png)]
4.2 Idea下创建Maven web项目
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5s91h2RO-1627219850318)(Maven day01.assets/1622446401914.png)]
解决web项目结构不完整:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uws2tIEf-1627219850318)(Maven%20day01.assets/image-20210601150212410.png)]
修改项目编解码方式和JDK版本:(修改后一定要再次刷新项目)
<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.baizhi</groupId>
<artifactId>maven-web</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<!-- 项目参数配置 -->
<properties>
<!-- 项目的编码方式-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- jdk版本 -->
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
注意:添加配置后,需要刷新Maven项目。
5 将Idea的Web项目转变为Maven Web项目
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o4EfHz5U-1627219850319)(Maven%20day01.assets/image-20210608110310812.png)]
注意:WEB-INF下的lib目录不要再复制,如果复制,仍是手动的管理依赖。
6 Maven的依赖管理
之前项目中手动依赖管理的问题:
- 操作繁琐
- 管理困难
解决方案:Maven自动依赖管理。
6.1 Maven项目的坐标
坐标的组成:
<groupId>公司或组织名</groupId>
<artifactId>项目名</artifactId>
<version>版本号</version>
<packaging>打包方式(项目类型)
jar:普通的java项目
web:web项目
</packaging>
每一个Maven项目都会有属于自己的唯一的坐标。通过Maven坐标可以在互联网上唯一的标识一个项目。
6.2 依赖管理的思路
一个A项目开发、运行时需要使用另外一个B项目的开发结果(jar),那么A依赖于B。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VmleFEjg-1627219850320)(Maven day01.assets/image-20200421160343810.png)]
具体操作:就是在项目的pom.xml中通过dependency标签声明项目依赖的jar报的坐标,Maven会根据坐标自动从Maven仓库中获取依赖。
6.3 实战
原来手动管理的依赖,替换为pom.xml中dependency配置。可以通过Maven官方提供的搜索服务搜索jar包的坐标。
Maven会自动分析传递依赖,在我们自己的项目的pom.xml中,只需要声明直接依赖的jar的坐标即可。
<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.baizhi</groupId>
<artifactId>maven-web</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<!-- 项目参数配置 -->
<properties>
<!-- 项目的编码方式-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- jdk版本 -->
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!-- JUnit测试依赖 -->
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- 数据库相关依赖 -->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
<!-- hutool工具类 -->
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.2.3</version>
</dependency>
<!-- servlet + jsp + jstl 依赖 -->
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl -->
<!-- https://mvnrepository.com/artifact/jstl/jstl -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
</project>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PLzE5z2x-1627219850320)(Maven%20day01.assets/image-20210609104037724.png)]
注意:Maven的web项目和普通web项目的部署访问方式没有区别。
6.4 properties抽取版本号
为了方便依赖版本号的管理,可以在properties中自定义标签声明版本号,然后在version标签中通过${标签名}的方法引用版本号。方便再properties中统一管理版本号。
<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.baizhi</groupId>
<artifactId>maven-web</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<!-- 项目参数配置 -->
<properties>
<!-- 项目的编码方式-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- jdk版本 -->
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<!-- 自定义标签声明版本号-->
<junit.version>4.12</junit.version>
<mysql.version>8.0.23</mysql.version>
<hutool.version>5.2.3</hutool.version>
<servlet.version>4.0.1</servlet.version>
<jsp.version>2.3.3</jsp.version>
<jstl.version>1.2</jstl.version>
</properties>
<dependencies>
<!-- JUnit测试依赖 -->
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!-- 数据库相关依赖 -->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- hutool工具类 -->
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<!-- servlet + jsp + jstl 依赖 -->
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet.version}</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>${jsp.version}</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl -->
<!-- https://mvnrepository.com/artifact/jstl/jstl -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
</dependencies>
</project>
7 Maven的生命周期
Maven的生命周期就是指Maven项目从项目初始化到部署的完整过程。包含着项目的清理、校验、编译、测试、打包、检查、安装、发布等多个阶段。
-
clean清理阶段
清理上一次构建生成的文件,会将target文件夹删除
-
validate校验阶段
验证工程是否正确,所有需要的资源是否可用。
-
compile编译阶段
编译项目的源代码
-
test测试阶段
执行test/java下的测试代码
-
package打包阶段
将项目打包后jar或者war
-
verify检查阶段
运行所有检查,验证包是否有效且达到质量标准。
-
install安装阶段
把包安装到maven本地仓库,可以被其他工程作为依赖来使用
-
site 生成站点文档阶段
生成项目站点文档
-
deploy 发布阶段
将项目站点发布到服务器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z4WQTAmv-1627219850321)(Maven%20day01.assets/image-20210601153357039.png)]
在Idea的Maven工具栏,找到Lifecycle,双击即可执行对应的阶段。最常执行的是clean、和compile以及package阶段。
8 Maven仓库
通过Maven工具开发的项目、插件…统称为Maven构件。存放Maven项目结果(构件)的地方,称之为Maven仓库。
Maven仓库的分类:
- 本地仓库
- 远程仓库
8.1 本地仓库
本地仓库:位于本机的Maven仓库,mvn install将jar包安装到本地仓库,默认位置为.m2/respository。
.m2/settings.xml修改本地仓库的位置
<localRepository>E:/repository</localRepository>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qy4LVert-1627219850322)(Maven day01.assets/image-20200421172106385.png)]
注意:如果修改本地仓库,Idea中的项目需要手动刷新下项目才能识别。
8.2 远程仓库
远程仓库:位于网络上的仓库,必须通过网络访问。
8.2.1 中央仓库
中央仓库:Maven官方提供的远程仓库。还有会一些公司或组织维护的仓库,是中央仓库有力的补充。可以在中央仓库提供的搜索服务中搜索需要的jar包。
8.2.2 镜像
镜像:网络上B仓库提供了A仓库相同的内容,那么称B是A的镜像。中央仓库假设国外,国内使用不太方面,阿里云提供了中央仓库的镜像。
settings.xml设置使用阿里云镜像:
<mirrors>
<!-- mirror
| Specifies a repository mirror site to use instead of a given repository. The repository that
| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
|
-->
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
8.2.3 私服
私服:假设在局域网中的Maven仓库,它本身可以代理互联网上的远程仓库(一般代理中央仓库或者阿里云镜像),为局域网中Maven用户提供服务。
私服的好处:
- 节省网络带宽,更稳定
- 加强权限控制
8.3 Maven仓库的使用顺序
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e3E7LlPK-1627219850322)(Maven day01.assets/image-20200421174829103.png)]
顺序:本地–>私服–>镜像–>中央仓库
注意:
- 一旦在某一步找到需要的依赖,立刻返回。
- 本地仓库和中央仓库一定是有的,但是私服和镜像会根据公司情况有所删减。
9 Maven下开发Web项目步骤
-
搭建开发环境
-
新建web项目
参考4.2 操作
注意:1.补全项目结构 2.修改编解码方式和jdk版本
-
导入依赖
在pom.xml中通过配置引入依赖,复制粘贴笔记内容,参考6.3实战。
-
导入工具类+配置文件
工具类:src/main/java目录下 com.baizhi.util包里
配置文件:src/main/resources目录下
jdbc.properties
-
-
建表
-
实体类 src/main/java
-
dao src/main/java
-
service src/main/java
-
test src/test/java
-
controller+jsp
controller: src/main/java
jsp: src/main/webapp
作业:将之前的web项目修改为Maven web项目。
注意:1.补全项目结构 2.修改编解码方式和jdk版本
-
导入依赖
在pom.xml中通过配置引入依赖,复制粘贴笔记内容,参考6.3实战。
-
导入工具类+配置文件
工具类:src/main/java目录下 com.baizhi.util包里
配置文件:src/main/resources目录下
jdbc.properties
-
建表
-
实体类 src/main/java
-
dao src/main/java
-
service src/main/java
-
test src/test/java
-
controller+jsp
controller: src/main/java
jsp: src/main/webapp
作业:将之前的web项目修改为Maven web项目。