在 Apache Maven 出现之前,Java 程序员可能按自己的喜好来定义程序的目录结构,这样造成的结果是:不同的开发人员、不同项目之间,程序的文件结构可能差异比较大,甚至配置文件的命名和放置位置,可能都差异甚大。而 Maven 则对程序结构做了规范约定,因此不管是哪个开发团队、那个项目,只要是用 Maven 来管理的,它们的目录结构基本上是一致的。这样的好处很多,减免混乱,减少开发人员之间的沟通和研究,当然也减少了出错的机会。
1、Maven 的代码结构
现在看我们上一篇文章所生成 HelloWorld 程序的框架代码的目录结构。
【图 2-1 代码框架目录结构】
这里有一些 IDEA 所独有的文件我们可以忽略它,如:.idea 目录、.mvn 目录、.gitignore、HELP.md。重点关注下面这些文件和目录:
src 目录:与源代码相关的所有文件放这里。
target 目录:上图没有显示此目录,因为还没有编译程序,Maven 编译程序后,把编译出来的所以相关文件都放在 target 目录。
src\main 目录:存放程序的主体文件,包括源代码和资源文件,如配置文件、图片等。
src\main\java:顾名思义,这里是放 Java 源代码。
src\main\Resources:放各种配置文件,如 XML 文件,Properties 文件、视图、静态图片等。
src\test 目录:存放测试相关的文件
src\test\java:存放单元测试的 Java 源代码
src\test\Resources:存放单元测试相关的各种配置文件。
HelloWorld.iml,这是 IntelliJ IDEA 的模块文件,存储了有关的开发模块。
上图中最后一个文件 pom.xml 是非常重要的文件,POM 是 Project Object Model 的首字母简写,代表“项目对象模型”,它是一个 Maven 项目的 XML 表示,该 Maven 项目保存在一个名为 pom.xml 的文件中。 Maven 站在哲学意义的高度去看待项目,认为项目不仅仅只是包含代码的文件集合。 一个项目包含以下这一切内容:配置文件,所涉及的开发人员和他们所扮演的角色,缺陷跟踪系统,组织和许可,项目所在的URL,项目的依赖关系,以及所有其它在代码生命周期中起作用的部件。 POM 就像是一个有关项目的一站式商店。事实上,在 Maven 的世界中,项目根本不需要包含任何代码,而只需要一个pom.xml。
2、pom.xml 的内容解释
现在,我们就来看我们项目中的这个 pom.xml 的内容。
【图 2-2 pom.xml 的内容】
这是一个 XML 文件,代码的首行是 XML 头,指定此 XML 文件的版本号和编码方式,版本是 1.0,编码方式为 UTF-8。
接下来是 project 元素,它是此文档的根节点,它还声明了一些 POM 相关的命名空间及 xsd 元素
根元素下的第一个子元素 modelVersion 指定了当前 POM 模型的版本为 4.0.0。
接下来是 parent 元素,它定义了此项目所继承的项目,其下有三个主要的节点,groupId、artifactId、version,此三元素简称 GAV,是项目基本的坐标。在 Maven 中,任何的 pom、jar、war 都是以 GAV 坐标来定位和区分的。
groupId 定义了项目所属的组,如公司或组织中的某一个团队小组,例如 parent 元素里的 groupId org.springframework.boot 可以简单理解为 “org.springframework” 代表一个组织,“boot ” 代表是该组织下面的 Spring Boot 小组。
artifactId 定义了项目在组(groupId)中唯一的 ID,一个组(groupId)下面可能有很多项目,这不同的项目用 artifactId 来区分。Spring Boot 下面有很多项目,此处,我们用到的是“spring-boot-starter-parent”。
从这里也可以看出 Spring 的命名规范,groupId 用 “.” 分割,artifactId 用 “-” 分割。
version 则是版本号。
parent 元素后面又重新出现了 GAV,这次的 GAV 才是本项目的坐标。
这里的默认生成的版本号是 0.0.1-SNAPSHOT,SNAPSHOT 表示开发中的版本,以后若正式发布时才把 SNAPSHOT 给去掉。
接下来 name 元素声明了一个对于用户更为友好的项目名称,尽管它不是必须的,但还是建议为每个项目声明 name 以方便信息交流。
description 是项目的详细描述。
properties 定义项目的一些属性,这里有一个子标签 java.version 把编译运行的 Java 版本定义为 11。
接下来 dependencies 元素是重点。一般来说,一个 Java 程序会运用到很多 jar,现在这些 jar 都放在 Maven 仓库中,项目就在 dependenies 元素中定义这些 jar 的 GAV 坐标。当编译的时候,Maven 会自动将所引用到 jar 下载下来。项目的依赖,就在这里定义。
我们仔细看其中一项 dependency,说好的 GAV 三维坐标,现在怎么只有 GA 二维呢, Version 这一维哪里去了?
回头看我们前面定义的 parent 元素,它的 version 是 2.5.3,那么在 dependencies 中定义的依赖如果没有提供 version,就会用 parent 的 version。Parent 本来就是被用来继承的,所以在 dependencies 中定义的几个 Spring Boot 的相关依赖,都是用的 version 2.5.3,并且避免了重复,不用在每一项依赖中都重复 version 为 2.5.3。其实也好理解,我们用的是同一个 Spring Boot 版本,让我写一次版本号就好了嘛,不要让我重复写。
最后一个是 build (编译属性设置)下面的 plugin 插件。在 Maven 是世界中,一切功能都是插件,Spring Boot 给 Maven 开发了一个插件 spring-boot-maven-plugin,这个项目中把它引进来,就可以执行 Maven 命令来启动 Spring Boot 程序,命令如下 (注意冒号前后不要有空格):
mvn spring-boot:run
在命令行模式下,进入 pom.xml 所在目录,执行命令“mvn spring-boot:run "后,mvn 会运行次程序,并启动 Tomcat。
3、IDEA 下 使用 Maven
JetBrains IntelliJ IDEA 中如何使用 Maven 的工具呢?我们先来配置一下 Maven。
首先,安装 Maven 很简单,去官方把 Maven 包下载下来,然后解压都某个本地目录即可,如本人解压在 D:\JavaTools\apache-maven-3.6.3 。
点击 File | Settings...,或者按快捷键 Ctrl + Atl + S 打开“设置”窗口。
在如下设置窗口中选择 Build, Execution, Deployment | Build Tools | Maven
设置 Maven Home Path 为自己的 Maven 安装目录,如本人的 D:\JavaTools\apache-maven-3.6.3 。
User settings files 是 Maven 的配置文件。
Local repository 是 Maven 的本地存储目录,从远程仓库中下载下来的各种 pom、jar、war 等文件会存储在这里。
上面这些准备工作都做好之后,我们可以正式在 IDEA 中使用 Maven 了。
一旦 IDEA 打开了一个 Maven 项目,点击最右侧的 “Maven” 字符来打开或关闭 Maven 面板。打开面板后,在项目名称(这里是HelloWorld)| Lifecycle 可以看到 Maven 的功能列表,一般常用到的是圈起来的 clean、package、install。
clean:清空本地的编译信息。
package:把编译的结果打包成 jar、war 等。
install:执行编译,然后发布到本地 Maven 仓库,其它项目若需要可以拉取。
飞仙写的第二篇 Spring Boot 就到这里停笔,之后飞仙会继续写 Spring Boot 。
技术不会辜负人,只有人辜负了技术;
青春不会辜负人,只有人辜负了青春;
岁月不会辜负人,只有人辜负了岁月。
Enjoy Coding.