【Maven】(二)使用 Maven 创建并运行项目、聊聊 POM 中的坐标与版本号的规则
创始人
2024-05-26 16:04:37
0

文章目录

  • 1.前言
  • 2.hello-world
    • 2.1.Archetype 创建
    • 2.2.使用 IDE 创建
    • 2.3.Maven的目录结构
  • 3.pom的基本组成
    • 3.1.Maven坐标的概念与规则
    • 3.2.版本号规则
    • 2.3.打包成可运行的JAR
  • 4.结语

1.前言

本系列文章记录了从0开始到实战系统了解 Maven 的过程,Maven 系列历史文章:

(一)5分钟做完 Maven 的安装与配置

在上一篇文章中,我们已经快速的安装并配置好了 Maven 的环境,现在就可以开始将 Maven用起来了,在开始创建 Maven 项目之前,先介绍一个本篇文中涉及到的内容,包括:

  • Maven 的快速开始
  • Maven 项目的目录结构
  • POM 文件的基本组成(简要版,更详细的介绍会随着本专题的推进慢慢展开)
  • 坐标、版本号、以及SNAPSHOT的含义
  • Maven 自带插件的使用

接下来,我们就开始吧!

2.hello-world

首先,我需要创建一个 Maven 的项目,创建项目的方式多种多样,例如:手动创建 Maven 的目录结构与 pom 文件、使用 Archetype 生成Maven 的项目、或者直接使用 IDE 进行创建。

2.1.Archetype 创建

Archetype 是 Maven 用来初始化项目骨架的插件(Maven 有很多自带的插件,很多时候我们都意识不到自己在使用),由于我们使用的是 Maven3,可以直接运行下面的指令:

mvn archetype:generate

第一次运行这个指令的时候,会从中央仓库中下载插件,所以会看到控制台一长串的输出,直到:
在这里插入图片描述
这里的左边那一串数字有点类似于需要使用的 Maven项目目标,右边默认的 1982 指的是maven-archetype-quickstart,我们可以在控制台中找到它:
在这里插入图片描述
如果不需要使用其他模板的话,直接回车即可,接下来回提示输入 groupIdartifactIdversion 等,这个其实就是生成的 POM 中需要的坐标数据,此处将 groupId 填写为 com.ls.mavendemoartifactId 填写为 hello-world(在下面POM的基本组成中会解释为什么),再一顿回车之后,项目就创建成功了。
在这里插入图片描述在这里插入图片描述

2.2.使用 IDE 创建

在实际的开发中,我们可能更多的会使用IDE来生成 Maven 项目,图形化的界面会更加友好,例如使用 Idea 来创建:

File -> new -> project
在这里插入图片描述
然后,就可以输入 groupIdartifactIdversion 几个参数了:
在这里插入图片描述
点击Next -> Finish 项目就创建完成了。

2.3.Maven的目录结构

在这里插入图片描述
忽略掉 .idea 文件夹,上图中的剩余部分就是 Maven 的目录结构了,这种目录结构是 Maven 的规范所规定的,在 src 下面会包含 maintest两个文件夹,两者代表了不同的分工环境:

  • main:写功能代码
  • test:写测试代码

在这里面的 java 指的是放置代码的文件夹,同样的在 java 的同级目录下,往往还会有一个 resources 文件夹用于放置项目中使用到的配置文件、模板文件等静态文件,例如:xml、properties等。
在这里插入图片描述

3.pom的基本组成

打开 pom.xml ,可以看到里面有大概有70多行配置:

4.0.0com.ls.mavendemohello-world1.0-SNAPSHOThello-worldhttp://www.example.comUTF-81.71.7junitjunit4.11testmaven-clean-plugin3.1.0maven-resources-plugin3.0.2maven-compiler-plugin3.8.0maven-surefire-plugin2.22.1maven-jar-plugin3.0.2maven-install-plugin2.5.2maven-deploy-plugin2.8.2maven-site-plugin3.7.1maven-project-info-reports-plugin3.0.0

我们先把这个文件改纯净一点,删除一部分内容

  • build -> pluginManagement: 里面的内容是Maven会使用到的默认插件,这里不需要进行配置先删除掉。
  • url: 是建立网站需要的信息,我们现在不需要建站。
  • properties:是配置的变量,这个常用于统一管理依赖包的版本,后续的文章中会将,这里暂时用不到。

下面是清理过后的 pom.xml 文件:

4.0.0com.ls.mavendemohello-world1.0-SNAPSHOThello-worldjunitjunit4.11test

先看一下各个标签的含义:

  • :POM 的根元素,定义了一些POM相关的规范。
  • : POM版本号,我们用的是 Maven3 这里只能是4.0.0
  • :项目的坐标,用于确定一个唯一的项目,下面会详细提到
  • :当前项目的名称
  • :当前项目引入的依赖
  • :单个需要引入的具体的依赖包
  • :依赖的范围,常见的有 compiletest,不同的范围起到包隔离的作用,这个在后面依赖相关的文章中详细讲

3.1.Maven坐标的概念与规则

在一个三维的空间坐标系中,我们可以通过 x,y,z 三个方向的坐标确定做坐标系上的唯一一个点。
Maven的坐标概念与之类似,在建立Maven仓库的时候我们也可以通过 的值来确定唯一一个构件,下面依次来看看这三者的填写规则。

  • :指的是当前构建隶属的实际项目,一般是 公司的网址倒序 + 项目名
  • :一般是指的当前项目中的其中一个模块
  • :当前项目的版本号

以 SpringBoot 为例:

org.springframework.bootspring-boot-starter2.7.8

org.springframework.boot 就是 Spring 所在公司的 SpringBoot 项目,spring-boot-starter这个项目的其中一个模块,版本号为2.7.8
同理如果我们要引入Web模块,自然就应该是:

org.springframework.bootspring-boot-starter-web2.7.8


为什么 groupId 不能直接是一个组织呢,要细化到一个项目呢?
一般来说一个公司、组织上不会只有一个项目,如果 groupId 直接占用了组织,那项目名就只有放到 artifactId 中了,但是一个项目也有可能会有过个模块,模块名就没有地方放了。
所以我们在实际开发中创建一个 Maven 项目的时候,可以尽可能的遵守这样的约定。

3.2.版本号规则

看到这里,相信大家已经注意到了,上面引入的 SpringBoot 的版本号是 3位数,而自己创建的 hello-world 项目版本号只有 2位,并且后面还有一个 SNAPSHOT

Maven 的版本号规则实际上也是业界的通过规则,它的定义方式如下:

{主版本号}.{次版本号}.{增量版本号}-{里程碑版本}
  • 主版本号:一般是指的当前的项目有了重大的架构变动,版本之间几乎完全不兼容,例如:最近出的 SpringBoot3 就已经放弃了Java8,如果不升级 JDK的话,还是只能使用SpringBoot2
  • 次版本号:一般是指的项目的迭代版本,这种版本会修复大量的bug,带来一些小的新特性等,但是没有什么架构上的重大变化。
  • 增量版本号:一般是用于修复一些紧急bug,改动量很小时,可以使用增量版本号。
  • 里程碑版本:就是项目的当前版本处于一个什么样的阶段了,常见的里程碑版本有 SNAPSHOTalphabetareleaseGA 等。
    在里程碑的版本中,标注SNAPSHOT的为开发版,此时会存在大量的代码变动,alphabeta分别对应的是内测版与公测版这三个版本都是属于不稳定版本,使用的时候非常容易踩坑,所以一般只用的demo体验,在正式环境中不能使用。
    releaseGA都属于是稳定的正式版本,可以在正式环境中使用。

下面是SpringBoot的一些版本号,可以体验一下:
在这里插入图片描述


这里需要再提一嘴,SNAPSHOT 在 Maven仓库中有特别的含义,处于这个里程碑版本的项目可以多次install到仓库中,每一次都会覆盖前一次生成的包,但是非 SNAPSHOT 的版本是不能覆盖的,每次install都需要修改版本号。

如果不理解这段话,可以继续关注后续的文章,会讲到如何将项目打包到本地仓库以及推送到私服中。

2.3.打包成可运行的JAR

我们在开发完代码之后,需要将代码打包到测试环境中测试,Maven 提供了项目构建相关的插件,我们只需要直接使用即可。单项目的打包非常简单,我们可以进入到项目所在的根目录中(pom所在目录),执行下面的指令。

mvn clean package
  • clean:清空上一次生成的target目录,避免最新修改的代码没有被打包到新版本中造成一些意外的情况。
  • package:将当前代码打成一个可以执行的jar包。

执行完成之后,在src 目录下会出现一个同级的target目录,里面就会出现一个满足当前项目坐标的jar包:
在这里插入图片描述
我们通过 java -jar 运行这个 jar 包,会发现无法运行:

hello-world-1.0-SNAPSHOT.jar中没有主清单属性

如何才能运行呢?
在这里插入图片描述
我们需要执行的是这个App类里面的main方法,而正常的打包方式,没有指定执行它,所以我们需要通过shade插件来指定一下,在pom.xml中加入插件:

org.apache.maven.pluginsmaven-shade-plugin3.2.4packageshadecom.ls.mavendemo.App

mainClass 中指定需要运行的类的全类名
在这里插入图片描述
再次重试打包运行,运行成功。
在这里插入图片描述


4.结语

本篇讲述了如何使用 Maven 自带的插件以及IDE 创建、打包、运行项目,同时介绍了 pom.xml 文件的基本组成,以 SpringBoot为例,介绍了坐标和版本号的使用规则。

到目前为止,已经可以使用Maven来进行一些简单的开发工作了,但距在公司中与同事一起协作开发较大的项目还有一定的差距,可以继续关注本专题的后续文章。

下一篇将会讲述 Maven 仓库的使用以及 Maven 私服的安装和使用。


如果觉得本文有帮助的话,可以帮忙点点赞哦!

相关内容

热门资讯

安卓子系统windows11,... 你知道吗?最近科技圈可是炸开了锅,因为安卓子系统在Windows 11上的兼容性成了大家热议的话题。...
电脑里怎么下载安卓系统,电脑端... 你有没有想过,你的电脑里也能装上安卓系统呢?没错,就是那个让你手机不离手的安卓!今天,就让我来带你一...
索尼相机魔改安卓系统,魔改系统... 你知道吗?最近在摄影圈里掀起了一股热潮,那就是索尼相机魔改安卓系统。这可不是一般的改装,而是让这些专...
安卓系统哪家的最流畅,安卓系统... 你有没有想过,为什么你的手机有时候像蜗牛一样慢吞吞的,而别人的手机却能像风一样快?这背后,其实就是安...
安卓最新系统4.42,深度解析... 你有没有发现,你的安卓手机最近是不是有点儿不一样了?没错,就是那个一直在默默更新的安卓最新系统4.4...
android和安卓什么系统最... 你有没有想过,你的安卓手机到底是用的是什么系统呢?是不是有时候觉得手机卡顿,运行缓慢,其实跟这个系统...
平板装安卓xp系统好,探索复古... 你有没有想过,把安卓系统装到平板上,再配上XP系统,这会是怎样一番景象呢?想象一边享受着安卓的便捷,...
投影仪装安卓系统,开启智能投影... 你有没有想过,家里的老式投影仪也能焕发第二春呢?没错,就是那个曾经陪你熬夜看电影的“老伙计”,现在它...
安卓系统无线车载carplay... 你有没有想过,开车的时候也能享受到苹果设备的便利呢?没错,就是那个让你在日常生活中离不开的iOS系统...
谷歌安卓8系统包,系统包解析与... 你有没有发现,手机更新换代的速度简直就像坐上了火箭呢?这不,最近谷歌又发布了安卓8系统包,听说这个新...
微软平板下软件安卓系统,开启全... 你有没有想过,在微软平板上也能畅享安卓系统的乐趣呢?没错,这就是今天我要跟你分享的神奇故事。想象你手...
coloros是基于安卓系统吗... 你有没有想过,手机里的那个色彩斑斓的界面,背后其实有着一个有趣的故事呢?没错,我要说的就是Color...
安卓神盾系统应用市场,一站式智... 你有没有发现,手机里的安卓神盾系统应用市场最近可是火得一塌糊涂啊!这不,我就来给你好好扒一扒,看看这...
黑莓平板安卓系统升级,解锁无限... 亲爱的读者们,你是否还记得那个曾经风靡一时的黑莓手机?那个标志性的全键盘,那个独特的黑莓体验,如今它...
安卓文件系统采用华为,探索高效... 你知道吗?最近安卓系统在文件管理上可是有了大动作呢!华为这个科技巨头,竟然悄悄地给安卓文件系统来了个...
深度系统能用安卓app,探索智... 你知道吗?现在科技的发展真是让人惊叹不已!今天,我要给你揭秘一个超级酷炫的话题——深度系统能用安卓a...
安卓系统的分区类型,深度解析存... 你有没有发现,你的安卓手机里藏着不少秘密?没错,就是那些神秘的分区类型。今天,就让我带你一探究竟,揭...
安卓系统铠无法兑换,揭秘无法兑... 最近是不是有很多小伙伴在玩安卓系统的游戏,突然发现了一个让人头疼的问题——铠无法兑换!别急,今天就来...
汽车安卓系统崩溃怎么刷,一键刷... 亲爱的车主朋友们,你是否曾遇到过汽车安卓系统崩溃的尴尬时刻?手机系统崩溃还能重启,但汽车系统崩溃了,...
miui系统可以刷安卓p系统吗... 亲爱的手机控们,你是否对MIUI系统情有独钟,同时又对安卓P系统的新鲜功能垂涎欲滴?今天,就让我带你...