当前位置: 首页 > news >正文

【Maven】一篇带你了解Maven项目管理工具

目录

  • 项目管理工具Maven
    • 初识Maven
      • 什么是Maven
      • 为什么使用Maven
      • Maven功能
      • 什么是项目构建
      • 什么是依赖管理
      • Maven应用场景
      • Maven项目结构
      • Maven特点
      • Maven模型
    • Maven安装
      • 安装准备
      • Maven安装目录分析
      • 环境变量配置
    • 创建Maven项目
      • 通过IDEA创建
      • 手动创建
      • 手动引入依赖
    • 配置Maven仓库
      • Maven仓库概念
      • Maven仓库布局
      • Maven本地仓库配置
      • Maven远程仓库配置
    • Maven项目视图

项目管理工具Maven

初识Maven

什么是Maven

Maven是跨平台的项目管理工具。主要服务基于Java平台的项目构建,依赖管理和项目信息管理。

它是 Apache 下的一个纯 Java 开发的开源项目,Maven 曾是 Jakarta 项目的子项目,现为由 Apache 软件基金会主持的独立 Apache 项目。

为什么使用Maven

Java生态十分丰富,无论我们想实现什么功能,几乎都可以找到对应的工具类,而这些工具类都是以jar包的形式出现的。

这些jar包之间会有关联,在使用一个依赖之前还需要确定这个依赖所依赖的其他依赖。所以当我们的项目比价大的时候,这些依赖管理会变得十分臃肿,我们可以利用Maven解决这个问题。

同时它可以管理各种项目,如C#,Ruby等等

Maven可以处理多模块项目。对于简单的项目,我们单模块分包处理即可,但是如果项目比较复杂,要做成多模块项目,比如一个音乐盒,我们会有用户模块,服务端模块,图片模块等等,这些模块单独是无法运行的,我们需要将它们整合,我们借助Maven可以一键打包。

当我们使用Maven进行管理的时候,我们通过定义一个项目对象模型——POM来详细描述我们自己的项目配置,我们可以理解为Maven项目的配置文件。

Maven功能

Maven可以帮助我们开发者完成一下工作:

  • 项目构建
  • 文档生成
  • 依赖管理
  • 日志报告
  • 发布
  • 分发
  • 等等其他功能

什么是项目构建

项目构建:是一个从编写源代码到编译、测试、运行、打包、部署的过程。

  • 传统项目和maven项目构建的两种方式

    • 传统项目:

      打开Idea编写源代码和配置文件,对源代码进行编译,可以使用Junit进行单元测试,把项目打成war包,部署到Tomcat服务器中运行。

    • maven项目:

      maven将项目构建过程进行标准化,每个阶段都可以使用一个命令来完成。

      清理 --> 编译 --> 测试 --> 报告 --> 打包 --> 部署

      好处:

      可以通过命令完成项目构建。(测试:使用mvn tomcat:run的命令来发布运行项目)maven对每个构建阶段进行规范,有利于大型团队协作开发。

在这里插入图片描述

什么是依赖管理

对第三方依赖包的管理,可以连接互联网下载项目所需第三方jar包。

对自己开发的模块的管理,可以像引用第三方依赖包一样引用自己项目的依赖包。

在这里插入图片描述

Maven应用场景

Maven的应用场景,开发人员只要按着maven标准的目录结构进行开发即可,然后提交代码。在测试服务器上拉取Java源码,然后可以使用maven的自动化项目构建完成项目的清理、编译、测试、打包和安装部署等。

在这里插入图片描述

Maven项目结构

Maven项目提倡使用一个共同的标准目录结构,如下所示:

如下所示:

目录目的
${basedir}存放pom.xml和所有的子目录
${basedir}/src/main/java项目的java源代码
${basedir}/src/main/resources项目的资源,比如说property文件,springmvc.xml
${basedir}/src/test/java项目的测试类,比如说Junit代码
${basedir}/src/test/resources测试用的资源
${basedir}/src/main/webapp/WEB-INFweb应用文件目录,web项目的信息,比如存放web.xml、本地图片、jsp视图页面
${basedir}/target打包输出目录
${basedir}/target/classes编译输出目录
${basedir}/target/test-classes测试编译输出目录
Test.javaMaven只会自动运行符合该命名规则的测试类
~/.m2/repositoryMaven默认的本地仓库目录位置 可以在Maven的settings.xml配置文件中自己更改自己的本地仓库

Maven特点

  • 项目设置遵循统一的规则。
  • 任意工程中共享。
  • 依赖管理包括自动更新。
  • 一个庞大且不断增长的库。
  • 可扩展,能够轻松编写 Java 或脚本语言的插件。
  • 只需很少或不需要额外配置即可即时访问新功能。
  • 基于模型的构建 − Maven能够将任意数量的项目构建到预定义的输出类型中,如 JAR,WAR 或基于项目元数据的分发,而不需要在大多数情况下执行任何脚本。
  • 项目信息的一致性站点 − 使用与构建过程相同的元数据,Maven 能够生成一个网站或PDF,包括您要添加的任何文档,并添加到关于项目开发状态的标准报告中。
  • 发布管理和发布单独的输出 − Maven 将不需要额外的配置,就可以与源代码管理系统(如 Subversion 或 Git)集成,并可以基于某个标签管理项目的发布。它也可以将其发布到分发位置供其他项目使用。Maven 能够发布单独的输出,如 JAR,包含其他依赖和文档的归档,或者作为源代码发布。
  • 向后兼容性 − 您可以很轻松的从旧版本 Maven 的多个模块移植到 Maven 3 中。
  • 子项目使用父项目依赖时,正常情况子项目应该继承父项目依赖,无需使用版本号,并行构建 − 编译的速度能普遍提高20 - 50 %。
  • 更好的错误报告 − Maven 改进了错误报告,它为您提供了 Maven wiki 页面的链接,您可以点击链接查看错误的完整描述。

Maven模型

在这里插入图片描述

Maven安装

安装准备

  • 安装JDK1.8或以上

    JDK下载地址:Java Downloads | Oracle 中国

    进入下载页面之后我们去下面找我们需要的JDK版本:

    在这里插入图片描述

  • 安装Maven

    Maven下载地址:Maven – Download Apache Maven

    进去之后推荐的是Maven3.9,同样,你可以在下面找到你想要的Maven版本,这里我就不再安装,我直接使用idea2024自带的Maven插件,版本是Maven3.9.8,可以在idea的plugin目录中找到它的安装目录,我的目录是这样的:D:\IDEA\IntelliJ IDEA 2024.2.3\plugins\maven\lib\maven3

    解压的时候注意目录不要带中文

    在这里插入图片描述

Maven安装目录分析

解压缩之后你应该可以在你的解压目录下看到这几个文件,我们来解释一下这些都存放了一些什么文件:

在这里插入图片描述

  • bin:含有mvn运行的脚本

  • boot:含有plexus-classworlds类加载器框架

  • conf:含有settings.xml配置文件

  • lib:含有Maven运行时所需要的java类库

  • LICENSE.txt, NOTICE.txt, README.txt针对Maven版本,第三方软件等简要介绍

环境变量配置

为什么要配置环境变量?

方便我们在任何地方都可以使用Maven,而不是每次都需要跳转到maven\bin目录下去操作这些可执行文件

同时简化了命令行操作;为不同的环境设置不同的配置;方便开发工具或应用程序通过环境变量获取配置信息等等,

  1. 设置MAVEN_HOME环境变量

    这样配置我们在改变Maven版本的时候只需要重新设置MAVEN_HOME环境变量即可,无需修改Path中的系统环境变量

    在这里插入图片描述

    这里我们定位到Maven的解压目录即可

  2. 设置Path环境变量,把 %MAVEN_HOME%\bin 添加到Path的变量值末尾,与前面的内容用 ; 隔开,如图:

    在这里插入图片描述

  3. 配置完成之后我们在控制台进行验证:

    在这里插入图片描述

创建Maven项目

我们按照上面给出的Maven项目结构创建出我们的第一个Maven项目,

通过IDEA创建

我们先来看idea内置的Maven构建工具如何创建一个普通的Maven项目,这里我以IntelliJ IDEA 2024.2.3版本为例,如果你是其他版本的IDEA,可以去找对应版本的构建方式:

  1. 我们选择新建项目

    在这里插入图片描述

  2. 我们创建普通Maven项目,直接选择Java,然后右边的构建系统选择Maven,不要选择下面Maven骨架生成器,会带一些不必要的格式:

    在这里插入图片描述

    这里的groupIdartifactId指的是我们后面要说的Maven坐标,用于定位我们的Maven项目这里说一下groupId一般是公司名字的反写,后面做详细解释

  3. 点击创建之后我们就创建好了我们的第一个Maven项目,但是在第一次创建的时候我们需要进行一些设置:

    我们转到文件—>设置—>构建、执行、部署—>构建工具—>Maven,其中的Maven主路径选择你Maven解压的路径,下面的用户设置文件你也可以自己手动指定,本地仓库idea会自动读取settings.xml中指定的本地仓库,同样你也可以进行重写,指向你想要的仓库

    在这里插入图片描述

  4. 设置完之后我们点击应用,这样我们该项目的Maven设置就配置好了,但是我们不想每次创建新Maven项目的时候都进行一次这样的设置,所以我们来到文件—>新建项目设置—>新项目的设置—>构建、执行、部署—>构建工具—>Maven,按照上面我们的设置再设置一遍就可以了

    在这里插入图片描述

这就是我们创建好的Maven项目:

在这里插入图片描述

手动创建

为了深入了解Maven项目的具体结构,我们来根据项目结构手动创建一遍,一般不会手动创建:

  • src/main/java —— 存放项目的.java文件

  • src/main/resources —— 存放项目资源文件,如spring, mybatis配置文件

  • src/test/java —— 存放所有测试.java文件,如JUnit测试类

  • src/test/resources —— 测试资源文件

  1. 这里我的根目录是D:\JAVAProject\HelloMaven,这个可以自己选择

    在这里插入图片描述

  2. 创建好以上文件夹之后,我们还不能将他称为Maven项目,我们需要在根目录添加pom.xml,也就是我们的Maven项目核心,并将下面这段代码复制进去(你可以先创建成txt文件,填入内容之后再修改后缀名为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.qcby</groupId><!-- 如果你的项目名称和我不一样,这里也需要修改成你自己的项目名称 --><artifactId>HelloMaven</artifactId> <version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><!-- 这里用于引入依赖,JUnit用于测试类 --><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.1</version><scope>test</scope></dependency>	</dependencies></project>
    
  3. 创建Hello.java文件,在src/main/java/cn/tx/maven目录下新建文件Hello.java,这里/cn/tx/maven这个路径你按你喜好自己设置,并将下面的代码放入其中:

    package cn.tx.maven; // 如果你路径改了,这里也需要修改,这里代表的是你此项目所在的包的位置
    public class Hello {public String sayHello(String name){return "Hello "+name+"!";}
    }
  4. 创建HelloTest.java文件,在/src/test/java/cn/tx/maven目录下新建测试文件HelloTest.java,将下面的代码放入其中:

    package cn.tx.maven; // 你自己看着办
    import org.junit.Test;
    import static junit.framework.Assert.*;
    public class HelloTest {@Testpublic void testHello(){Hello hello = new Hello();String results = hello.sayHello("maven");assertEquals("Hello maven!",results);		}
    }
    
  5. 到此为止我们的Maven项目算是手动创建成功了,我们可以在控制台对这个项目进行一些操作:

    1. 打开cmd命令行,进入Hello项目根目录执行 mvn compile命令,查看根目录变化

    2. cmd 中继续录入mvn clean命令,然后再次查看根目录变化

    3. cmd 中录入 mvn clean compile命令, 查看根目录变化

    4. cmd 中录入 mvn clean test命令,查看根目录变化

    5. cmd 中录入 mvn clean package命令,查看根目录变化

    6. cmd 中录入 mvn clean install 查看仓库会把项目安装到仓库里

    这些命令我们之后还会提到,这里先看看你的项目根目录变化就好,有一些变化会发生在新生成的target文件夹下

手动引入依赖

我们来手动完成一下Maven引入依赖的过程

  1. 首先按照上面的步骤我们再来新建一个Maven项目,我把他命名为:HelloFriend,但是这次我们在pom文件中将我们的HelloMaven项目作为依赖引入我们当前的HelloFriend

    <?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.qcby.maven</groupId><artifactId>HelloFriend</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!-- https://mvnrepository.com/artifact/junit/junit --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.1</version><scope>test</scope></dependency><!-- 将之前的HelloMaven01当作依赖引入 --><dependency><groupId>com.qcby.maven</groupId><artifactId>HelloMaven01</artifactId><version>1.0-SNAPSHOT</version><scope>compile</scope></dependency>	</dependencies></project>
    
  2. 创建HelloFriend.java文件,在src/main/java/cn/tx/maven目录下新建文件HelloFriend.java

    package cn.tx.maven;import cn.tx.maven.Hello; // 引入上面的Hello类public class HelloFriend {public String sayHelloToFriend(String name){Hello hello = new Hello();String str = hello.sayHello(name)+" I am "+this.getMyName();System.out.println(str);return str;}public String getMyName(){return "John";}
    }
    
  3. 创建HelloFriendTest.java文件,在/src/test/java/cn/tx/maven目录下新建测试文件HelloFriendTest.java

    package cn.tx.maven;import cn.tx.maven.Hello;public class HelloFriend {public String sayHelloToFriend(String name){Hello hello = new Hello();String str = hello.sayHello(name)+" I am "+this.getMyName();System.out.println(str);return str;}public String getMyName(){return "John";}}
    
  4. 然后我们对HelloFriend项目进行测试打包,在HelloFriend目录下执行命令mvn package,如果你在之前的HelloMaven项目中没有执行过mvn clean install命令的话,那你就会得到这样一个结果:

    在这里插入图片描述

    系统报错提示:Could not find artifact com.qcby.maven:HelloMaven:jar:1.0-SNAPSHOT也就是没办法找到我们想要的依赖HelloMaven.jar

    故此我们需要重新构建第一个项目HelloMaven并安装到仓库,在命令行HelloMaven根目录下执行mvn clean install

    在这里插入图片描述

    此时再次对HelloFriend进行打包:

    在这里插入图片描述

    可以发现成功了

配置Maven仓库

Maven仓库概念

用来统一存储所有Maven共享构建的位置就是仓库,Maven有三种仓库类型:

Maven有3种仓库类型:本地仓库、私服仓库、中央仓库

仓库类型说明
本地仓库就是你自己电脑上的仓库,每个人电脑上都有一个仓库 默认位置在当前用户名.m2\repository 你也可以在配置文件中定义自己的仓库路径
私服仓库一般来说是公司内部搭建的Maven私服,处于局域网中,访问速度较快 这个仓库中存放的jar 一般就是公司内部自己开发的jar
中央仓库由Apache 团队来维护,包含了大部分的jar 早期不包含Oracle 数据库驱动,从 2019 年8月开始,包含了Oracle驱动

现在存在3个仓库,那么jar包如何查找呢?

在这里插入图片描述

大概是这样一个顺序

Maven仓库布局

  • 根据Maven坐标定义每个构建在仓库中唯一存储路径
  • groupId/artifactId/version/artifactId-version/packaging

这些坐标可以帮我们定位一个仓库中的jar包的位置

Maven本地仓库配置

我们通过修改Maven配置文件settings.xml中的本地仓库路径,定义自己的本地仓库

在这里插入图片描述

Maven远程仓库配置

如果不配置镜像源的话,Maven会自动从中央仓库下载我们的依赖,可能会导致下载慢或者链接不上的情况,我们可以配置镜像源,来替代中央仓库:在mirrors标签中添加:

<!-- 阿里镜像 -->
<mirror><id>aliyun</id><mirrorOf>central</mirrorOf><name>aliyun Maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>

就可以替代中央仓库,使用阿里镜像源来下载依赖,提高下载速度,当然你可以选择其他的镜像源。

在这里插入图片描述

Maven项目视图

在这里插入图片描述


http://www.mrgr.cn/news/54749.html

相关文章:

  • 价值投资(Value Investing)
  • string
  • 深入探索 RocketMQ:高性能分布式消息中间件
  • 控制Stable Diffusion生成质量的多种方法
  • Verilator——最简单、最细节上手教程
  • Yolov10菜品的目标检测模型训练及推理(包括数据集、训练及推理源码)
  • int argc, char *argv[]
  • 6.C++经典实例-计算给定范围内的素数(质数)
  • SLACC Simion-based Language Agnostic Code Clones
  • 基于STM32的超声波流量计设计
  • python编译问题 当你编译第一个python程序时可能出现如下错误
  • 【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,1-11
  • Tornado简单使用
  • JavaScript 新手必知的基本概念
  • 深入了解 Flannel(3):vxlan在flannel中的作用
  • 【Linux系统编程】冯诺依曼体系结构与操作系统
  • 操作系统之内存管理基本概念
  • SpringCloudAlibaba[Nacos]注册配置中心注册与发现服务
  • CGAL专篇-Kernel计算精度
  • 使用模拟器获取app的素材文件
  • 《30 年失联姐妹的短暂相聚与决绝分手》
  • 整合全文检索引擎 Lucene 添加站内搜索子模块
  • Java中的动态代理——介绍与使用示例
  • 数据库必会面试题(含答案)
  • 数据结构与算法——Java实现 41.对称二叉树
  • LeetCode Hot100 - 滑动窗口篇