Bootstrap

三天急速通关JavaWeb基础知识:Day 3 依赖管理项目构建工具Maven

0 文章说明

学习完Java基础知识,有一定前端基础,三天急速通关尚硅谷的JavaWeb教程,整理知识体系框架,并用Kimi,DeepSeek,Copliot辅助学习,第三天学习依赖管理项目构建工具之Maven。本文所提供的信息和内容仅供参考,作者和发布者不保证其准确性和完整性。

1 介绍

Maven是一个开源的项目管理和构建自动化工具,主要用于Java项目的构建、依赖管理和文档生成,核心是基于POMProject Object Model,项目对象模型)的概念,通过一个统一的生命周期和配置文件(pom.xml),来管理项目的构建过程。

  • 问题:
    • 当依赖的Jar包越来越多,关系越来越复杂,手动导入肯定不可行。
    • 项目编写完源代码之后是无法直接放在服务器上部署的,通过IDEA构建之后可以部署,如果脱离IDEA就需要用到专门的构建工具。
  • 解决方案:
    • Maven在通过简单编写配置文件pom.xml之后就能自动下载所需依赖库以及依赖需要的依赖,并且保证版本没有冲突、完成依赖版本管理。
    • Maven可以管理项目的编译、测试、打包、部署等构建过程,并且开发者可以对构建过程进行扩展和定制,通过插件机制主动触发构建的各个过程。

2 安装与配置

2.1 安装

  • 版本组合
    目前开发环境的版本,注意正确配置JAVA_HOMEMAVEN_HOME等环境变量:
    工具版本
    Maven3.9.1
    JDK17.0.2
    IDEA2024.1.7
  • Maven目录结构
    bin:运行脚本
    bootplexus-classworlds类加载器框架
    conf:核心配置文件
    lib:运行时所需要的Java类库

2.2 手动配置

通过修改maven/conf/settings.xml配置文件,来修改maven的一些默认配置

  • 配置本地仓库的保存路径
      <!-- localRepository
       | The path to the local repository maven will use to store artifacts.
       |
       | Default: ${user.home}/.m2/repository
      -->
      <localRepository>H:\Maven--PC\apache-maven-3.9.1\repo</localRepository>
    
  • 配置中央仓库镜像
    <!-- 放入mirrors标签 -->
    </mirror>
        <mirror>
        <id>alimaven</id>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        <mirrorOf>central</mirrorOf>
    </mirror>
    
  • 指定JDK编译版本
    <!-- 放入profiles标签 -->
    <profile>
        <id>jdk-17</id>
        <activation>
            <activeByDefault>true</activeByDefault>
            <jdk>17</jdk>
        </activation>
        <properties>
            <maven.compiler.source>17</maven.compiler.source>
            <maven.compiler.target>17</maven.compiler.target>
            <maven.compiler.compilerVersion>17</maven.compiler.compilerVersion>
        </properties>
    </profile>
    
  • 关联IDEA
    IDEA -> Settings -> Build, Execution, Deployment -> Maven -> 手动选择自己安装Maven,覆盖settings.xml路径,覆盖repository路径。
    在这里插入图片描述

3 创建Maven工程

  • GAVP
    创建Maven工程时,会配置一些属性,即GAVPGroupIDArtifactIDVersionPackaging),这些属性相当于给这个工程取了个独一无二的名字,以便Maven能识别,便于后面项目之间进行相互依赖的管理。

    • GroupID
      格式:顶级域名.{公司/BU }.业务线.[子业务线],最多 4 级。
      举例:com.taobao.tddlcom.alibaba.sourcing.multilang
    • ArtifactID
      格式:产品线名-模块名
      举例:tc-clientuic-api
    • Version
      格式:主版本号.次版本号.修订号
      举例:初始→1.0.0 修改bug → 1.0.1 功能调整 → 1.1.1
    • Packaging
      • packaging 属性为 jar(默认值),代表普通的Java工程,打包以后是.jar结尾的文件。
      • packaging 属性为 war,代表Javaweb工程,打包以后.war结尾的文件。
      • packaging 属性为 pom,代表不会打包,用来做继承的父工程。
  • 创建Maven Java SE项目

    <?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.cut</groupId>
        <artifactId>maven-basic</artifactId>
        <version>1.0-SNAPSHOT</version>
    </project>
    
  • 手动创建Maven Java Web项目
    Day 1 创建Java Web一样,Project Structure -> Project Settings -> Project栏指定JDK版本 -> Modules栏添加Web即可。
    在这里插入图片描述
    一般标准的Maven Java Web项目这里的web目录的位置需要调整,那就在刚刚添加Web的时候修改下默认值即可。
    在这里插入图片描述
    最终的项目目录
    在这里插入图片描述

  • 通过JBLJavaToWeb插件创建,IDEA安装插件之后,右键项目 -> JBLJavaToWeb 即可。

  • 标准的Maven Web程序的目录:

    |-- 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                     # 测试资源目录
    

4 Maven构建工程

  • 项目构建的定义
    将源代码、依赖库和资源文件等转换成可执行或可部署的应用程序,在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。
  • Maven构建的常见命令
    命令描述
    mvn compile编译项目,生成target文件
    mvn package打包项目,生成jarwar文件
    mvn clean 清理编译或打包后的项目结构
    mvn install打包后上传到maven本地仓库
    mvn deploy只打包,上传到maven私服仓库
    mvn site生成站点
    mvn test执行测试源码
  • 构建生命周期
    构建生命周期可以理解成是一组固定构建命令的有序集合,触发周期后的命令,会自动触发周期前的命令,周期包含若干命令,命令包含若干插件,最终实际进行构建操作的是插件,这里简要介绍两个生命周期:
    • clean生命周期
      主要的作用是对项目编译生成文件进行清理:pre-clean -> clean -> post-clean
    • default生命周期
      定义了真正构建时所需要执行的所有步骤(简化版,实际复杂得多):compile -> test -> package -> install -> deploy

5 Maven依赖管理

  • 通过配置pom.xml来实现依赖管理,下面是最基础的pom.xml文件

    <?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>
    	
    	  <!-- 公司或者组织的唯一标志,maven会将该项目打成的jar包放本地路径:/com/cut -->
    	  <groupId>com.cut</groupId>
    	
    	  <!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
    	  <artifactId>maven-basic</artifactId>
    	
    	  <!-- 版本号 -->
    	  <version>1.0-SNAPSHOT</version>
    	
    	  <!--打包方式
    	    默认:jar
    	    jar指的是普通的java项目打包方式! 项目打成jar包!
    	    war指的是web项目打包方式!项目打成war包!
    	    pom不会讲项目打包!这个项目作为父工程,被其他工程聚合或者继承!后面会讲解两个概念
    	  -->
    	  <packaging>war</packaging> 
    </project>
    
  • 通过dependency标签添加依赖,查询网站 maven仓库,可以定义变量管理版本号。

    <properties>
    	  <!--命名随便,内部制定版本号即可!-->
    	  <log4j.version>4.12</junit.version>
    	  <!-- 也可以通过 maven规定的固定的key,配置maven的参数!如下配置编码格式!-->
    	  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    	  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>
    <!-- 
       通过编写依赖jar包的gav必要属性,引入第三方依赖!
       scope属性是可选的,可以指定依赖生效范围!
    
     -->
    <dependencies>
        <!-- 引入具体的依赖包 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
            <!-- 依赖范围 -->
            <scope>runtime</scope>
        </dependency>
    </dependencies>
    
  • scope标签依赖范围的说明

    依赖范围描述
    compile默认范围,适用于编译、测试和运行阶段。
    test仅在测试阶段有效,如JUnit。
    provided编译和测试阶段需要,运行时由容器提供,如Servlet API。
    runtime测试和运行阶段需要,编译时不需要,如JDBC驱动。
    system本地依赖,不推荐使用,影响项目可移植性。
    import仅用于dependencyManagement,导入其他POM的依赖管理配置。

6 Maven工程Build构建配置

  • 修改默认构建的包名
    <!-- 默认的打包名称:artifactid+verson.打包方式 -->
    <build>
      <finalName>定义打包名称</finalName>
    </build>  
    
  • 指定需要额外打包的文件(默认打包路径之外的文件)
    <build>
        <!--设置要打包的资源位置-->
        <resources>
            <resource>
                <!--设置资源所在目录-->
                <directory>src/main/java</directory>
                <includes>
                    <!--设置包含的资源类型-->
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
    </build>
    
  • 配置依赖插件
    <build>
      <plugins>
          <!-- tomcat插件 -->
          <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
             <version>2.2</version>
              <configuration>
              <port>8090</port>
              <path>/</path>
              <uriEncoding>UTF-8</uriEncoding>
              <server>tomcat7</server>
            </configuration>
          </plugin>
        </plugins>
    </build>
    

7 Maven依赖传递与依赖冲突

7.1 依赖传递

三个项目ABC,如果B依赖AC依赖B,那么C中的包有几种情况:

  • C 依赖 B 时使用 compile 范围:可以传递。
  • C 依赖 B 时使用 testprovided 范围:不能传递。
  • C 依赖 B 时,若配置了<optional>true</optional>标签,则不能传递。

7.1 依赖冲突

当前项目的依赖链中有相同的包,那么选的最短路径的,路径相同选先声明的,除此以外,可以选择手动控制。

<dependency>
  <groupId>com.atguigu.maven</groupId>
  <artifactId>pro01-maven-java</artifactId>
  <version>1.0-SNAPSHOT</version>
  <scope>compile</scope>
  <!-- 使用excludes标签配置依赖的排除  -->
  <exclusions>
    <!-- 在exclude标签中配置一个具体的排除 -->
    <exclusion>
      <!-- 指定要排除的依赖的坐标(不需要写version) -->
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
    </exclusion>
  </exclusions>
</dependency>

8 Maven工程继承和聚合

8.1 工程继承

Maven 继承是指在 Maven 的项目中,让一个项目从另一个项目中继承配置信息的机制。

  • 父工程用 <packaging>pom</packaging>,同时依赖用

    <!-- 使用dependencyManagement标签配置对依赖的管理 -->
    <!-- 被管理的依赖并没有真正被引入到工程 -->
    <dependencyManagement>
        <dependencies>
    	    <dependency>A</dependency>
    	    <dependency>B</dependency>
    	    <dependency>C</dependency>
        </dependencies>
    </dependencyManagement>
    
  • 子工程用**<parent>**标签,同时选择性继承父工程的dependency不用写版本号(意味由父工程决定)

    <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> -->
    

8.2 工程聚合

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>

9 总结

Maven的安装,关联IDEA,手动与插件创建工程,插件整合Tomcatpom.xml添加依赖,至此能完美运行一个本地项目,之外再学习依赖传递冲突的解决,工程继承与聚合,能够完成复杂项目构建的管理。
其他用法,比如其他插件,site生命周期,nexus私服等不在急速冲刺系列,可以自己查询学习。

;