Maven入门(够用)

news2025/6/9 13:27:25

1、Maven是什么?

这个问题非常不重要,或者说不应该上来就问maven是什么,而是直接学习maven怎么用能干什么,学完之后自然就知道了maven是个什么玩意儿,很多技术都是如此。

2、Maven下载

先准备Java环境,安装JDK,配置JDK环境变量。如果是windows系统,去maven官网下载zip版本,解压缩之后配置Maven环境变量就可以使用了。

  • **本地仓库地址:**创建一个文件夹当作本地仓库,存放下载的依赖,在conf/setting.xml中修改配置
  • **maven镜像:**本地没有的jar包,maven会去官网下载,maven官网在国外所以下载比较慢,可以配置国内的maven镜像,访问速度会快一点。docker也是类似,有镜像服务器。在setting.xml中配置镜像源就行了,可以多配置几个镜像源。
  • **pom.xml:**Maven配置文件,学习maven主要就是学习如何读写项目的pom.xml文件
  • maven项目结构:
  • **target:**编译后的文件放到target中。

3、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>
  
    <groupId>com.example</groupId>
    <artifactId>untitled</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.23</version>
        </dependency>
        <dependency>
            <groupId>org.jetbrains</groupId>
            <artifactId>annotations</artifactId>
            <version>26.0.1</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
        </dependencies>
    </dependencyManagement>
</project>

一个简单的pom.xml文件就张上面这个样子。

  • modelVersion标签不用管
  • groupId、artifactId、version这三个是依赖的坐标信息,类似于空间直角坐标系中的x、y、z可以确定空间中的一个点,者三个标签可以唯一确定一个依赖。(依赖就是别人写的代码,我们直接引入直接拿来用)groupId一般是域名、artifactId一般使用项目名称、version是版本号。
  • properties标签这里我们可以去设置JDK版本、字符集等等,还可以去声明依赖的版本,对版本进行统一管理。
  • dependencies、dependencie就是引入依赖的标签
  • dependencyManagement也是用于引入依赖的标签

4、依赖范围

前面说了,依赖就是别人写的代码,就是我们的代码需要使用别人的代码,我们才会引入相应的依赖。有时候我们会直接业务代码中使用别人的代码。如spring-code;有时候是在测试代码中使用,如Juint。这就是两种不同的范围,在业务代码中使用不到Juint依赖的,所以可以设置Juint依赖只在测试代码中可以被使用。业务代码可以被使用我们称之为运行范围、测试代码中可以被使用称之为测试范围。除此之外还有编译范围,就是要不要编译引入的依赖。打包范围,打包时要不要包含引入的依赖。

如何设计某个依赖的范围呢,maven提供了scope标签,scope需要在dependencie标签中使用。形如:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>RELEASE</version>
   <scope>test</scope>
</dependency>

下表时不同值对应的作用域:

作用域scope编译测试运行打包实例
compileSpring-core
testjunit
runtimeJDBC
providedSevlet api
system

5、maven命令

上图就是maven的一些命令,这些命令是一个生命周期,运行下面的某命令时就会先从clean命令开始一次运行。

  • **clean:**清除上一次构建生成的所有文件和目录,比如项目的目标目录(通常是target目录),该目录中存放着编译后的类文件、生成的 JAR 包、WAR 包等。通过执行clean,可以确保每次构建都是从一个干净的状态开始,避免因残留文件导致的构建问题 。
  • **validate:**验证项目是否正确并且所有必要的信息都可用。例如,检查项目的 POM 文件是否格式正确,依赖是否配置合理等。但这个阶段不会去下载依赖或者进行实际的构建操作。
  • **complie:**编译项目的主源代码(通常是src/main/java目录下的 Java 源文件),将 Java 源文件编译成字节码文件(.class文件),并将编译后的文件放到项目的目标目录(target/classes)中。
  • **test:**使用合适的单元测试框架(如 JUnit)运行测试类(通常在src/test/java目录下),对编译后的代码进行单元测试 。但不会对测试代码进行打包等后续操作,只是单纯运行测试来验证功能是否正确。
  • **package:**将编译后的代码(包括主代码和可能的资源文件)按照项目指定的打包方式进行打包,比如生成 JAR 包(适用于 Java 类库项目)、WAR 包(适用于 Web 应用项目)或者 EAR 包(适用于企业级 Java 应用项目)等,生成的包会放在目标目录(target目录)中。
  • **verify:**运行所有检查,验证包是否有效且达到质量标准。例如,检查生成的包是否可以正确解压、包中的元数据是否完整等,还可以结合代码质量检查工具(如 Checkstyle、FindBugs 等)对代码进行进一步的质量验证。
  • **install:**将打包好的包安装到本地仓库中,供本地其他项目进行依赖引用。对于 Java 项目,就是将生成的 JAR、WAR 等包安装到本地 Maven 仓库(默认路径在用户主目录下的.m2/repository目录),方便在其他项目中通过配置依赖来使用这个项目的功能。
  • **site:**生成项目的站点文档,Maven 会根据项目中的各种信息(如项目描述、模块信息、依赖信息、测试报告等)生成一个 HTML 格式的站点,帮助团队成员和外部使用者了解项目的详细情况。
  • **deploy:**将最终的包发布到远程仓库(如公司的私服,或者公开的 Maven 中央仓库等),供其他开发人员或者项目进行依赖引用。通常在项目正式发布或者版本更新时执行这个阶段,以便让其他项目可以获取到最新版本的包 。

6、依赖的传递、排除与覆盖

简单讲就是A依赖B,B依赖C,A就自动会依赖C。当然A也可以手动排除C或者覆盖C。

依赖的排除示例(删除exclusions标签依赖就会传递):

<dependencies>
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>demo1</artifactId>
        <version>1.0-SNAPSHOT</version>
        <exclusions>
            <exclusion>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

依赖的覆盖示例:

    <dependencies>
        <!-- 假设demo1依赖了servlet的某个旧版本 -->
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>demo1</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!-- 这里引入一个新的版本就会对旧版本进行覆盖 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
    </dependencies>

这个命令可以查看项目的依赖关系:

mvn dependency:tree

7、Maven继承

一个项目往往会有多个模块,每一个模块都是使用maven进行依赖管理的,也就是每一个模块都是有一个唯一坐标信息的。两个模块之间可以是继承关系,比如S1模块和S2模块都继承了F模块。

那么在F中使用引入的依赖会被S1和S2直接继承。有时候父模块中的依赖并不都是要继承给子模块的。此时父模块可以使用 标签来引入依赖,这样就不会被子模块自动继承了,而子模块可以选择性的进行继承,且不需要指明具体的版本号,因为父模块已经声明过了。

父模块引入servlet依赖:

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>3.1.0</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

子模块选择性继承(不需要指明版本号了):

    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
        </dependency>
    </dependencies>

PS:根项目也是可以继承maven配置的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2405409.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自动化办公集成工具:一站式解决文档处理难题

1. 项目概述 在当今信息化时代,办公自动化已成为提升工作效率的关键。本文将详细介绍一款基于Python和PyQt5开发的「自动化办公集成工具」,该工具集成了多种常用的办公文档处理功能,包括批量格式转换、文本智能替换、表格数据清洗等,旨在为用户提供一站式的办公自动化解决方…

three.js 零基础到入门

three.js 零基础到入门 什么是 three.js为什么使用 three.js使用 Three.js1. 创建场景示例 2.创建相机3. 创建立方体并添加网格地面示例 5. 创建渲染器示例 6. 添加效果(移动/雾/相机跟随物体/背景)自动旋转示例效果 相机自动旋转示例 展示效果 实现由远到近的雾示例展示效果 T…

PublishSubject、ReplaySubject、BehaviorSubject、AsyncSubject的区别

python容易编辑&#xff0c;因此用pyrx代替rxjava3做演示会比较快捷。 pyrx安装命令&#xff1a; pip install rx 一、Subject&#xff08;相当于 RxJava 的 PublishSubject&#xff09; PublishSubject PublishSubject 将对观察者发送订阅后产生的元素&#xff0c;而在订阅前…

在Ubuntu22.04 系统中安装Docker详细教程

1.更新系统软件包 #确保您的系统软件包是最新的。这有助于避免安装过程中可能遇到的问题 sudo apt update sudo apt upgrade -y2.安装必要的依赖 sudo apt install apt-transport-https ca-certificates curl software-properties-common -y3.替换软件源 echo "deb htt…

AUTOSAR实战教程--DoIP_01_配置项解释

配置项 解释 备注 DoIPChannelSARef 引用DoIP Tester的源地址&#xff0c;就是你在DoIP Tester这个Containter中配置的Tester实例。 DoIPChannelTARef 引用目标地址。就是你在DoIPTargetAddress这个Container中的配置。 DoIPPduRRxPduId 为该pdu设置一个ID用于DoIP…

机器人/智能车纯视觉巡线经典策略—滑动窗口+直方图法

作者&#xff1a;SkyXZ CSDN&#xff1a;SkyXZ&#xff5e;-CSDN博客 博客园&#xff1a;SkyXZ - 博客园 在机器人或智能车的自主导航任务中&#xff0c;视觉巡线是一项最为基础且关键的能力之一。通过摄像头实时获取道路图像&#xff0c;并基于图像信息判断行驶路径&#xff0…

503 Service Unavailable:服务器暂时无法处理请求,可能是超载或维护中如何处理?

处理 "503 Service Unavailable" 错误是服务器管理者面临的常见挑战之一。这种错误通常表示服务器暂时无法处理请求&#xff0c;可能是由于服务器超载、维护中或其他临时性问题导致的。在本文中&#xff0c;我将介绍如何处理 "503 Service Unavailable" 错…

虚拟机时间同步

一、常见同步方式 常见的虚拟机同步方式有给虚拟机配置ntp、或者用平台提供的agent对时与虚拟机所在的宿主机。第一种依赖网络、第二种依赖平台的agent这个三方工具。 二、利用ptp_kvm.ko来直接和宿主机同步时间 关键组件 ptp_kvm驱动、chrony。 PTP_KVM同步原理 |--------…

软件更新机制的测试要点与稳定性提升

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

LLMs 系列科普文(11)

目前我们已经介绍了大语言模型训练的两个主要阶段。第一阶段被称为预训练阶段&#xff0c;主要是基于互联网文档进行训练。当你用互联网文档训练一个语言模型时&#xff0c;得到的就是所谓的 base 模型&#xff0c;它本质上就是一个互联网文档模拟器&#xff0c;我们发现这是个…

10万QPS高并发请求,如何防止重复下单

1. 前端拦截 首先因为是10万QPS的高并发请求&#xff0c;我们要保护好系统&#xff0c;那就是尽可能减少用户无效请求。 1.1 按钮置灰 很多用户抢票、抢购、抢红包等时候&#xff0c;为了提高抢中的概率&#xff0c;都是疯狂点击按钮。会触发多次请求&#xff0c;导致重复下…

Xilinx IP 解析之 Block Memory Generator v8.4 ——02-如何配置 IP(仅 Native 接口)

相关文章&#xff1a; Xilinx IP 解析之 Block Memory Generator v8.4 ——01-手册重点解读&#xff08;仅Native RAM&#xff09; – 徐晓康的博客 Xilinx IP 解析之 Block Memory Generator v8.4 ——02-如何配置 IP&#xff08;仅 Native RAM&#xff09; – 徐晓康的博客 V…

什么是高考?高考的意义是啥?

能见到这个文章的群体&#xff0c;应该都经历过高考&#xff0c;突然想起“什么是高考&#xff1f;意义何在&#xff1f;” 一、高考的定义与核心功能 **高考&#xff08;普通高等学校招生全国统一考试&#xff09;**是中国教育体系的核心选拔性考试&#xff0c;旨在为高校选拔…

Spring Cloud 多机部署与负载均衡实战详解

&#x1f9f1; 一、引言 为什么需要多机部署&#xff1f; 解决单节点性能瓶颈&#xff0c;提升系统可用性和吞吐量 在传统单机部署模式下&#xff0c;系统的所有服务或应用都运行在单一服务器上。这种模式在小型项目或低并发场景中可能足够&#xff0c;但随着业务规模扩大、用…

基于定制开发开源AI智能名片S2B2C商城小程序的首屏组件优化策略研究

摘要&#xff1a;在数字化转型背景下&#xff0c;用户对首屏交互效率的诉求日益提升。本文以"定制开发开源AI智能名片S2B2C商城小程序"为技术载体&#xff0c;结合用户行为数据与认知心理学原理&#xff0c;提出首屏组件动态布局模型。通过分析搜索栏、扫码入口、个人…

EasyRTC嵌入式音视频通信SDK音视频功能驱动视频业务多场景应用

一、方案背景​ 随着互联网技术快速发展&#xff0c;视频应用成为主流内容消费方式。用户需求已从高清流畅升级为实时互动&#xff0c;EasyRTC作为高性能实时音视频框架&#xff0c;凭借低延迟、跨平台等特性&#xff0c;有效满足市场对多元化视频服务的需求。 二、EasyRTC技术…

linux下gpio控制

linux下gpio控制 文章目录 linux下gpio控制1.中断命令控制/sys/class/gpio/export终端命令控制led 2.应用程序控制 3.驱动代码控制 1.中断命令控制 通用GPIO主要用于产生输出信号和捕捉输入信号。每组GPIO均可以配置为输出输入以及特定的复用功能。 当作为输入时&#xff0c;内…

Spring Boot 从Socket 到Netty网络编程(下):Netty基本开发与改进【心跳、粘包与拆包、闲置连接】

上一篇&#xff1a;《Spring Boot 从Socket 到Netty网络编程&#xff08;上&#xff09;&#xff1a;SOCKET 基本开发&#xff08;BIO&#xff09;与改进(NIO)》 前言 前文中我们简单介绍了基于Socket的BIO&#xff08;阻塞式&#xff09;与NIO&#xff08;非阻塞式&#xff0…

Orthanc:轻量级PACS服务器与DICOMweb支持的技术详解

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…

量子计算导论课程设计 之 PennyLane环境搭建

文章目录 具体配置conda 虚拟环境配置Pennylane 正所谓&#xff0c;磨刀不误砍柴工&#xff0c;想要进行量子计算导论的课程设计&#xff0c;首先就是搭建好平台&#xff0c;推荐大家就是本地搭建&#xff0c;那么下面有三种选择 QiskitTensorFlow QuantumPennylane 具体配置…