3年前端,带你快速入门Maven!

基础介绍

在前端开发的大型项目中,我们经常会使用框架进行项目开发,如vue的脚手架vue-cli、项目依赖我们会使用npm进行管理。

Java开发中,也有完整的项目解决方案:Maven。

Maven是一个跨平台的项目管理工具,它基于项目对象模型(POM) 的概念,通过一小段描述信息来管理项目的构建。它主要有三个功能:

依赖管理 方便快捷的管理项目依赖的资源(jar包),避免版本冲突问题
统一项目结构 提供标准、统一的项目结构
项目构建 标准跨平台 (Linux、Windows.Macos) 的自动化项目构建方式

它的官网如下: maven.apache.org/

创建Maven项目

创建maven项目前,我们必须先下载安装maven,且IDEA做一些简单配置。本文不在赘述!

使用IDEA创建maven项目非常容易,我们只需要新建项目,在Build system一栏中选择Maven即可

点击create按钮后,项目会自动创建,并下载一些依赖

maven项目结构简析

使用IDEA创建的maven项目结构如下:

  • pom.xml是Maven项目的核心配置文件,包含了项目的各种信息和依赖。

默认配置中包含一个基本的maven坐标信息

xml 复制代码
<groupId>org.example</groupId>
<artifactId>Maven_demo</artifactId>
<version>1.0-SNAPSHOT</version>

什么是坐标

  • Maven 中的坐标是资源的唯一标识,通过该坐标可以唯一定位资源位置。
  • 使用坐标来定义项目或引入项目中需要的依赖。

Maven 坐标主要组成

  • groupld:定义当前Maven项目隶属组织名称(通常是域名反写,例如:com.shixiaoshi)
  • artifactld:定义当前Maven项目名称(通常是模块名称,例如 order-service、goods-service)
  • version:定义当前项目版本号

和项目编译打包的jdk版本

xml 复制代码
<properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
</properties>
  • src/main/java:这个目录下存放的是项目的Java源代码。其中,每个Java包对应一个目录,例如com.example.app对应的就是com/example/app这个目录。
  • src/main/resources:这个目录下存放的是项目的资源文件,例如配置文件,图片等。
  • src/test/java:这个目录下存放的是项目的测试代码。和src/main/java类似,每个Java包对应一个目录。

hello world

我们写个简单的hello world打印下。先创建一个first包,包里有个helloWorld

当我们运行程序时,我们会发现项目多了一个target包,这个包内的文件就是编译后的字节码文件

依赖管理

依赖管理是maven最核心的功能,它主要包含四个方面

  • 依赖配置
  • 依赖传递
  • 依赖范围
  • 生命周期

依赖配置

依赖:指当前项目运行所需要的jar包,一个项目中可以引入多个依赖。

配置依赖非常容易,比如我们要增加日志相关的依赖,在pom.xml中增加如下标签

xml 复制代码
<dependencies></dependencies>

然后在标签中配置依赖的坐标信息

xml 复制代码
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>

作为新手,标签的依赖信息可以官方网站搜索关键词复制

最后点击界面右上角的 "刷新"按钮, 等待即可(test一栏可以删除,刷新后需要等待依赖下载,字体红色变白即可)

依赖传递

直接依赖与间接依赖

依赖具有传递性,如下图:

A项目 依赖项目B 和一个jar包Ajar包A 称为A项目直接依赖:

  • 直接依赖:在当前项目中通过依赖配置建立的依赖关系

项目B依赖项目Cjar包B项目C 依赖jar包C,jar包Bjar包C 称为A项目的间接依赖:

  • 间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源

依赖之间的关联演示

我们来感受下

首先,我们导入三个相互关联的maven项目

如图,我们在A项目的pom文件中按中ctrl点击maven-projectB可以进入B项目的pom文件,在B项目的pom文件中点击maven-projectC可以进入C项目,这说明了他们之间的相互依赖性

我们也可以在编译器的maven面板中看到这些项目之间的依赖

在IDEA中,也提供了可视化面板观察项目中的依赖。比如我们观察A项目的依赖

排除依赖

假设A项目不想关联B项目中的junit依赖改怎么做呢?

在Maven中,可以通过在项目的pom.xml文件中使用exclusions元素排除特定的依赖。我们以A项目排除B项目的junit依赖为例

标签内部为每个你想排除的依赖添加一个元素。每个元素应包含你想要排除的依赖的groupId和artifactId。更改完成记得点击编译器右上角的"刷新"按钮

依赖范围

默认情况下,pom文件内配置的依赖在任何地方都可以使用。其作用范围如下:

  • 主程序范围有效。(main文件夹范围内)
  • 测试程序范围有效。(test文件夹范围内)
  • 打包后的程序

当然,我们也可以通过...</ scope> 设置其作用范围。

xml 复制代码
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
  + <scope>test</scope>
</dependency>

scope的取值有四种,它们的作用范围如下:

我们以A项目为例,来验证下test作用范围。A项目的pom文件如下

xml 复制代码
<dependencies>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
      + <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>com.shixaoshi</groupId>
        <artifactId>maven-projectB</artifactId>
        <version>1.0-SNAPSHOT</version>
        <!--排除依赖-->
        <exclusions>
            <exclusion>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

它引入了logback-classic的依赖,这意味着,在其作用范围内是可以使用logback-classic包提供的相关功能的。

logback-classic提供了一个Logger类(ch.qos.logback.classic.Logger),我们验证使用这个类时有没有智能提示即可。

test文件范围验证

我们在test的java目录下创建一个包名为com.shixiaoshi的Test类,在主程序中使用Logger类试试

如图,编译器有智能提示,这说明test文件范围内是有效的。

main程序验证

如图,我们并找不到ch.qos.logback.classic.Logger路径下的Logger类,这说明,这个包在main文件范围内是不生效的。

那我们删除test配置呢?

如图,删除test配置后,main文件范围内就可以使用logback-classic依赖了!

生命周期

生命周期简介

Maven的生命周期是对所有的构建过程进行抽象和统一,包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有的构建步骤。

Maven中有3套相互独立的生命周期:

clean生命周期 default生命周期 site生命周期
pre-clean validate pre-site
**clean:**清理上一次构建生成的文件。 compile:编译源代码。 site
post-clean test:使用合适的单元测试框架运行测试。 post-site
package:将产品打包成jar或其他格式
**install:**将打包的产物安装到本地仓库,供其他项目使用。
deploy

我们并不需要理解全部的生命周期。

在编译器的面板中,也已经集成好了这些生命周期:

执行指定生命周期

生命周期的执行方式有两种:

  • 在idea中,右侧的maven工具栏,选中对应的生命周期,双击执行

如图,我们执行了compile声明周期,编译出了target目录。

  • 在命令行中,通过命令执行

如图,我们在命令行执行了 mvn clean命令,target编译目录被清除了。

相关推荐
TheManba3 小时前
04. maven 三种项目打包方式 pom、jar、war 的区别(记一次 Spring 项目启动报错)
spring·maven·jar
爬山算法7 小时前
Maven(6)如何使用Maven进行项目构建?
java·maven
CS_GaoMing2 天前
Centos7 JDK 多版本管理与 Maven 构建问题和注意!
java·开发语言·maven·centos7·java多版本
Java探秘者2 天前
Maven下载、安装与环境配置详解:从零开始搭建高效Java开发环境
java·开发语言·数据库·spring boot·spring cloud·maven·idea
晚睡早起₍˄·͈༝·͈˄*₎◞ ̑̑2 天前
JavaWeb(二)
java·数据仓库·hive·hadoop·maven
忙里偷闲的sin2 天前
整理Maven坐标,Spring Boot集成工具依赖版本差异问题
java·spring boot·maven
芝法酱2 天前
芝法酱学习笔记(0.6)——nexus与maven私库
java·maven·nexus
-$_$-3 天前
【黑马点评】2 商户查询缓存
java·jmeter·缓存·maven
Pluto_CSND3 天前
maven安装本地jar包到本地仓库
maven·jar
丶21363 天前
【IDE】解决 IDEA-Maven Dependencies 中出现红色波浪线的问题
java·maven·intellij-idea