【前端学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编译目录被清除了。

相关文章
|
19天前
|
存储 Java 开发者
抽象类和接口,你不知道的秘密!Java编程新视角
抽象类和接口,你不知道的秘密!Java编程新视角
34 5
|
19天前
|
Java Maven 容器
java依赖冲突解决问题之Maven在编译打包过程中对依赖的jar包如何解决
java依赖冲突解决问题之Maven在编译打包过程中对依赖的jar包如何解决
|
8天前
|
监控 Java 调度
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
61 6
【Java学习】多线程&JUC万字超详解
|
25天前
|
设计模式 前端开发 Java
【前端学java】SpringBootWeb极速入门-分层解耦(03)
【8月更文挑战第13天】SpringBootWeb极速入门-分层解耦(03)
15 2
【前端学java】SpringBootWeb极速入门-分层解耦(03)
|
26天前
|
开发框架 前端开发 Java
【前端学java】SpringBootWeb极速入门-实现一个简单的web页面01
【8月更文挑战第12天】SpringBootWeb极速入门-实现一个简单的web页面01
47 3
【前端学java】SpringBootWeb极速入门-实现一个简单的web页面01
|
26天前
|
JSON 前端开发 Java
【前端学java】SpringBootWeb极速入门-请求参数解析(02)
【8月更文挑战第12天】SpringBootWeb极速入门-请求参数解析(02)
14 1
【前端学java】SpringBootWeb极速入门-请求参数解析(02)
|
12天前
|
安全 Java 网络安全
【认知革命】JAVA网络编程新视角:重新定义URL与URLConnection,让网络资源触手可及!
【认知革命】JAVA网络编程新视角:重新定义URL与URLConnection,让网络资源触手可及!
27 2
|
14天前
|
前端开发 算法 网络协议
如何学习计算机基础知识,打好前端和网络安全的基础
如何学习计算机基础知识,打好前端和网络安全的基础
28 4
|
22天前
|
Java 持续交付 项目管理
Maven是一款基于Apache许可的项目管理和构建自动化工具,在Java开发中极为流行。
Maven是一款基于Apache许可的项目管理和构建自动化工具,在Java开发中极为流行。它采用项目对象模型(POM)来描述项目,简化构建流程。Maven提供依赖管理、标准构建生命周期、插件扩展等功能,支持多模块项目及版本控制。在Java Web开发中,Maven能够自动生成项目结构、管理依赖、自动化构建流程并运行多种插件任务,如代码质量检查和单元测试。遵循Maven的最佳实践,结合持续集成工具,可以显著提升开发效率和项目质量。
36 1
|
23天前
|
前端开发 IDE Java
"揭秘前端转Java的秘径:SpringBoot Web极速入门,掌握分层解耦艺术,让你的后端代码飞起来,你敢来挑战吗?"
【8月更文挑战第19天】面向前端开发者介绍Spring Boot后端开发,通过简化Spring应用搭建,快速实现Web应用。本文以创建“Hello World”应用为例,展示项目基本结构与运行方式。进而深入探讨三层架构(Controller、Service、DAO)下的分层解耦概念,通过员工信息管理示例,演示各层如何协作及依赖注入的使用,以此提升代码灵活性与可维护性。
33 2
下一篇
DDNS