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

相关文章
|
1月前
|
前端开发 JavaScript 算法
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
transition过渡属性 早期在Web中要实现动画效果,都是依赖于JavaScript或Flash来完成。 但在CSS3中新增加了一个新的模块transition,它可以通过一些简单的CSS事件来触发元素的外观变化, 让效果显得更加细腻。简单点说,就是通过鼠标经过、获得焦点,被点击或对元素任何改变中触发, 并平滑地以动画效果改变CSS的属性值。 在CSS中创建简单的过渡效果可以从以下几个步骤来实现: 在默认样式中声明元素的初始状态样式; 声明过渡元素最终状态样式,比如悬浮状态; 在默认样式中通过添加
179 0
|
1月前
|
前端开发 JavaScript 算法
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
transform变形 css3在原来的基础上新增了变形和动画相关属性,通过这些属性可以实现以前需要大段JavaScript才能实现的 功能。 CSS3的变形功能可以对HTML组件执行位移、旋转、缩放、倾斜4种几何变换,这样的变换可以控制HTML组件 呈现出丰富的外观。 借助于位移、旋转、缩放、倾斜这4种几何变换,CSS3提供了transition动画。 transition动画比较简单,只要指定HTML组件的哪些CSS属性需要使用动画效果来执行变化,并指定动画时间,就可保证动画播放。 比transitio
135 0
|
1月前
|
存储 Oracle Java
java零基础学习者入门课程
本课程为Java零基础入门教程,涵盖环境搭建、变量、运算符、条件循环、数组及面向对象基础,每讲配示例代码与实践建议,助你循序渐进掌握核心知识,轻松迈入Java编程世界。
247 0
|
2月前
|
Java API 容器
Java基础学习day08-2
本节讲解Java方法引用与常用API,包括静态、实例、特定类型方法及构造器引用的格式与使用场景,并结合代码示例深入解析。同时介绍String和ArrayList的核心方法及其实际应用。
152 1
|
1月前
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
176 0
|
1月前
|
负载均衡 Java API
grpc-java 架构学习指南
本指南系统解析 grpc-java 架构,涵盖分层设计、核心流程与源码结构,结合实战路径与调试技巧,助你从入门到精通,掌握高性能 RPC 开发精髓。
208 7
|
2月前
|
Java
Java基础学习day08-作业
本作业涵盖Java中Lambda表达式的应用,包括Runnable与Comparator接口的简化实现、自定义函数式接口NumberProcessor进行加减乘及最大值操作,以及通过IntProcessor处理整数数组,实现遍历、平方和奇偶判断等功能,强化函数式编程实践。
72 5
|
2月前
|
Java 程序员
Java基础学习day08
本节讲解Java中的代码块(静态与实例)及其作用,深入介绍内部类(成员、静态、局部及匿名)的定义与使用,并引入函数式编程思想,重点阐述Lambda表达式及其在简化匿名内部类中的应用。
133 5
|
2月前
|
Java
Java基础学习day07-作业
本作业包含六个Java编程案例:1)动物类继承与多态;2)加油卡支付系统;3)员工管理类设计;4)学生信息统计接口;5)USB设备控制;6)家电智能控制。综合运用抽象类、接口、继承、多态等面向对象技术,强化Java基础编程能力。
173 3
|
2月前
|
Java
Java基础学习day06-作业
本内容为Java基础学习作业,涵盖两个案例:一是通过Card类及其子类GoldenCard、SilverCard实现加油卡系统,体现封装与继承;二是通过Shape类及子类Circle、Rectangle演示多态与方法重写,强化面向对象编程理解。
78 1

推荐镜像

更多