【Java 进阶篇】Maven 使用详解:打造便捷高效的项目构建利器

在这里插入图片描述

在软件开发的道路上,项目构建是一个不可避免的过程。而Maven,作为一个强大的项目管理和构建工具,为开发者提供了一套标准化的项目结构和构建流程。本文将围绕Maven的使用详解,手把手地带你探索Maven的世界,让你在项目构建的征途上更加得心应手。

什么是 Maven?

Maven是一个项目管理和构建工具,它采用基于项目对象模型(POM)的概念,通过插件机制,为项目提供了一套标准化的构建流程。Maven最初是为了简化Jakarta Turbine项目的构建而创建的,现在已经成为Java世界最流行的项目管理工具之一。

Maven的核心理念是约定优于配置,它规定了项目的目录结构和一系列的构建生命周期。通过简单的配置,开发者可以轻松管理项目的依赖、构建过程、测试、部署等多个方面。下面,我们将一步步深入Maven的使用,为你揭开Maven的神秘面纱。

Maven 安装

Windows 安装 Maven

在Windows上安装Maven通常是一个相对简单的过程。首先,你需要下载Maven的二进制发行包(Binary),并解压到你喜欢的目录。然后,配置系统环境变量 PATH,使得系统可以找到Maven的可执行文件。

  1. 下载 Maven:

    前往 Apache Maven 官网 下载最新的 Maven 二进制发行包。选择一个.zip或.tar.gz格式的文件。

  2. 解压 Maven:

    解压下载的发行包到你喜欢的目录,例如 C:\Program Files

  3. 配置环境变量:

    在系统环境变量中添加Maven的bin目录路径,例如,在 PATH 中添加 C:\Program Files\apache-maven-3.8.4\bin

  4. 验证安装:

    打开命令行窗口,输入以下命令:

    mvn -v
    

    如果正确安装,你将看到Maven的版本信息。

Linux 安装 Maven

在Linux上安装Maven同样也很简单,可以通过包管理工具或者手动下载安装。

  1. 使用包管理工具(例如 apt)安装 Maven:

    sudo apt update
    sudo apt install maven
    

    这会自动安装最新版本的Maven。

  2. 手动下载 Maven:

    遵循和Windows相同的步骤,下载并解压Maven,然后配置系统环境变量。

  3. 验证安装:

    打开终端,输入以下命令:

    mvn -v
    

    如果正确安装,你将看到Maven的版本信息。

Maven 的项目结构

Maven使用约定优于配置的理念,规定了项目的目录结构。一个标准的Maven项目结构如下:

my-maven-project
|-- pom.xml
|-- src
|   |-- main
|   |   |-- java
|   |   |-- resources
|   |-- test
|       |-- java
|       |-- resources
|-- target
  • pom.xml: 项目的描述文件,包含了项目的配置信息、依赖、插件等。
  • src: 源代码和资源文件的根目录。
    • main: 主目录,包含了项目的主要源代码和资源文件。
      • java: Java源代码文件。
      • resources: 配置文件等资源。
    • test: 测试目录,包含了项目的测试代码和资源文件。
      • java: 测试用的Java源代码文件。
      • resources:

测试用的配置文件等资源。

  • target: Maven 构建的输出目录,包含了生成的项目构建产物。

创建 Maven 项目

现在,我们开始创建一个简单的Maven项目。首先,打开命令行窗口,进入到你希望创建项目的目录。

mkdir my-maven-project
cd my-maven-project

然后,执行以下命令:

mvn archetype:generate -DgroupId=com.example -DartifactId=my-maven-project -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

这个命令使用Maven的archetype插件,生成了一个基于 maven-archetype-quickstart 模板的项目。你可以根据需要选择其他模板。

命令执行完成后,你将在当前目录下看到一个名为 my-maven-project 的目录,里面包含了生成的Maven项目。

编写 Maven 项目

现在,让我们来编写一个简单的Java程序,并通过Maven进行构建。

编写 Java 代码

src/main/java/com/example 目录下创建一个名为 App.java 的Java文件:

package com.example;public class App {public static void main(String[] args) {System.out.println("Hello, Maven!");}
}

编写单元测试

src/test/java/com/example 目录下创建一个名为 AppTest.java 的Java文件:

package com.example;import org.junit.Test;
import static org.junit.Assert.assertEquals;public class AppTest {@Testpublic void testApp() {App app = new App();assertEquals("Hello, Maven!", app.getMessage());}
}

编写 pom.xml 文件

在项目根目录下的 pom.xml 文件中,添加JUnit依赖和配置:

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>my-maven-project</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><dependencies><!-- JUnit 依赖 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency></dependencies>
</project>

在这个 pom.xml 文件中,我们声明了项目的基本信息、Java版本、以及JUnit的依赖。

Maven 构建项目

现在,我们已经准备好了Java代码和Maven配置。接下来,我们将使用Maven构建项目。

在项目根目录下执行以下命令:

mvn clean install

这个命令将执行项目的清理、编译、测试、打包等一系列构建步骤。执行完成后,你将在 target 目录下看到生成的项目构建产物。

运行 Maven 项目

在项目根目录下执行以下命令运行项目:

java -cp target/my-maven-project-1.0-SNAPSHOT.jar com.example.App

你将看到输出:

Hello, Maven!

至此,你已经成功创建、编写、构建和运行了一个简单的Maven项目。通过Maven的约定,你可以轻松管理项目的依赖、构建流程、测试,以及其他与项目相关的任务。

Maven 依赖管理

Maven的依赖管理是其强大之处之一。通过简单的配置,你可以引入第三方库,管理版本,并自动解决依赖关系。下面,让我们深入了解Maven的依赖管理。

引入依赖

pom.xml 文件的 <dependencies> 元素下,添加需要的依赖:

<dependencies><!-- JUnit 依赖 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!-- Apache Commons Lang 依赖 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version></dependency>
</dependencies>

在这个例子中,我们引入了JUnit和Apache Commons Lang两个依赖。

Maven 依赖范围

Maven的依赖可以有不同的范围,常见的有 compiletestprovided 等。这些范围定义了依赖在何时被引入项目中。

  • compile(默认): 在编译、测试、运行阶段都有效。
  • test: 仅在测试阶段有效。
  • provided: 在编译和测试阶段有效,但在运行阶段由JDK或容器提供。

Maven 依赖版本管理

Maven通过 <dependencyManagement> 元素提供了对依赖版本的集中管理。这样,你可以在根 pom.xml 文件中集中管理项目中所有模块的依赖版本。

<dependencyManagement><dependencies><!-- 定义 JUnit 版本 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><!-- 定义 Apache Commons Lang 版本 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version></dependency></dependencies>
</dependencyManagement>

然后,在项目的 <dependencies> 中引入这些依赖时,无需指定版本号:

<dependencies><!-- JUnit 依赖 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency><!-- Apache Commons Lang 依赖 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId></dependency>
</dependencies>

这样,如果需要升级依赖版本,只需要在 <dependencyManagement> 中修改对应依赖的版本号即可,而不需要修改每个模块的 <dependencies>

Maven 生命周期和插件

Maven 的构建过程是由一系列的生命周期和插件来管理的。了解Maven的生命周期和插件,有助于理解项目的构建过程,以及在构建过程中可以执行哪些任务。

Maven 生命周期

Maven生命周期是一系列阶段的集合,定义了项目的构建过程。常用的生命周期包括:

  • clean: 清理项目,删除 target 目录。
  • validate: 验证项目是否正确。
  • compile: 编译项目的源代码。
  • test: 使用单元测试框架运行测试。
  • package: 将编译好的代码打包成可分发的格式,比如JAR。
  • verify: 对集成测试的结果进行验证,以保证质量。
  • install: 将打包好的项目发布到本地仓库。
  • deploy: 将项目发布到远程仓库。

这些生命周期是顺序执行的,你可以在某一个生命周期的阶段执行自定义的插件任务。

Maven 插件

Maven 插件是执行构建任务的工具,它们与生命周期和阶段相关联。常见的插件包括:

  • maven-compiler-plugin: 用于编译Java源代码。
  • maven-surefire-plugin: 用于执行单元测试。
  • maven-jar-plugin: 用于打包JAR文件。
  • maven-failsafe-plugin: 用于执行集成测试。

pom.xml 文件中,可以通过配置插件来定制项目的构建过程。以下是一个例子,使用 maven-compiler-plugin 插件配置Java编译器版本:

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins>
</build>

这里,我们配置了 maven-compiler-plugin 插件,指定了Java源代码和目标字节码的版本。

Maven 多模块项目

Maven支持多模块项目,通过模块化的方式组织代码和资源。多模块项目的结构类似于单模块项目,但包含了额外的父模块和子模块。

创建父模块

首先,创建一个父模块的Maven项目,用于管理子模块。在命令行中执行:

mvn archetype:generate -DgroupId=com.example -DartifactId=my-parent-module -DarchetypeArtifactId=maven-archetype-pom -DinteractiveMode=false

这个命令使用了 maven-archetype-pom 模板,生成了一个空的父模块项目。

创建子模块

在父模块的目录下,创建两个子模块的Maven项目:

mkdir my-child-module1
cd my-child-module1
mvn archetype:generate -DgroupId=com.example -DartifactId=my-child-module1 -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
cd ..mkdir my-child-module2
cd my-child-module2
mvn archetype:generate -DgroupId=com.example -DartifactId=my-child-module2 -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
cd ..

这样,我们得到了一个父模块和两个子模块的多模块项目结构。

父模块的 pom.xml

在父模块的 pom.xml 文件中,使用 <modules> 元素列出所有子模块:

<modules><module>my-child-module1</module><module>my-child-module2</module>
</modules>

这个配置告诉Maven父模块下有哪些子模块。

子模块的 pom.xml

在每个子模块的 pom.xml 文件中,需要指定父模块的信息。例如:

<parent><groupId>com.example</groupId><artifactId>my-parent-module</artifactId><version>1.0-SNAPSHOT</version>
</parent><artifactId>my-child-module1</artifactId>

这样,每个子模块都知道它们的父模块是谁,以及从父模块继承的信息。

构建多模块项目

在父模块的目录下执行Maven命令:

mvn clean install

这个命令将递归构建所有子模块,并将它们安装到本地仓库。你可以在每个子模块中执行单独的Maven命令,或者在父模块中执行命令。

cd my-parent-module
mvn clean install

这样,就完成了一个简单的多模块Maven项目的创建和构建。

Maven 高级特性

Maven 插件配置

在Maven中,插件配置是非常灵活的。你可以为插件定义各种配置参数,以满足项目的需求。

<build><plugins><!-- Maven Compiler 插件配置 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><!-- Maven Surefire 插件配置 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.22.2</version><configuration><skipTests>false</skipTests><testFailureIgnore>true</testFailureIgnore></configuration></plugin></plugins>
</build>

在这个例子中,我们为 maven-compiler-pluginmaven-surefire-plugin 插件配置了一些参数,比如Java版本和测试配置。

Maven Profiles

Maven允许使用profiles来定义一组构建配置,以便根据不同的环境或需求执行不同的构建。在 pom.xml 文件中,可以通过 <profiles> 元素定义不同的profile。

<profiles><profile><id>dev</id><activation><activeByDefault>true</activeByDefault></activation><properties><environment>dev</environment></properties></profile><profile><id>prod</id><properties><environment>prod</environment></properties></profile>
</profiles>

在这个例子中,我们定义了两个profile,一个是dev,一个是prod。在执行Maven命令时,可以通过 -P 参数指定要激活的profile。

mvn clean install -P prod

这样,可以根据不同的profile执行不同的构建逻辑。

Maven 插件编写

Maven插件是Maven项目的基础。如果你有特定的构建需求,而现有的插件无法满足,你可以考虑编写自己的Maven插件。

插件编写涉及到Java编程和Maven插件的结构。通常,一个Maven插件项目包含以下几个部分:

  • Mojo(目标): 插件的基本执行单元,定义了插件的一个具体任务。
  • Plugin: 插件的配置和描述,定义了插件的名称、目标等。
  • PluginDescriptor: 插件的描述信息,包括插件的目标、参数等。
  • PluginManager: 插件的管理器,用于加载和执行插件。

这里只是简单提及插件编写的主要部分,具体的插件编写涉及到更多的细节和实践。

总结

通过本文的详细介绍,你应该对Maven有了更深入的了解。从Maven的安装、基础概念,到项目的创建、编写和构建,再到高级特性的使用,我们一步步地探索了Maven的世界。

Maven的约定优于配置的理念、丰富的插件生态系统、依赖管理的便利性,使得它成为Java项目管理和构建的首选工具之一。通过学习和使用Maven,你可以更加高效地进行项目构建,减少配置的繁琐,专注于业务逻辑的实现。

在日常的开发工作中,深入理解Maven的使用对于提高团队的协作效率、项目的可维护性都有着积极的作用。希望你通过本文的学习,能够更加从容地驾驭Maven,为自己的项目构建之路铺平一条便捷之路。

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

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

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

相关文章

XTU-OJ-1452-完全平方数-笔记

参考博客 XTU-OJ 1452-完全平方数 题意 输入一个奇数&#xff0c;使得 n*(2*an-1)/2是一个完全平方数&#xff0c;求满足条件的最小的a 1<n<1e9 先输入样例数&#xff0c;再输入n 输入 2 1 3 输出 0 2 代码 #include<stdio.h>#define N 1000000010int a…

【UnityShader入门精要学习笔记】(1)了解渲染流水线

本系列为作者学习UnityShader入门精要而作的笔记&#xff0c;内容将包括&#xff1a; 书本中句子照抄 个人批注项目源码一堆新手会犯的错误潜在的太监断更&#xff0c;有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 文章目录 渲染流水线什么是流水线什么…

【教3妹学编程-算法题】经营摩天轮的最大利润

3妹&#xff1a;“打个中国结&#xff0c;再系个红腰带&#xff0c; 愿善良的人们天天好运来, 你勤劳生活美, 你健康春常在, 你一生的忙碌为了笑逐颜开。” 2哥 : 3妹&#xff0c;元旦快乐啊。 3妹&#xff1a;2哥元旦快乐~。 2哥&#xff1a;祝新的一年&#xff0c;3妹技术突飞…

SPI通信

SPI通信 1、SPI通信概述 SPI(Serial peripheral interface)是一种同步、串行、全双工、总线制、主从工作方式。 有四线控制&#xff1a; SDO——主设备数据输出&#xff0c;从设备数据输入&#xff0c;对于MOSI output slave inputSDI——主设备数据输入&#xff0c;从事设备…

Linux之进程管理

什么是进程 在linux中每个执行的程序都称为一个进程&#xff0c;每个进程都分配一个ID号&#xff08;pid进程号&#xff09;。每个进程都可能以两种方式存在&#xff0c;即前台和后天。前台进程就是用户目前的屏幕上可以进行操作的。后台进程则是实际在操作&#xff0c;但屏幕…

计算机网络【Google的TCP BBR拥塞控制算法深度解析】

Google的TCP BBR拥塞控制算法深度解析 宏观背景下的BBR 慢启动、拥塞避免、快速重传、快速恢复&#xff1a; 说实话&#xff0c;这些机制完美适应了1980年代的网络特征&#xff0c;低带宽&#xff0c;浅缓存队列&#xff0c;美好持续到了2000年代。 随后互联网大爆发&#x…

滴水逆向三期笔记与作业——02C语言——09 字节对齐_结构体数组

09 字节对齐_结构体数组 一、sizeof关键字1.1 基本类型的sizeof1.2 数组类型的sizeof1.3 结构体类型的sizeof 二、字节对齐--结构体对齐2.1 结构体对齐2.2 对齐规则2.2.1对其参数规则2.2.2 数据成员对齐规则2.2.2.3 结构体的总大小2.2.2.4 结构体嵌套 三、typedef关键字3.1 对已…

Python如何把类当做字典来访问及浅谈Python类命名空间

Python如何把类当做字典来访问 Python把类当做字典来访问 定义一个类将它实例化&#xff0c;我们可以通过obj.属性来访问类的属性&#xff0c;如果想获取类的所有实例变量&#xff0c;我们可以使用obj.__dict__来访问&#xff0c;如下&#xff1a; class A:def __init__(self)…

mount -a 出错任然重启问题

问题来源 在磁盘分区挂载过后&#xff0c;为了创建的新分区的能够永久挂载&#xff0c;我们常常会在/etc/fstab下写下配置文件&#xff0c;使其永久挂载。但是该配置一旦写错&#xff0c;就面临这死机问题&#xff0c;为此&#xff0c;以下操作针对该问题进行 解决方案&#x…

[每周一更]-(第43期):Golang版本的升级历程

从1.13接触go语言开始更新我们公司内第一个Go项目&#xff0c;直至现在go版本已经发展到1.20&#xff08;20230428&#xff09;&#xff0c;我们从go发版开始认识go语言&#xff0c;有利于我们更深入 了解这门语言&#xff0c;洞悉一些深层方式&#xff0c;加深我们学习的动力&…

3294 李白的酒

#include<bits/stdc.h> using namespace std; int main(){int n;double ans;scanf("%d",&n);for(int i1;i<n;i)ans1,ans/2;printf("%.5f",ans); }

基于蚁狮算法优化的Elman神经网络数据预测 - 附代码

基于蚁狮算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于蚁狮算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于蚁狮优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针…

CMake入门教程【基础篇】CMake+Minggw构建项目

文章目录 Minggw是什么Minggw下载CMake下载安装第1步&#xff1a;下载CMake第2步&#xff1a;安装CMake 如何构建和编译项目&#xff1a;使用CMake和MinGW总结 Minggw是什么 MinGW&#xff08;Minimalist GNU for Windows&#xff09;是一个免费的软件开发环境&#xff0c;旨在…

基于简化版python+VGG+MiniGoogLeNet的智能43类交通标志识别—深度学习算法应用(含全部python工程源码)+数据集+模型(二)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 模型构建1&#xff09;VGG模型简化版2&#xff09;GoogLeNet简化版——MiniGoogLeNet 3. 模型训练及保存 相关其它博客工程源代码下载其它资料下载 前言 本项目专注于解决出国自驾游特定场景下的交…

C#中string.ToUpper()和string.ToLower()的用法

目录 一、关于ToUpper()和ToLower() 1.ToUpper() 2.ToLower() 3.小结 二、实例 三、生成效果 一、关于ToUpper()和ToLower() 1.ToUpper() 使用字符串对象的ToUpper方法可以将字符串中的字母全部转换为大写。 string P_str_book "mingribook".ToUpper()…

AD教程 (二十一)模块化布局规划

AD教程 &#xff08;二十一&#xff09;模块化布局规划 原理图是按照我们的功能模块去进行排布划分的 利用交叉选择模式分屏快速进行模块化布局 分屏&#xff0c;选中任意文档&#xff0c;右击&#xff0c;点击垂直分割 交叉选择模式&#xff0c;点击工具&#xff0c;交叉选…

【Java进阶篇】JDK新版本中的新特性都有哪些

JDK新版本中的新特性都有哪些 ✔️经典解析✔️拓展知识仓✔️本地变量类型推断✔️Switch 表达式✔️Text Blocks✔️Records✔️封装类✔️instanceof 模式匹配✔️switch 模式匹配 ✅✔️虚拟线程 ✔️经典解析 JDK 8中推出了Lambda表达式、Stream、Optional、新的日期API等…

2023-12-12LeetCode每日一题(下一个更大元素 IV)

2023-12-12每日一题 一、题目编号 2454. 下一个更大元素 IV二、题目链接 点击跳转到题目位置 三、题目描述 给你一个下标从 0 开始的非负整数数组 nums 。对于 nums 中每一个整数&#xff0c;你必须找到对应元素的 第二大 整数。 如果 nums[j] 满足以下条件&#xff0c;那…

「网络编程」其他重要的协议或技术_ DNS协议 | ICMP协议 | NAT技术

「前言」文章内容是DNS协议、ICMP协议、NAT技术的讲解。 「归属专栏」网络编程 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、DNS协议1.1 背景1.2 域名简介1.3 域名解析的过程 二、ICMP协议2.1 ICMP简介2.2 ping命令2.3 traceroute命令 三、NAT技术3.1 NAT技术背景3.2 …

【算法提升—力扣每日一刷】五日总结【12/25--12/29】

文章目录 LeetCode每五日一总结【12/25--12/29】2023/12/25今日数据结构&#xff1a;双锁实现阻塞队列 2023/12/26每日力扣&#xff1a;[215. 数组中的第K个最大元素&#xff08;堆实现&#xff09;](https://leetcode.cn/problems/kth-largest-element-in-an-array/) 2023/12/…