如何使用Maven构建Java项目?Maven的使用详细解读

news2025/1/4 19:31:31

文章目录

  • 1. 前言
  • 2. Maven 快速入门
    • 2.1 Maven 项目模型
    • 2.2 Maven 仓库
  • 3. Maven的安装配置
    • 3.1 安装
    • 3.2 配置环境变量
    • 3.4 Maven 配置
  • 4. Maven 的常用命令
    • 4.1 编译
    • 4.2 清理
    • 4.3 打包
    • 4.4 测试
    • 4.5 安装
  • 5. Maven生命周期
  • 6. 总结
  • Java编程基础教程系列:

1. 前言

在 Java 开发中,Maven 是一个十分重要的工具,专门用于 Java 代码的管理和构建。Maven 的主要功能有:

  • 标准化的项目结构
  • 标准化项目构建流程
  • 提供依赖管理机制

在我们之前编写代码时,由于不同的 IDE 构建出来的项目结构是不同的,导致在不同的开发环境中编写的 Java 代码无法互通,例如在 idea 中编写的代码不能很好的导入 eclipse 中,导致了很多不便的问题,而 Maven 提供了一套标准的项目结构,使用不同的开发环境构建出来的项目结构是相同的,这样,以后不管使用哪个 IDE,创建的项目都是互通的,导入时可以很好的兼容。

image-20230125213027291

如上图就是 Maven 构建的普通 Java 项目的结构,从上到下依次表示的是项目名称,源代码和测试代码的目录 src ,源代码目录,源代码 Java 文件目录,源代码配置文件目录,测试代码目录,测试代码 Java 文件目录,测试代码配置文件目录和项目的核心配置文件 pom.xml 。

一个完整项目开发必须经过编译,测试,打包和运行等这样的标准化项目构建流程。在一个大型项目中,这些流程不经过简化的操作是十分繁琐的,而 Maven 提供了一套简单命令来完成项目的构建,例如使用 package 命令来打包项目,使用Maven 让项目流程的构建不再困难。

在之前使用 JDBC 操作 MySQL 数据库时,我们必须往项目中导入 MySQL 的驱动 jar 包,当项目的依赖过多时,我们经过下载导入等操作的代价是十分大的,而 Maven 提供了一套标准化的依赖管理机制,用于管理项目中所依赖的第三方资源,例如驱动 jar 包,插件等等,大大提高了开发的效率,我们只需要使用标准的坐标信息来管理各种依赖,而引入的第三方资源存放在 Maven 仓库中,Maven 中的仓库主要分为本地仓库,中央仓库,远程仓库。

市面上存在众多的项目构建工具,为什么选择 Maven 呢?一个重要的原因是 Maven 作为一款主流的项目构建工具,超过了一半的人在使用。

2. Maven 快速入门

Apache Maven 是一个项目管理和构建的工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建,报告和文档。

2.1 Maven 项目模型

在构建生命周期阶段,通过不同的插件来完成不同的功能,例如,使用打包的插件来打包项目,通过这些插件来完成项目的标准化项目构建流程。项目对象模型是指 Maven 使用简短的描述信息来描述使用 Maven 构建的项目,每个不同的项目都有一个唯一标识,使用标准坐标来实现,坐标引入的第三方资源都放在仓库中。如下图:

2.2 Maven 仓库

Maven 中仓库主要有三类:

  • 本地仓库:本地计算机上的目录
  • 中央仓库:由 Maven 团队维护的全球唯一的仓库
  • 远程仓库:又称为私服,一般由公司团队搭建

那么 Maven 中的仓库有什么作用呢?

例如,当项目中使用坐标引入了对应的依赖 jar包时,首先会在本地仓库中查找是否有对应的 jar 包,有则直接引入,如果没有,则需要在中央仓库中寻找并下载 对应的 jar 包到本地仓库,下一次使用时直接从本地仓库引入。

当团队搭建了私服(远程仓库)时,如果本地仓库中没有对应的驱动 jar 包,则会在私服中寻找,如果还是没有,则在中央仓库中下载对用的 jar 包到私服,并存入到本地仓库中,用于引入到项目中,如果有,直接从私服下载对应的 jar 包到中央仓库。但是,一般私服在搭建时,都会同步中央仓库中的依赖,这样就很好的提高了仓库的访问速度,毕竟国外网站的访问速度一言难尽。

我们后面安装好 Maven 后,就要来使用阿里云的私服,提升访问速度。

3. Maven的安装配置

3.1 安装

Maven 是一款绿色软件,直接在官网下载解压即为安装成功,并且建议解压到一个没有中文和特殊字符的路径下。

项目结果如下图,bin 目录下存放的是二进制可执行文件,conf 中存放 Maven 的配置文件,lib 目录下存放 Maven 自身依赖的 jar 包,这里存放的并不是项目使用的 jar 包,可以看出 Maven 自身也是使用 Java 开发的。

image-20230125221825275

3.2 配置环境变量

和 Java 配置环境变量相同,Maven 也要配置环境变量,保证我们在任何文件目录下都可以访问 Maven 的可执行文件,Maven 配置环境变量主要是添加MAVEN_HOME,并且将其 bin 目录添加到系统环境变量中。

第一步:右键此电脑 / 属性 / 高级系统设置 / 环境变量 / 添加

变量名:MAVEN_HOME
变量值:G:\software\apache-maven-3.6.1//Maven的安装路径

如图:

image-20230125222420421

第二步:双击系统变量 Path,将 %MAVEN_HOME%bin 添加到变量值中。

如图:

image-20230125222512670

第三步:验证环境变量是否配置成功,在 cmd 中执行命令 mvn -version ,如果执行成功,则环境变量配置成功。

image-20230125222756643

3.4 Maven 配置

配置本地仓库

修改 conf / settings.xml 中的 <localRepository> 标签内容为一个指定目录作为本地仓库,用来存储 jar 包。建议在 Maven 安装路径下新建一个文件夹配置为本地仓库,方便后期的维护。

如图:

image-20230125223050568

配置阿里云私服

中央仓库在国外,所以下载 jar 包速度可能比较慢,而阿里公司提供了一个远程仓库,里面基本也都有开源项目的 jar 包。

修改 conf / settings.xml 中的 <mirrors> 标签内容,为其添加如下子标签:

<mirror>  
    <id>alimaven</id>  
    <name>aliyun maven</name>  
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>          
</mirror>

如图:

image-20230125223235591

4. Maven 的常用命令

Maven 中的常用命令主要有:

  • compile:编译
  • clean:清理
  • test:测试
  • package:打包
  • install:安装

下面对常用命令的使用做一个入门级别的演示,演示使用下面这个简单的 Java 项目。

image-20230125231159604

在执行 Maven 的命令时需要进入到项目中 pom.xml 文件所在的目录,可以在该路径下快速打开命令提示符。

4.1 编译

执行命令:

mvn compile

image-20230125233525540

此时可以看到,本地仓库中从阿里云私服下载了编译需要的插件,同时在项目下生成 target 目录,如图:

image-20230125233113456

经过编译的字节码文件就放在其中,如图:

image-20230125233029102

4.2 清理

执行命令:

mvn clean

image-20230125233548293

此时可以看到,从阿里云下载的插件被清理,同样项目下的 target 目录也被删除,如图:

image-20230125233354241

4.3 打包

执行命令:

mvn package

image-20230125233927589

此时可以看到,从阿里云私服下载了对应的插件,在项目中生成了 target 目录,并且在 target 目录下将当前项目打包为 jar 包,如图:

image-20230125233813578

4.4 测试

执行命令:

mvn test

image-20230125235428897

此时可以看到,程序中的测试代码被执行,如上图。测试中的代码采用单元测试:

package org.chengzi;

import org.junit.jupiter.api.Test;

public class HelloWorldTest {
    @Test
    public void test() {
        System.out.println("HelloWorld Test");
    }
}

4.5 安装

执行命令:

mvn install

该命令会将当前 Java 项目打成 jar 包,并安装到本地仓库中,执行完上述命令后本地仓库已经有该项目的 jar包,如图:

image-20230126000013296

5. Maven生命周期

Maven 生命周期指的是在构建项目时一次构建经历的事件。Maven 划分了3套生命周期:

  • clean:清理
  • default:核心工作,例如编译测试打包安装等
  • site:产生报告,发布站点等

同一套生命周期内,执行后面的命令,前面的所有命令会自动执行,例如:

image-20230126141827103

在执行 install 命令时,首先会执行前面的 compile ,test ,package 命令。在 Maven 生命周期的构建中还有很多默认的命令,这里只是列出来几个最常使用的命令。

6. 总结

初学者在这部分一定会遇到各种各样的问题,其中大部分都是由于版本问题造成的,例如 JDK 版本,idea 版本,Maven 版本等。建议多尝试几遍就能熟练,遇到问题一定要及时解决。

例如小编曾经在这部分就遇到各种当时水平难以处理的问题,项目中无法生成 src 源代码目录,idea 中报错不支持该版本,Maven 中报错不支持源选项等各种问题。不要放弃,多尝试问题总会解决。另外 Java 版本建议使用 JDK 1.8。

本节详细探讨了 Maven 构建 Java 项目的流程以及构建项目生命周期中使用的各种命令,我们下期见。


Java编程基础教程系列:

JDBC快速入门,如何使用JDBC操作数据库?

如何使用JDBC操作数据库?JDBC API的使用详细解读

什么是数据库连接池?Druid(德鲁伊)连接池的使用详细解读

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

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

相关文章

C++初阶:list类

文章目录1 list介绍2 list的模拟实现2.1 类的定义2.2 默认成员函数2.2.1 构造函数2.2.2 析构函数2.2.3 拷贝构造2.2.4 赋值重载2.3 迭代器2.3.1 正向迭代器2.3.2 反向迭代器2.4 修改接口2.4.1 任意位置插入2.4.2 任意位置删除2.5 其他接口2.5.1 尾插2.5.2 头插2.5.3 尾删2.5.3 …

3.7-2动态规划--图像压缩(举例子和写代码)

3.7动态规划--图像压缩_昵称什么的不存在的博客-CSDN博客 问题描述&#xff08;再写一遍&#xff09; 这篇文章是接着上面这一篇写的&#xff0c;就是写一个例子方便理解&#xff0c;模拟填写数组的过程 l: l[i]存放第i段长度, 表中各项均为8位长&#xff0c;限制了相同位数的…

CGAL 点云精配准之ICP算法

文章目录 一、简介二、相关参数三、实现过程三、举个栗子四、实现效果参考资料一、简介 ICP算法总共分为6个阶段,如下图所示: (1)挑选发生重叠的点云子集,这一步如果原始点云数据量比较巨大,一般会对原始点云进行下采样操作。 (2)匹配特征点。通常是距离最近的两个点,…

如何批量增加视频的音量(ffmpeg)

问题背景 由于之前爷爷的唱戏机充不进去电&#xff0c;过年时给爷爷买了个新的。但这个新买的机子&#xff0c;它的曲目&#xff08;视频&#xff09;在U盘里&#xff0c;声音普遍较低&#xff0c;我爷爷的耳朵不好&#xff0c;声音需要比正常的声音调大一些。 在Videolouder这…

【数据结构和算法】认识线性表中的链表,并实现单向链表

本文接着上文&#xff0c;上文我们认识了线性表的概念&#xff0c;并实现了静态、动态顺序表。接下来我们认识一个新概念链表。并实现单向链表的各种操作。顺序表还有不明白的看这一篇文章 (13条消息) 【数据结构和算法】实现线性表中的静态、动态顺序表_小王学代码的博客-CSDN…

leetcode--链表

链表1.链表的基本操作&#xff08;1&#xff09;反转链表(206)&#xff08;2&#xff09; 合并两个有序链表(21)&#xff08;3&#xff09;两两交换链表中的节点(24)2.其它链表技巧&#xff08;1&#xff09;相交链表(160)&#xff08;2&#xff09;回文链表(234)3.练习&#x…

力扣 2293. 极大极小游戏

题目 给你一个下标从 0 开始的整数数组 nums &#xff0c;其长度是 2 的幂。 对 nums 执行下述算法&#xff1a; 设 n 等于 nums 的长度&#xff0c;如果 n 1 &#xff0c;终止 算法过程。否则&#xff0c;创建 一个新的整数数组 newNums &#xff0c;新数组长度为 n / 2 &…

手把手带初学者快速入门 JAVA Web SSM 框架

博主也是刚开始学习SSM&#xff0c;为了帮大家节省时间&#xff0c;写下SSM快速入门博客 有什么不对的地方还请 私信 或者 评论区 指出 ​只是一个简单的整合项目&#xff0c;让初学者了解一下SSM的大致结构 项目先把框架写好&#xff0c;之后在填写内容 项目压缩包 完整的蓝奏…

浅谈phar反序列化漏洞

目录 基础知识 前言 Phar基础 Phar文件结构 受影响的函数 漏洞实验 实验一 实验二 过滤绕过 补充 基础知识 前言 PHP反序列化常见的是使用unserilize()进行反序列化&#xff0c;除此之外还有其它的反序列化方法&#xff0c;不需要用到unserilize()。就是用到了本文…

C 语言零基础入门教程(十一)

C 数组 C语言支持数组数据结构&#xff0c;它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据&#xff0c;但它往往被认为是一系列相同类型的变量。 数组的声明并不是声明一个个单独的变量&#xff0c;比如 runoob0、runoob1、…、runoob99&#xf…

【Linux】调试器 - gdb 的使用

目录 一、背景知识 二、debug 与 release 1、生成两种版本的可执行程序 2、debug 与 release 的区别 三、gdb 的使用 1、调试指令与指令集 2、源代码显示、运行与退出调试 3、断点操作 4、逐语句与逐过程 5、调试过程中的数据监视 6、调试过程中快速定位问题 一、背…

吴恩达机器学习笔记(三)逻辑回归

机器学习&#xff08;三&#xff09; 学习机器学习过程中的心得体会以及知识点的整理&#xff0c;方便我自己查找&#xff0c;也希望可以和大家一起交流。 —— 吴恩达机器学习第五章 —— 四、逻辑回归 线性回归局限性 线性回归对于分类问题的局限性&#xff1a;由于离群点…

LeetCode动态规划经典题目(九):入门

学习目标&#xff1a; 了解动态规划 学习内容&#xff1a; 1. LeetCode509. 斐波那契数https://leetcode.cn/problems/fibonacci-number/ 2. LeetCode70. 爬楼梯https://leetcode.cn/problems/climbing-stairs/ 3. LeetCode746. 使用最小花费爬楼梯https://leetcode.cn/proble…

ice规则引擎==启动流程和源码分析

启动 git clone代码 创建数据库ice&#xff0c;执行ice server里的sql&#xff0c;修改ice server的配置文件中的数据库信息 启动ice server 和ice test 访问ice server localhost:8121 新增一个app,默认给了个id为1&#xff0c;这个1可以看到在ice test的配置文件中指定…

MP503空气质量气体传感器介绍

MP503空气质量气体传感器简介MP503空气质量气体传感器采用多层厚膜制造工艺&#xff0c;在微型Al2O3陶瓷基片的两面分别制作加热器和金属氧化物半导体气敏层&#xff0c;封装在金属壳体内。当环境空气中有被检测气体存在时传感器电导率发生变化&#xff0c;该气体的浓度越高&am…

Spring Boot开发自定义的starter

目录 一、Spring Boot的starter概述 二、自定义starter的命名规则 三、自定义starter实战 1. 创建spring工程 2. 修改pom.xml 3. 编写配置类 4. 安装到本地maven仓库 5. 在其他项目中引入 6. 测试 一、Spring Boot的starter概述 SpringBoot中的starter是一种非常重要的机…

【web前端】CSS浮动

多个块级元素纵向排列找标准流&#xff0c;横向排列找浮动 浮动的特性&#xff1a; &#xff08;1&#xff09;浮动元素会脱离标准流&#xff08;脱标&#xff09; &#xff08;有的浮动&#xff0c;有的没浮&#xff09; &#xff08;2&#xff09;浮动的元素会在一行内显示…

C#中[]的几种用法

一、导入外部DLL函数 如[DllImport(“kernel32.dll”)]这叫引入kernel32.dll这个动态连接库。这个动态连接库里面包含了很多WindowsAPI函数,如果你想使用这面的函数&#xff0c;就需要这么引入。举个例子&#xff1a; [DllImport(“kernel32.dll”)] private static extern vo…

栈与队列总结

文章目录栈栈的概述栈的实现栈API设计栈代码实现栈的应用栈在系统中的应用括号匹配问题字符串去重问题逆波兰表达式问题队列队列的概述队列的实现队列的API设计队列代码实现队列的经典题目滑动窗口最大值问题求前 K 个高频元素栈 栈的概述 栈是一种基于先进后出(FILO)的数据结…

Android开发环境搭建

前面从全局和整体角度看了下Android包含哪些东西&#xff0c;自然&#xff0c;也涵盖了开发需要了解的内容&#xff0c;具体参见博文&#xff1a;从技术角度看Android大系统的构成_龙赤子的博客-CSDN博客 写完博文&#xff0c;感觉对Android开发也胸有成竹了&#xff0c;于是就…