1_Maven
阅读原文时间:2023年07月09日阅读:1

一. 引言

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开发的开源的项目管理工具
  1. 主要用来管理java项目, 进行依赖管理

    • jar包依赖管理
  2. 项目构建

    • 项目编译, 打包, 测试, 部署
  3. 分块开发

    • 提高开发效率

三. 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_HOME\bin%
  • 测试

    • 命令行下输入 mvn -v 查看版本信息

四. Maven配置

  • Maven的conf目录下的setting.xml配置

4.1 本地仓库

<localRepository>D:\Program Files\Maven\repository</localRepository>
<!-- 选择一个磁盘目录, 作为本地仓库 -->

4.2 JDK配置

  • 在标签中 增加一个标签 ,限定Maven项目默认的jdk版本

    jdk-1.8 true 1.8 1.8 1.8 1.8

    jdk-1.8

五. 仓库

5.1 概念

  • 存储依赖的地方, 体现形式就是本地的一个目录
  • 仓库中不仅存放依赖, 而且管理着每个依赖的唯一标识(坐标), Java项目凭坐标获取依赖

5.2 仓库分类

  • Maven仓库

    • 本地仓库
    • 远程仓库
      • 中央仓库
      • 公共仓库
      • 私服

当需要依赖时, 会从仓库中查找, 优先顺序为

本地仓库>私服(如果配置了的话)>公共仓库(如果配置了的话)>中央仓库

5.3 本地仓库

  • 即在settings.xml 中配置的目录
  • 使用过了的依赖都会自动存储在本地仓库中, 后续可以复用

5.4 远程仓库

5.4.1 中央仓库
  • Maven的中央仓库是由Maven社区提供的仓库, 不用任何配置, Maven中内置了中央仓库的地址, 其中包含了绝大多数流行的开源Java构件
  • https://mvnrepository.com/ 可以搜索需要的依赖的相关信息(仓库搜索服务)
  • https://repo.maven.apache.org/maven2/ 中央仓库地址
5.4.2 公共仓库[重点]
  • 除中央仓库之外, 还有其他远程仓库, 比如aliyun仓库(https://maven.aliyun.com/nexus/content/groups/public)

  • 中央仓库在国外, 下载依赖速度过慢, 所以都会配置一个国内的公共仓库代替中央仓库

  • 在setting.xml中添加以下配置

    aliyun central Nexus aliyun https://maven.aliyun.com/nexus/content/groups/public

  • 或者可以配置华为镜像, 配置如下:

    huaweicloud Central Nexus huaweicloud https://mirrors.huaweicloud.com/repository/maven/

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

      • Maven的安装路径
    • User settings file

      • Maven的配置文件settings.xml路径, 在Maven的conf目录下
    • Local repository

      • Maven的本地仓库路径

  • 因为现在阿里云不支持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 新建项目
  1. 新建项目, 选择Maven
  2. 确认自己的JDK是否已经选上
  3. 点击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

    http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4.0.0

    <groupId>com.dz</groupId>
    <artifactId>MavenProject</artifactId>
    <version>1.0-SNAPSHOT</version>
    
    <!--打包方式 如果是java项目则用jar
                如果是web项目则用war-->
    <!--<packaging>jar</packaging>-->
    <packaging>war</packaging>

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 导入依赖
  • 在项目的pom.xml文件中, 增加依赖

    <packaging>war</packaging>
    <properties>
        <!--编译编码-->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    
    <!--定义项目中需要的所有依赖-->
    <dependencies>
        <!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
        <dependency>
            <!--jstl支持-->
            <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 打包方式
  • pom.xml中设置war

    http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4.0.0

    <groupId>com.dz</groupId>
    <artifactId>MavenProject</artifactId>
    <version>1.0-SNAPSHOT</version>
    
    <!--打包方式 如果是java项目则用jar
                如果是web项目则用war-->
    <!--<packaging>jar</packaging>-->
    <packaging>war</packaging>

6.4.2 web依赖
  • 导入servlet 和 JSP 和 JSTL依赖, 使项目具有web编译环境

    http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4.0.0

    <groupId>com.dz</groupId>
    <artifactId>MavenProject</artifactId>
    <version>1.0-SNAPSHOT</version>
    
    <!--打包方式 如果是java项目则用jar
                如果是web项目则用war-->
    <!--<packaging>jar</packaging>-->
    <packaging>war</packaging>
    <properties>
        <!--编译编码-->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    
    <!--定义项目中需要的所有依赖-->
    <dependencies>
        <!--web 项目的编译环境-->
        <!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
        <dependency>
            <!--jstl支持-->
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
            <!--servlet编译环境-->
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.servlet/jsp-api -->
        <dependency>
            <!--jsp编译环境-->
            <groupId>javax.servlet</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
            <scope>provided</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    </dependencies>


    折叠

6.4.3 webapp目录
  • 按照Maven规范, 在main目录下新建web项目的特有目录 webapp

  • webapp目录下新建WEB-INF目录

  • WEB-INF目录下新建web.xml


    http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">

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);
    }

    }

  • webapp目录下新建index.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    Title Hello World!

6.5 部署web项目

6.5.1 新增Tomcat
  1. 点击Edit Configuration(运行图标的左侧)
  2. 点击+, 找到Tomcat Server下的Local
  3. 点击OK
  4. 在Server下自定义Tomcat名称 Name:
  5. 点击configure, 选择Tomcat的安装目录
  6. 点击OK即可
6.5.2 部署web项目
  1. 还是点击Edit Configuration(运行图标的左侧)
  2. 然后找到Deployment并点击
  3. 在右侧点击+, 选择Artifact, 然后选项目名:war exploded, 这表示我们把此项目成功部署到了Tomcat下
  4. Deployment下的Application context是项目默认访问路径; 可以自定义, 建议和项目同名, 比如: /MavenProject, 或者为了访问简单, 可以直接设置: /
  5. 最后点击OK即可
6.5.3 启动Tomcat
  • 方法一: 点击IDEA上方的运行图标
  • 方法二: 在IDEA最下一行找到Services, 点开后在此处运行Tomcat
  • 最后等待弹出浏览器框: 路径: localhost:8080/MavenProject/, 这个默认是自动跳转到webapp下index.jsp中, 我们在网址后方加上test, 就访问到我们创建的TestServlet了

6.6 依赖生命周期

6.6.1 概念
  • Jar包生效的时间段, 即Jar的生命周期
6.6.2 使用方式
  • 项目中导入的依赖可以做生命周期的管理

    javax.servlet jstl 1.2 javax.servlet javax.servlet-api 3.1.0 provided javax.servlet jsp-api 2.0 provided

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
    • 把此路径换成华为云的: https://mirrors.huaweicloud.com/repository/maven/ 国内镜像下载速度很快, 也可换成阿里的, 都很快
    • 然后把Download Remote Indexes设置为True, 这是下载远程索引, 为了以后更好更方便的使用依赖
  • 点击仓库Public Repositories-->Configuration
    • 将3rd party从左侧的Ordered Group Repositories移到右侧的Avaliable Repositories(通过点击右箭头的方式)
    • 左侧的Ordered Group Repositories重新排序, Central排到第一位(鼠标拖拽), 此顺序代表提供依赖的仓库优先级, 现在的Central(已关联华为云)第一优先提供依赖
8.7.2 Maven关联私服
  • 配置setting.xml, 设置私服地址, 认证等信息

  • 复制时不要复制两头的大标签, 例如< servers>< /servers>, 只需把其内容复制到对应大标签下

    nexus-public admin admin123

    huaweicloud Central Nexus huaweicloud https://mirrors.huaweicloud.com/repository/maven/


    nexus
    nexus-public Naxus Release Snapshot Repository http://localhost:8081/nexus/content/groups/public/ true true

    nexus-public http://localhost:8081/nexus/content/groups/public/ true true

    nexus
    折叠

  • 至此, Maven项目需要依赖时, Maven会从私服中下载

8.8 Maven项目部署到私服

  • 执行: mvn deploy 即可将项目部署到私服对应的仓库中, 此时项目中的打包方式多为jar

  • 但需要提前在项目的pom.xml中配置部署私服仓库位置, 如下

    nexus-public User Project Snapshot http://localhost:8081/nexus/content/repositories/snapshots/ true nexus-public User Project Release http://localhost:8081/nexus/content/repositories/releases/

  • 注意: 如上的id依然要和setting.xml中配置的server中的id保持一致, 才能通过私服的验证

  • 项目部署到Snapshots仓库中还是Releases仓库中取决于我们< version>1.0-SNAPSHOT< /version> 中写的是SNAPSHOT还是RELEASE(或者不写,默认就是这个)