2024-Java-Maven学习笔记

Maven

Maven是一个Java项目管理和构建工具,作用:定义(规范)项目结构、项目依赖、使用统一的方式自动化构建(clean、compile)。

提供了一套依赖管理机制:利用仓库统一管理jar包,利用依赖传递的特性解决jar包版本冲突问题。

视频教程

总结

核心 掌握目标
安装 maven安装、环境变量、maven配置文件修改
工程创建 gav属性理解、IDEA创建工程、项目结构
依赖管理 依赖添加、依赖传递、版本提取、导入依赖错误解决
构建管理 构建过程、构建场景、构建周期
继承和聚合 理解继承和聚合的作用和配置
  • 所有依赖在父maven项目中管理,子maven无需使用版本;
  • 可选依赖放入;
  • 所有依赖的版本号通过管理;
  • 管理所有子模块;

Maven配置文件

需要修改的地方如下:

xml 复制代码
<!--  jar包下载本地地址 -->
<localRepository>D:\data\maven-repository</localRepository>


<!--  jar包下载仓库 -->
<mirrors>
    <mirror>
      <id>nexus-aliyun</id>
      <mirrorOf>central</mirrorOf>
      <name>Nexus aliyun</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
    <mirror>
      <id>huaweicloud</id>
      <mirrorOf>*</mirrorOf>
      <name>huawei Cloud</name>
      <url>https://repo.huaweicloud.com/repository/maven/</url>
    </mirror>
    <mirror>
      <id>central</id>
      <mirrorOf>central</mirrorOf>
      <name>Maven Repository Switchboard</name>
      <url>https://repo2.maven.org/maven2/</url>
    </mirror>
  </mirrors>

约定大于配置

pom.xml详解

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>
    <!-- 本工程的坐标信息,保证唯一性 -->
    <groupId>com.lywtimer</groupId>
    <artifactId>j-pure</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!-- 设置打包方式 默认jar,常用war,pom -->
    <packaging>pom</packaging>
    <modules>
        <module>backend</module>
        <module>demo</module>
    </modules>
    <!--
         通常去设置依赖的版本
         好处:统一管理版本;多个jar包使用同一个版本时,简化配置
         ${junit.jupiter.version}
     -->
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <com.mysql.version>8.3.0</com.mysql.version>
        <org.junit.jupiter.version>5.10.2</org.junit.jupiter.version>
    </properties>
    <!--
     通过一个坐标信息去引用jar包
     去 https://mvnrepository.com/ 中央仓库找
     需要确认到本地仓库,如果出现异常问题可以删掉,重新下载。 D:\data\maven-repository\org\junit\jupiter\junit-jupiter-api\5.10.2
     -->
    <!-- 对子工程必须要的依赖,放在这里 -->
    <dependencies>
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <version>${com.mysql.version}</version>
        </dependency>
    </dependencies>
    <!--
        对子工程不是必须要的依赖,放在这里
        虽然子工程还需要做一次依赖,但可以做版本控制
    -->
    <dependencyManagement>
        <dependencies>
            <!--
              引用本地的项目,需要 install
              -->
            <dependency>
                <groupId>org.junit.jupiter</groupId>
                <artifactId>junit-jupiter-api</artifactId>
                <version>${org.junit.jupiter.version}</version>
                <!--
                 手动排除依赖
                 -->
                <exclusions>
                    <!--                <exclusion>-->
                    <!--                    <groupId>com.mysql</groupId>-->
                    <!--                    <artifactId>mysql-connector-j</artifactId>-->
                    <!--                </exclusion>-->
                </exclusions>
                <!--
                 依赖范围
                 编译(main/java)
                 测试(main/test)
                 运行/打包(包含在打的包中)

                 test       编译× 测试√  打包×     junit
                 provided   编译√ 测试√  打包×     servlet
                 compile    编译√ 测试√  打包√     默认
                 runtime    编译× 测试√  打包√     反射、数据库驱动
                 system = provided 不会依赖仓库中的jar包,结合<systemPath>使用,已经废弃

                 1.首先 依赖范围建议,哪怕所有的范围都设置compile,也不影响正常使用
                 2.中央仓库会提供scope,IDEA有自动补全功能
                 3.大多数包都是compile
                 -->
                <!--作用访问是 test、provided 就不会传递-->
                <scope>test</scope>
                <!--是否传递 默认是false,会传递-->
                <optional>false</optional>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

生命周期

复制代码
生命周期会依次执行 clean validate compile test package verify install

Test* 的类会在 test 执行的时候被扫描

install:会下载到本地仓库

依赖传递的配置

shell 复制代码
#被依赖项目的pom.xml
	<groupId>com.mszlu</groupId>
    <artifactId>trans</artifactId>
    <version>1.0-SNAPSHOT</version>
    
	<dependencies>
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <version>8.0.33</version>
            <!--作用访问是 test、provided 就不会传递-->
            <scope>compile</scope>
            <!--是否传递 默认是false,会传递-->
            <optional>true</optional>
        </dependency>
    </dependencies>
    
#依赖项目的pom.xml
<dependencies>
		<!--
         引用本地的项目,需要 install
         -->
        <dependency>
            <groupId>com.mszlu</groupId>
            <artifactId>trans</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
</dependencies>

#如果被依赖项目无法处理,通过两种方式可以解除依赖
#引入不一致版本的依赖(覆盖)
#使用exclusion手动排除

创建聚合工程

右键父工程目录 → New → Module → Parent选 None

xml 复制代码
<!-- 父工程聚合子工程 pom.xml -->
  <modules>
  	  <module>backend</module>
      <module>demo</module>
  </modules>
  
<!-- 两个子工程依赖后,依赖就会传递 -->  
<!-- 在父工程中的生命周期方法会在所有管理的模块依次执行 -->  

Maven继承

聚合工程的另外一种体现,把依赖统一到父工程中。

xml 复制代码
<!-- 修改子工程的 pom.xml -->
<parent>
	<groupId>org.example</groupId>
	<artifactId>j-pure</artifactId>
	<version>1.0-SNAPSHOT</version>
</parent>

<!-- 手动删除重复的配置 -->
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
相关推荐
Helibo444 分钟前
GESPC++六级复习
java·数据结构·算法
苜柠14 分钟前
Wpf学习片段
学习
欢乐熊嵌入式编程1 小时前
智能手表固件升级 OTA 策略文档初稿
嵌入式硬件·学习·智能手表
柒七爱吃麻辣烫1 小时前
在Linux中安装JDK并且搭建Java环境
java·linux·开发语言
起床学FPGA1 小时前
异步FIFO的学习
学习·fpga开发
极小狐1 小时前
极狐GitLab 容器镜像仓库功能介绍
java·前端·数据库·npm·gitlab
依年南台1 小时前
搭建大数据学习的平台
大数据·学习
努力的搬砖人.1 小时前
如何让rabbitmq保存服务断开重连?保证高可用?
java·分布式·rabbitmq
小虎卫远程打卡app2 小时前
视频编解码学习10之成像技术原理
学习·计算机视觉·视频编解码
_星辰大海乀2 小时前
数据库约束
java·数据结构·数据库·sql·链表