一. 引言
1.1 项目管理问题
- 项目中jar包资源越来越多, jar包的管理越来越沉重
1.1.1 繁琐
- 要为每个项目手动导入所需的jar, 需要搜集全部的jar
1.1.2 复杂
- 项目中的jar如果需要版本升级, 就需要重新搜集jar
1.1.3 冗余
相同的jar在不同的项目中保存了多份
1.2 项目管理方案
- Java项目需要一个统一的便捷的管理工具: Maven
二. Maven介绍
- Maven这个单词来自意第绪语(犹太语), 意为知识的积累
- 是一个基于项目对象模型(POM)的概念的纯Java开发的开源的项目管理工具
- 主要用来管理java项目, 进行依赖管理
- 项目构建
- 分块开发
三. Maven安装
3.1 下载
下载链接: https://maven.apache.org/docs/history.html
下载apache-maven-3.5.4-bin.zip (适用于Windows系统), 然后解压
有如下目录
- bin: 含有mvn运行的脚本
- boot: 含有plexus-classworlds类加载器框架, Maven使用该框架加载自己的类库
- conf: 含有setting.xml配置文件
- lib: 含有maven运行时所需要的java类库
3.2 配置环境变量
- 系统环境变量下:
- 新增:
- 变量名: MAVEN_HOME
- 值: D:\Program Files\Maven_shine\apache-maven-3.5.4 (自己Maven的解压目录)
- 点击path
- 测试
四. Maven配置
- Maven的conf目录下的setting.xml配置
4.1 本地仓库
| <localRepository>D:\Program Files\Maven\repository</localRepository> |
| |
4.2 JDK配置
- 在标签中 增加一个标签 ,限定Maven项目默认的jdk版本
| |
| <profile> |
| <id>jdk-1.8</id> |
| <activation> |
| <activeByDefault>true</activeByDefault> |
| <jdk>1.8</jdk> |
| </activation> |
| <properties> |
| <maven.compiler.source>1.8</maven.compiler.source> |
| <maven.compiler.target>1.8</maven.compiler.target> |
| <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion> |
| </properties> |
| </profile> |
| |
| <activeProfiles> |
| <activeProfile>jdk-1.8</activeProfile> |
| </activeProfiles> |
五. 仓库
5.1 概念
- 存储依赖的地方, 体现形式就是本地的一个目录
- 仓库中不仅存放依赖, 而且管理着每个依赖的唯一标识(坐标), Java项目凭坐标获取依赖
5.2 仓库分类
当需要依赖时, 会从仓库中查找, 优先顺序为
本地仓库>私服(如果配置了的话)>公共仓库(如果配置了的话)>中央仓库
5.3 本地仓库
- 即在settings.xml 中配置的目录
- 使用过了的依赖都会自动存储在本地仓库中, 后续可以复用
5.4 远程仓库
5.4.1 中央仓库
5.4.2 公共仓库[重点]
| |
| <mirror> |
| <id>aliyun</id> |
| |
| <mirrorOf>central</mirrorOf> |
| <name>Nexus aliyun</name> |
| |
| <url>https://maven.aliyun.com/nexus/content/groups/public</url> |
| </mirror> |
| <mirror> |
| <id>huaweicloud</id> |
| |
| <mirrorOf>Central</mirrorOf> |
| <name>Nexus huaweicloud</name> |
| |
| <url>https://mirrors.huaweicloud.com/repository/maven/</url> |
| </mirror> |
5.4.3 私服[了解]
- 公司范围内共享的仓库, 不对外开放
- 可以通过Nexus来创建, 管理一个私服
六. IDEA-Maven
6.1 在IDEA中关联Maven
- 在IDEA中关联本地安装的Maven, 后续就可以通过IDEA使用Maven, 管理项目了
- settings for new projects-->Build, Execution, Deployment-->Build Tools-->Maven
- Maven home directory
- User settings file
- Maven的配置文件settings.xml路径, 在Maven的conf目录下
- Local repository

- 因为现在阿里云不支持http访问, 支持https, 所以有SSL证书验证的问题
- [重要]所以还需要在IDEA中添加一个配置
- 在Maven下的Importing的VM options for importer下导入
- -Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true

6.2 创建Maven项目
6.2.1 新建项目
- 新建项目, 选择Maven
- 确认自己的JDK是否已经选上
- 点击Next
6.2.2 项目位置
- Name: 项目名称
- Location: 项目保存位置
6.2.3 指定项目名
- GroupId: 项目标识,通常是公司域, 例: com.baidu
- ArtifactId: 项目名称
- Version: 项目版本号, 默认为1.0-SNAPSHOT
6.2.4 项目结构
- src/main/java 存放源代码, 建包, 放项目中的代码(service, dao, servlet...)
- src/main/resources 书写配置文件, 项目中的配置文件(jdbc.properties)
- src/test/java 书写测试代码, 项目中测试案例代码
- src/test/resources 书写测试案例相关配置文件
- 根目录/pom.xml(project object model) Maven项目核心文件, 其中定义项目构建方式, 声明依赖等
- 注意: 项目中的建包, 建类, 执行, 都和普通项目无差异
6.2.5 项目类型
- 根据项目类型, 在pom.xml中做出对应配置, 添加配置: war或者jar
| <?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> |
| |
| <groupId>com.dz</groupId> |
| <artifactId>MavenProject</artifactId> |
| <version>1.0-SNAPSHOT</version> |
| |
| |
| |
| |
| <packaging>war</packaging> |
| </project> |
6.2.6 设置编译编码格式
| <properties> |
| |
| <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
| </properties> |
6.3 导入依赖jar
-
创建好项目后, 需要导入需要的jar, 要通过
坐标
- 每个构件都有自己的坐标, GroupId + ArtifactId + Version = 项目标识 + 项目名 + 版本号
- 在Maven项目中只需要配置坐标, Maven便会自动加载对应依赖, 删除坐标则会自动移除依赖
6.3.1 查找依赖
6.3.2 导入依赖
| <packaging>war</packaging> |
| <properties> |
| |
| <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
| </properties> |
| |
| |
| <dependencies> |
| |
| <dependency> |
| |
| <groupId>javax.servlet</groupId> |
| <artifactId>jstl</artifactId> |
| <version>1.2</version> |
| </dependency> |
| </dependencies> |
6.3.3 同步依赖
- 引入坐标后, 同步依赖, 确认导入
- 在我们引入坐标后, IDEA通常会自动弹出导入依赖的选项, 我们点击即可 或者在IDEA的最右侧边框处有Maven, 在此处刷新
6.4 创建web项目
6.4.1 打包方式
| <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.dz</groupId> |
| <artifactId>MavenProject</artifactId> |
| <version>1.0-SNAPSHOT</version> |
| |
| |
| |
| |
| <packaging>war</packaging> |
| </project> |
6.4.2 web依赖
- 导入servlet 和 JSP 和 JSTL依赖, 使项目具有web编译环境
| <?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> |
| |
| <groupId>com.dz</groupId> |
| <artifactId>MavenProject</artifactId> |
| <version>1.0-SNAPSHOT</version> |
| |
| |
| |
| |
| <packaging>war</packaging> |
| <properties> |
| |
| <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
| </properties> |
| |
| |
| <dependencies> |
| |
| |
| <dependency> |
| |
| <groupId>javax.servlet</groupId> |
| <artifactId>jstl</artifactId> |
| <version>1.2</version> |
| </dependency> |
| |
| <dependency> |
| |
| <groupId>javax.servlet</groupId> |
| <artifactId>javax.servlet-api</artifactId> |
| <version>3.1.0</version> |
| <scope>provided</scope> |
| </dependency> |
| |
| <dependency> |
| |
| <groupId>javax.servlet</groupId> |
| <artifactId>jsp-api</artifactId> |
| <version>2.0</version> |
| <scope>provided</scope> |
| </dependency> |
| |
| </dependencies> |
| </project> |
| 折叠 |
6.4.3 webapp目录
- 按照Maven规范, 在main目录下新建web项目的特有目录 webapp
- webapp目录下新建WEB-INF目录
- WEB-INF目录下新建web.xml
| <?xml version="1.0" encoding="UTF-8"?> |
| <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" |
| xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" |
| version="3.1"> |
| </web-app> |
6.4.4 定义Servlet和JSP
- main-->java-->com.dz-->servlet下新建TestServlet
| package com.dz.servlet; |
| |
| import javax.servlet.ServletException; |
| import javax.servlet.annotation.WebServlet; |
| import javax.servlet.http.HttpServlet; |
| import javax.servlet.http.HttpServletRequest; |
| import javax.servlet.http.HttpServletResponse; |
| import java.io.IOException; |
| |
| @WebServlet(name = "TestServlet", value = "/test") |
| public class TestServlet extends HttpServlet { |
| protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { |
| System.out.println("Test Servlet!"); |
| request.getRequestDispatcher("/index.jsp").forward(request,response); |
| } |
| |
| protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { |
| doPost(request,response); |
| } |
| } |
| <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
| <html> |
| <head> |
| <title>Title</title> |
| </head> |
| <body> |
| <span style="color: red">Hello World!</span> |
| </body> |
| </html> |
6.5 部署web项目
6.5.1 新增Tomcat
- 点击Edit Configuration(运行图标的左侧)
- 点击+, 找到Tomcat Server下的Local
- 点击OK
- 在Server下自定义Tomcat名称 Name:
- 点击configure, 选择Tomcat的安装目录
- 点击OK即可
6.5.2 部署web项目
- 还是点击Edit Configuration(运行图标的左侧)
- 然后找到Deployment并点击
- 在右侧点击+, 选择Artifact, 然后选项目名:war exploded, 这表示我们把此项目成功部署到了Tomcat下
- Deployment下的Application context是项目默认访问路径; 可以自定义, 建议和项目同名, 比如: /MavenProject, 或者为了访问简单, 可以直接设置: /
- 最后点击OK即可
6.5.3 启动Tomcat
- 方法一: 点击IDEA上方的运行图标
- 方法二: 在IDEA最下一行找到Services, 点开后在此处运行Tomcat
- 最后等待弹出浏览器框: 路径: localhost:8080/MavenProject/, 这个默认是自动跳转到webapp下index.jsp中, 我们在网址后方加上test, 就访问到我们创建的TestServlet了
6.6 依赖生命周期
6.6.1 概念
6.6.2 使用方式
| <dependencies> |
| <dependency> |
| |
| <groupId>javax.servlet</groupId> |
| <artifactId>jstl</artifactId> |
| <version>1.2</version> |
| </dependency> |
| <dependency> |
| |
| <groupId>javax.servlet</groupId> |
| <artifactId>javax.servlet-api</artifactId> |
| <version>3.1.0</version> |
| |
| <scope>provided</scope> |
| </dependency> |
| <dependency> |
| |
| <groupId>javax.servlet</groupId> |
| <artifactId>jsp-api</artifactId> |
| <version>2.0</version> |
| |
| <scope>provided</scope> |
| </dependency> |
| </dependencies> |
6.6.3 生命周期详解
- compile
- 缺省值, 适用于所有阶段(测试运行, 编译, 运行, 打包)
- provided
- 类似compile, 期望JDK, 容器或使用者会提供这个依赖, 如servlet-api.jar; 适用于(测试运行, 编译)阶段
- runtime
- 只在运行时使用, 如MySQL的驱动jar, 适用于(运行, 测试运行)阶段
- test
- 只在测试时使用, 适用于(编译, 测试运行)阶段, 如junit.jar
- system
- Maven不会在仓库中查找对应依赖, 而在本地磁盘目录中查找; 适用于(编译, 测试运行, 运行)阶段
七. Maven指令
7.1 命令行
- 通过IDEA打开命令行, 然后执行Maven命令
- 也就是在Terminal中执行Maven命令, 例如输入:
- mvn -v 查看Maven版本号
- mvn clean 清除上次编译的结果(target)
7.2 Maven面板
- IDEA中有Maven面板(IDEA最右侧边框上), 其中可以快速执行Maven指令
- 双击即可快速执行
- maven常用命令:
- mvn clean 清空产生的项目( target)
- mvn compile 编译源代码
- mvn package 打包, 默认打包jar包, 如果配置了war则打包war包
- mvn install 在本地repository中安装jar(包含mvn compile,mvn package,然后上传到本地仓库)
- mvn deploy 上传到私服(包含mvn install,然后,上传到私服)
- mvn test 运行测试
- mvn site 产生site
- mvn test-compile 编译测试代码
- mvn -Dtest package 只打包不测试
- mvn jar:jar 只打jar包
- mvn test -skipping compile -skipping test-compile 只测试而不编译,也不测试编译
- mvn source.jar 源码打包
八. 私服
8.1 概念
- 私服是架设在局域网的一种特殊的远程仓库, 目的是代理远程仓库及部署第三方构件
- 有了私服后, 当Maven需要下载依赖时, 直接请求私服, 私服上存在则下载到本地仓库; 否则, 私服请求外部的远程仓库, 将构件下载到私服, 再提供给本地仓库下载
- 私服可以解决在企业做开发时每次需要的jar包都要在中心仓库下载, 且每次下载完只能被自己使用, 而不能被其他开发者使用的问题
- 所谓私服就是一个服务器, 但是不是本地层面的, 是公司层面的, 公司中所有的开发人员都在使用同一个私服
8.2 架构
- 无私服时
- 有私服时
- 我们可以使用专门的Maven仓库管理软件来搭建私服, 比如:Apache Archiva, Artifactory, Sonatype Nexus, 这里我们使用Sonatype Nexus
8.3 Nexus安装[了解]
8.3.1 下载
8.3.2 安装
- 下载nexus-2.x-bundle.zip, 解压即可
8.4 启动[了解]
- 解压后在bin目录中执行(或者直接为Nexus配置环境变量, 和Maven同理):(以管理员身份运行cmd)
- nexus install 在系统中安装nexus 服务
- nexus uninstall 卸载nexus 服务
- nexus start 启动服务
- nexus stop 停止服务
8.5 Nexus 登陆[了解]
8.6 仓库列表[了解]
- 仓库类型
- group: 包含多个仓库, 通过group库的地址可以从包含的多个仓库中查找构件
- hosted: 私服服务器本地的仓库, 其中存储诸多构件
- proxy: 代理仓库, 其会关联一个远程仓库, 比如中央仓库, aliyun仓库, 向该仓库查找构件时, 如果没有会从其关联的仓库中下载
- 仓库名
- Releases: 存放项目的稳定发布版本, 一个模块做完后如果需要共享给他人, 可以上传到私服的该库
- Snapshots: 对应不稳定的发布版本
- 3rd party: 存放中央仓库没有的, 如ojdbc.jar, 可以上传到私服的该库中
8.7 Maven中配置私服[重点]
- 在Maven中配置私服, 使得Maven可以从私服上获取构件
8.7.1 仓库组
- 而此时就有问题, 私服中有很多仓库, 每个仓库都有自己的url, 那么项目中配置哪个仓库呢?
- 私服中有一个仓库组, 组中包含多个仓库, 可以指定仓库组的url, 即可以从多个仓库中获取构件
- 点击仓库central-->Configuration-->Remote Storage Location
- 点击仓库Public Repositories-->Configuration
- 将3rd party从左侧的Ordered Group Repositories移到右侧的Avaliable Repositories(通过点击右箭头的方式)
- 左侧的Ordered Group Repositories重新排序, Central排到第一位(鼠标拖拽), 此顺序代表提供依赖的仓库优先级, 现在的Central(已关联华为云)第一优先提供依赖
8.7.2 Maven关联私服
- 配置setting.xml, 设置私服地址, 认证等信息
- 复制时不要复制两头的大标签, 例如< servers>< /servers>, 只需把其内容复制到对应大标签下
| <servers> |
| |
| <server> |
| <id>nexus-public</id> |
| <username>admin</username> |
| <password>admin123</password> |
| </server> |
| </servers> |
| |
| <mirrors> |
| <mirror> |
| |
| <id>huaweicloud</id> |
| |
| <mirrorOf>Central</mirrorOf> |
| <name>Nexus huaweicloud</name> |
| |
| <url>https://mirrors.huaweicloud.com/repository/maven/</url> |
| </mirror> |
| </mirrors> |
| |
| <profiles> |
| |
| <profile> |
| <id>nexus</id> |
| <repositories> |
| <repository> |
| |
| <id>nexus-public</id> |
| |
| <name>Naxus Release Snapshot Repository</name> |
| |
| <url>http://localhost:8081/nexus/content/groups/public/</url> |
| <releases><enabled>true</enabled></releases> |
| <snapshots><enabled>true</enabled></snapshots> |
| </repository> |
| </repositories> |
| |
| <pluginRepositories> |
| <pluginRepository> |
| |
| <id>nexus-public</id> |
| |
| <url>http://localhost:8081/nexus/content/groups/public/</url> |
| <releases><enabled>true</enabled></releases> |
| <snapshots><enabled>true</enabled></snapshots> |
| </pluginRepository> |
| </pluginRepositories> |
| <profile> |
| </profiles> |
| |
| |
| <activeProfiles> |
| <activeProfile>nexus</activeProfile> |
| </activeProfiles> |
| 折叠 |
- 至此, Maven项目需要依赖时, Maven会从私服中下载
8.8 Maven项目部署到私服
- 执行: mvn deploy 即可将项目部署到私服对应的仓库中, 此时项目中的打包方式多为jar
- 但需要提前在项目的pom.xml中配置部署私服仓库位置, 如下
| |
| <distributionManagement> |
| <snapshotRepository> |
| <id>nexus-public</id> |
| <name>User Project Snapshot</name> |
| |
| <url>http://localhost:8081/nexus/content/repositories/snapshots/</url> |
| <uniqueVersion>true</uniqueVersion> |
| </snapshotRepository> |
| <repository> |
| <id>nexus-public</id> |
| <name>User Project Release</name> |
| |
| <url>http://localhost:8081/nexus/content/repositories/releases/</url> |
| </repository> |
| </distributionManagement> |
- 注意: 如上的id依然要和setting.xml中配置的server中的id保持一致, 才能通过私服的验证
- 项目部署到Snapshots仓库中还是Releases仓库中取决于我们< version>1.0-SNAPSHOT< /version> 中写的是SNAPSHOT还是RELEASE(或者不写,默认就是这个)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步