springboot实战(3):maven打包详细图解

蓝亚之舟
蓝亚之舟
蓝亚之舟
57
文章
17
评论
2021年4月26日19:06:38
评论
5,227 2982字阅读9分56秒

1、前言

上一章 springboot 实战中已经解决了如何创建 maven 多模块,如何实现父模块与子模块之间的依赖集成以及不同子模块之间的相互调用。

这一章,我们来继续讲述一下 maven 多模块项目如何打包。

2、单模块打包

在聊多模块打包之前,先来谈谈单模块项目打包的流程,新建一个项目 packages,其目录和 pom 文件内容如下:

springboot实战(3):maven打包详细图解

接下来对其进行打包。

2.1 打包流程

springboot实战(3):maven打包详细图解

如上图所示,找到项目右侧 maven 框,找到要打包的模块 packages——》lifecycle——》clean——》package/install/deploy。

其中 clean 是清除项目缓存的,而 package,install 以及 deploy 都有打包的作用,不过略微有些区别:

  • package 命令完成了项目编译、单元测试、打包功能,但没有把打好的可执行 jar 包(war 包或其它形式的包)布署到本地 maven 仓库和远程 maven 私服仓库
  • install 命令完成了项目编译、单元测试、打包功能,同时把打好的可执行 jar 包(war 包或其它形式的包)布署到本地 maven 仓库,但没有布署到远程 maven 私服仓库
  • deploy 命令完成了项目编译、单元测试、打包功能,同时把打好的可执行 jar 包(war 包或其它形式的包)布署到本地 maven 仓库和远程 maven 私服仓库

如果是单模块打包的话,用的最多的是 package,因为没有依赖,其他模块并不需要该模块的依赖包,所以也就不需要部署到本地 maven 仓库,更别说是远程 maven 私服仓库了。

2.2 clean 命令探究

OK,我们来看一下运行 clean 生成的代码:

springboot实战(3):maven打包详细图解

本质的步骤,就是 maven 调用了一个 maven-clean-plugin 的工具,看名字应该是个插件,然后就打包完了。

2.3 package 命令探究

再运行一下 package,这个比较长就不贴图了,直接上代码:

仔细观察上面的代码,可以发现,其中关键步骤就那么几个:

整个 package 步骤经历了:编译(resources,compile),单元测试(testResources,testCompile,test),打包(jar),打包后的清理替换(repackage)四个阶段。

OK,打包完后,依赖包所在目录如下:

springboot实战(3):maven打包详细图解

2.4 install 命令探究

OK,我们再来看看 install 的打包过程:

对比 package 的生成代码,install 只多了一个步骤:

这四行代码很简单,就是执行了 installing 操作,说白了就是复制操作,将刚刚打包好的 packages-0.0.1-SNAPSHOT.jar 依赖包和项目的 pom 文件,复制到本地的 maven 仓库中,我们来看一下复制生成的目录有哪些内容:

springboot实战(3):maven打包详细图解

从目录上来看,并不是单纯的复制,因为还多了几个文件,和我们从 maven 服务器上的中央仓库拉取下来的依赖目录一致,看了使用 installing 十分贴切。

2.5 deploy 命令探究

我们再来看一下 deploy 执行代码:

对比 install 和 package 的执行代码,可以看到相比 package 多了 install 和 deploy 两个命令,相比 install 多了一个 deploy,并且这里 deploy 命令执行的时候报错了:

报错原因,是因为我们并没有在 pom 文件中配置私服仓库,这里要说下什么是私服仓库:

     私服仓库就是远程仓库,另外一台电脑上的 maven 仓库,理论上也可以设置本地的另外一个文件夹为 maven 仓库——可以看做是私服仓库,但是没有意义。在多人团队开发的时候,一般会在一台公共服务器上创建一个 maven 仓库,每个人开发完自己的模块就会使用 git 提交到这台公共服务器,而这台公共服务器的 maven 仓库中会存储团队所有人需要的依赖包,相对于个人来说,自己计算机的 maven 仓库就是本地仓库,公共服务器上的 maven 仓库就是远程私服仓库。

至于如何配置私服仓库,因为暂时用不到这个功能,这里就不写了,配置私服仓库具体可以参考:maven 发布项目到私服-snapshot 快照库和 release 发布库的区别和作用及 maven 常用命令

2.6 问题

问题一:三个命令打的 jar 包一样吗?

答案是一样的,为此我简单验证了一下,验证步骤:简单将项目改成了实战一中 helloworld 项目,依次使用三个命令打成三个 jar 包,依次运行后,发现运行结果都是一样的。

3、多模块打包

如果我们要对多模块项目打包怎么办呢?要知道多模块中一般是存在主模块(其他子模块都是为这个主模块服务,类似 java 类中的主函数),一般情况下都是打包这个主模块,但是如果在多模块中直接打包,会报错,以上面的 springboot-demo 项目为例,报错如下:

springboot实战(3):maven打包详细图解

如上图,报错致命 demo-common 包不存在,因为 demo-admin 是调用了 demo-common 的函数,所以当时将 demo-common 作为依赖包写入了 demo-admin 的 pom 文件中,现在对 demo-admin 打包自然要将其所有依赖包都要打成一个 jar 包,然后才能独立运行。

但是 demo-admin 并没有打包到本地 maven 中,所以会报错找不到。

明白了原理,解决方案也就出来了——既然本地 maven 仓库中不存在,那就让它存在不就好了,现在我能想到的解决方案有两种:

  • 第一种:使用功能 install 或者 deploy 将 demo-common 打包,都能将其 jar 部署到本地 maven 仓库中
  • 第二种:给父模块 springboot-demo 打包,因为其打包类型为 pom,也就是会根据其 modules 罗列出来的所有模块都打包。

第二种方案有个问题,那就是 springboot-demo 采用 package 打包方式行不行?

我们先来看一下父模块的 package 命令代码(本身代表了打包方式为 pom 的命令代码):

可以很清楚地看到,整个流程被分为三部分:

  • 第一步:springboot-demo 打包,打包方式为 pom,基本上没有运行,直接略过了,由此可见,pom 打包本身是个调用,调用子模块的 pom 文件,让它们一次打包;
  • 第二步:demo-common 打包,打包方式为默认的 jar 包,运行包括:resources、compile、testResource、testCompile、test 以及 jar;
  • 第三步:demo-admin 打包,打包方式为默认的 jar 包,运行步骤和第二步一样。

注意:这个打包顺序是按照相互依赖的顺序进行,与 pom 文件写的顺序并不一致。

从上面可以看到,无论是单模块还是父模块,package、install 和 deploy 运行效果都是一样的,所以想要解决依赖问题,必须是运行 install 或者 deploy。

OK,今天就到这里,更多精彩内容关注我的个人网站:蓝亚之舟博客

继续阅读
蓝亚之舟
JavaWeb开发

Vue项目创建详解

1、前提 第一步:安装node.js 什么是nodejs? 简单的说 Node.js 就是运行在服务端的 JavaScript。 Node.js是一个基于 Chrome V8 引擎的 JavaScri...
JavaWeb开发

springboot实战(2):maven多项目模块整合

1、前言 1.1 初衷 本来接下来应该是实战一个登陆页面的,但是感觉每个实战应该可以分开来,这样有个循序渐进的过程,我想的是整合成类似下面的形式: 一个项目中有多个模块,每个模块负责不同的实战内容,相...
idea使用

idea使用(1):依赖包详细图解

1、如何导包 idea 中导包,分为两种,pom 文件导包和手动导包,这里说一下如何 pom 文件导包。 1.1 Maven 仓库 首先,百度 maven,找到对应的仓库(repository)官方网...
weka

idea中集成weka

一、前期准备 1、加入依赖 百度搜索 maven,找到 maven 的 repository 仓库,寻找 weka 的依赖包: 找到稳定版本(我下载 weka 软件的时候就是这个版本,没有犹豫,就是它...

发表评论