本系列文章记录了从0开始到实战系统了解 Maven 的过程,Maven 系列历史文章:
(一)5分钟做完 Maven 的安装与配置
在上一篇文章中,我们已经快速的安装并配置好了 Maven 的环境,现在就可以开始将 Maven用起来了,在开始创建 Maven 项目之前,先介绍一个本篇文中涉及到的内容,包括:
接下来,我们就开始吧!
首先,我需要创建一个 Maven 的项目,创建项目的方式多种多样,例如:手动创建 Maven 的目录结构与 pom 文件、使用 Archetype 生成Maven 的项目、或者直接使用 IDE 进行创建。
Archetype 是 Maven 用来初始化项目骨架的插件(Maven 有很多自带的插件,很多时候我们都意识不到自己在使用),由于我们使用的是 Maven3,可以直接运行下面的指令:
mvn archetype:generate
第一次运行这个指令的时候,会从中央仓库中下载插件,所以会看到控制台一长串的输出,直到:
这里的左边那一串数字有点类似于需要使用的 Maven项目目标,右边默认的 1982 指的是maven-archetype-quickstart
,我们可以在控制台中找到它:
如果不需要使用其他模板的话,直接回车即可,接下来回提示输入 groupId
,artifactId
,version
等,这个其实就是生成的 POM 中需要的坐标数据,此处将 groupId 填写为 com.ls.mavendemo
,artifactId 填写为 hello-world
(在下面POM的基本组成中会解释为什么),再一顿回车之后,项目就创建成功了。
在实际的开发中,我们可能更多的会使用IDE来生成 Maven 项目,图形化的界面会更加友好,例如使用 Idea 来创建:
File -> new -> project
然后,就可以输入groupId
,artifactId
,version
几个参数了:
点击Next -> Finish 项目就创建完成了。
忽略掉 .idea
文件夹,上图中的剩余部分就是 Maven 的目录结构了,这种目录结构是 Maven 的规范所规定的,在 src 下面会包含 main
和 test
两个文件夹,两者代表了不同的分工环境:
main
:写功能代码test
:写测试代码在这里面的 java
指的是放置代码的文件夹,同样的在 java
的同级目录下,往往还会有一个 resources
文件夹用于放置项目中使用到的配置文件、模板文件等静态文件,例如:xml、properties等。
打开 pom.xml
,可以看到里面有大概有70多行配置:
4.0.0 com.ls.mavendemo hello-world 1.0-SNAPSHOT hello-world http://www.example.com UTF-8 1.7 1.7 junit junit 4.11 test maven-clean-plugin 3.1.0 maven-resources-plugin 3.0.2 maven-compiler-plugin 3.8.0 maven-surefire-plugin 2.22.1 maven-jar-plugin 3.0.2 maven-install-plugin 2.5.2 maven-deploy-plugin 2.8.2 maven-site-plugin 3.7.1 maven-project-info-reports-plugin 3.0.0
我们先把这个文件改纯净一点,删除一部分内容
build -> pluginManagement
: 里面的内容是Maven会使用到的默认插件,这里不需要进行配置先删除掉。url
: 是建立网站需要的信息,我们现在不需要建站。properties
:是配置的变量,这个常用于统一管理依赖包的版本,后续的文章中会将,这里暂时用不到。下面是清理过后的 pom.xml
文件:
4.0.0 com.ls.mavendemo hello-world 1.0-SNAPSHOT hello-world junit junit 4.11 test
先看一下各个标签的含义:
:POM 的根元素,定义了一些POM相关的规范。
: POM版本号,我们用的是 Maven3 这里只能是4.0.0
:项目的坐标,用于确定一个唯一的项目,下面会详细提到
:当前项目的名称
:当前项目引入的依赖
:单个需要引入的具体的依赖包
:依赖的范围,常见的有 compile
和 test
,不同的范围起到包隔离的作用,这个在后面依赖相关的文章中详细讲在一个三维的空间坐标系中,我们可以通过 x,y,z
三个方向的坐标确定做坐标系上的唯一一个点。
Maven的坐标概念与之类似,在建立Maven仓库的时候我们也可以通过
的值来确定唯一一个构件,下面依次来看看这三者的填写规则。
:指的是当前构建隶属的实际项目,一般是 公司的网址倒序 + 项目名
:一般是指的当前项目中的其中一个模块
:当前项目的版本号以 SpringBoot 为例:
org.springframework.boot spring-boot-starter 2.7.8
org.springframework.boot
就是 Spring 所在公司的 SpringBoot 项目,spring-boot-starter
这个项目的其中一个模块,版本号为2.7.8
。
同理如果我们要引入Web模块,自然就应该是:
org.springframework.boot spring-boot-starter-web 2.7.8
为什么 groupId
不能直接是一个组织呢,要细化到一个项目呢?
一般来说一个公司、组织上不会只有一个项目,如果 groupId
直接占用了组织,那项目名就只有放到 artifactId
中了,但是一个项目也有可能会有过个模块,模块名就没有地方放了。
所以我们在实际开发中创建一个 Maven 项目的时候,可以尽可能的遵守这样的约定。
看到这里,相信大家已经注意到了,上面引入的 SpringBoot 的版本号是 3位数,而自己创建的 hello-world 项目版本号只有 2位,并且后面还有一个 SNAPSHOT。
Maven 的版本号规则实际上也是业界的通过规则,它的定义方式如下:
{主版本号}.{次版本号}.{增量版本号}-{里程碑版本}
SNAPSHOT
,alpha
,beta
,release
,GA
等。SNAPSHOT
的为开发版,此时会存在大量的代码变动,alpha
和beta
分别对应的是内测版与公测版这三个版本都是属于不稳定版本,使用的时候非常容易踩坑,所以一般只用的demo体验,在正式环境中不能使用。release
和GA
都属于是稳定的正式版本,可以在正式环境中使用。下面是SpringBoot的一些版本号,可以体验一下:
这里需要再提一嘴,SNAPSHOT
在 Maven仓库中有特别的含义,处于这个里程碑版本的项目可以多次install
到仓库中,每一次都会覆盖前一次生成的包,但是非 SNAPSHOT
的版本是不能覆盖的,每次install
都需要修改版本号。
如果不理解这段话,可以继续关注后续的文章,会讲到如何将项目打包到本地仓库以及推送到私服中。
我们在开发完代码之后,需要将代码打包到测试环境中测试,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.plugins maven-shade-plugin 3.2.4 package shade com.ls.mavendemo.App
在 mainClass
中指定需要运行的类的全类名
再次重试打包运行,运行成功。
本篇讲述了如何使用 Maven 自带的插件以及IDE 创建、打包、运行项目,同时介绍了 pom.xml 文件的基本组成,以 SpringBoot为例,介绍了坐标和版本号的使用规则。
到目前为止,已经可以使用Maven来进行一些简单的开发工作了,但距在公司中与同事一起协作开发较大的项目还有一定的差距,可以继续关注本专题的后续文章。
下一篇将会讲述 Maven 仓库的使用以及 Maven 私服的安装和使用。
如果觉得本文有帮助的话,可以帮忙点点赞哦!