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>
相关推荐
世间万物皆对象24 分钟前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
没书读了1 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
小二·1 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic1 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
懒洋洋大魔王1 小时前
RocketMQ的使⽤
java·rocketmq·java-rocketmq
武子康2 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神2 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
朝九晚五ฺ2 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
qq_327342732 小时前
Java实现离线身份证号码OCR识别
java·开发语言
阿龟在奔跑4 小时前
引用类型的局部变量线程安全问题分析——以多线程对方法局部变量List类型对象实例的add、remove操作为例
java·jvm·安全·list