【前端学java】如何从前端视角快速学习Maven

简介: 【8月更文挑战第12天】如何从前端视角快速学习Maven

基础介绍

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

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

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

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

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

创建Maven项目

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

使用IDEA创建maven项目非常容易,我们只需要新建项目,在Build system一栏中选择Maven即可
image.png
点击create按钮后,项目会自动创建,并下载一些依赖
GIF 2023-11-7 9-49-16.gif

maven项目结构简析

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

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

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

<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版本

<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包,包里有个helloWorldGIF 2023-11-7 10-34-09.gif

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

依赖管理

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

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

    依赖配置

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

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

<dependencies></dependencies>

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


<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>

作为新手,标签的依赖信息可以官方网站搜索关键词复制
GIF 2023-11-7 14-29-03.gif

最后点击界面右上角的“刷新”按钮,等待即可(test一栏可以删除,刷新后需要等待依赖下载,字体红色变白即可)
GIF 2023-11-7 14-34-07.gif

依赖传递

直接依赖与间接依赖

依赖具有传递性,如下图:
image.png
A项目依赖项目B和一个jar包Ajar包A称为A项目直接依赖:

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

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

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

    依赖之间的关联演示

    我们来感受下
    首先,我们导入三个相互关联的maven项目image.png
    如图,我们在A项目的pom文件中按中ctrl点击maven-projectB可以进入B项目的pom文件,在B项目的pom文件中点击maven-projectC可以进入C项目,这说明了他们之间的相互依赖性
    GIF 2023-11-7 17-40-27.gif
    我们也可以在编译器的maven面板中看到这些项目之间的依赖
                      ![image.png](https://cdn.nlark.com/yuque/0/2023/png/21865277/1699350387205-89115745-6cf5-46ab-ba1a-ab04e12b8608.png#averageHue=%233e4349&clientId=u7cf56a6e-00e4-4&from=paste&height=350&id=uea03f40d&originHeight=438&originWidth=654&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=33861&status=done&style=shadow&taskId=u223e8630-95d1-4efe-bda8-427a454e843&title=&width=523.2)
    
    在IDEA中,也提供了可视化面板观察项目中的依赖。比如我们观察A项目的依赖
    GIF 2023-11-7 17-49-13.gif

    排除依赖

    假设A项目不想关联B项目中的junit依赖改怎么做呢?
    在Maven中,可以通过在项目的pom.xml文件中使用exclusions元素排除特定的依赖。我们以A项目排除B项目的junit依赖为例
    GIF 2023-11-7 18-14-11.gif

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

依赖范围

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

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

    ![image.png](https://cdn.nlark.com/yuque/0/2023/png/21865277/1699352637834-116aa672-0473-4816-adab-821a2e454375.png#averageHue=%233d4242&clientId=u7cf56a6e-00e4-4&from=paste&height=115&id=u2de5fafc&originHeight=179&originWidth=584&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=13106&status=done&style=shadow&taskId=uc3d3340d-430c-4d88-a6f0-1e68e3202fa&title=&width=374.20001220703125)
    

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

    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.3</version>
    + <scope>test</scope>
    </dependency>
    

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

            ![image.png](https://cdn.nlark.com/yuque/0/2023/png/21865277/1699352790855-fe27bf26-8ca1-494c-b062-fc6638f7fe97.png#averageHue=%23e5beba&clientId=u7cf56a6e-00e4-4&from=paste&height=162&id=u06031f9b&originHeight=282&originWidth=1047&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=147879&status=done&style=shadow&taskId=ude2492b6-630b-4792-a806-21d264c6e17&title=&width=602.4000244140625)
    

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

    <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类试试
    GIF 2023-11-7 18-49-39.gif
    如图,编译器有智能提示,这说明test文件范围内是有效的。

    main程序验证

    如图,我们并找不到ch.qos.logback.classic.Logger路径下的Logger类,这说明,这个包在main文件范围内是不生效的。
    GIF 2023-11-7 18-51-28.gif
    那我们删除test配置呢?GIF 2023-11-7 18-56-13.gif
    如图,删除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 | |

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

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

执行指定生命周期

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

  • 在idea中,右侧的maven工具栏,选中对应的生命周期,双击执行GIF 2023-11-8 11-45-15.gif

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

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

GIF 2023-11-8 11-48-31.gif
如图,我们在命令行执行了 mvn clean命令,target编译目录被清除了。

相关文章
|
2月前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
46 0
|
2月前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
97 43
Java学习十六—掌握注解:让编程更简单
|
1月前
|
前端开发 开发者 C++
独家揭秘:前端大牛们如何高效学习新技术,保持竞争力!
【10月更文挑战第31天】前端技术飞速发展,如何高效学习新技术成为关键。本文通过对比普通开发者与大牛们的策略,揭示了高效学习的秘诀:明确目标、主动探索、系统资源、实践应用和持续学习。通过这些方法,大牛们能更好地掌握新技术,保持竞争力。示例代码展示了如何通过实践加深理解。
43 4
|
1月前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
2月前
|
存储 SQL 小程序
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
这篇文章详细介绍了Java虚拟机(JVM)的运行时数据区域和JVM指令集,包括程序计数器、虚拟机栈、本地方法栈、直接内存、方法区和堆,以及栈帧的组成部分和执行流程。
39 2
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
|
1月前
|
Java Maven Android开发
【Azure Developer】VS Code打包Java maven Project 遇见 BUILD FAILURE
Unknown lifecycle phase "lean". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>
|
1月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
1月前
|
Java 持续交付 项目管理
使用Maven进行项目管理:提高Java Web开发的效率
Maven 是一款强大的项目管理和构建自动化工具,广泛应用于Java社区。它通过依赖管理、构建生命周期管理、插件机制和多模块项目支持等功能,简化了项目的构建过程,提高了开发效率。本文将介绍Maven的核心功能及其在Java Web开发中的应用。
65 0
|
2月前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
57 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
2月前
|
前端开发 Java 应用服务中间件
Javaweb学习
【10月更文挑战第1天】Javaweb学习
34 2

推荐镜像

更多