maven 多模块打包记

   日期:2020-09-10     浏览:87    评论:0    
核心提示:九月初,炎夏褪去,秋微凉。最近,不知从哪一天开始,早上 5 点钟起床时,天还没亮;晚上不到 7 点,天已黑;四季的车轮,就在人无所察觉中轰隆而过!言归正传,今天介绍一下 maven 多模块打包过程中蹚过的点,昨天耗费一整天的时间,就只玩了一个 `mvn -X clean install` 命令,说多了都是学艺不精交的时间学费,值得反思

背景

九月初,炎夏褪去,秋微凉。最近,不知从哪一天开始,早上 5 点钟起床时,天还没亮;晚上不到 7 点,天已黑;四季的车轮,就在人无所察觉中轰隆而过!

言归正传,今天介绍一下 maven 多模块打包过程中蹚过的点,昨天耗费一整天的时间,就只玩了一个 mvn -X clean install 命令,说多了都是学艺不精交的时间学费,值得反思……

功能描述

近期参与的一个产品,技术组合是 maven 多模块 + SpringBoot 后端 + Vue.js 前端。

前一阵儿略玩了一下单模块的打包,昨天被领导安排去部署整个产品,虽说就是一个在父模块根目录下执行 mvn -X clean install 的事情,也遭遇了三个只有原来打包同事【已成为前同事】才知道的问题,总结一下。

不出意外的话,打包其实是很容易的事情,将各个模块 target 目录下的 moduleName.war 上传服务器的 Tomcat 的 webapps 目录下,重启 Tomcat 即可。工程的 build.xml 脚本将所有目标 war 打包到一个 webapps.zip 文件,直接 unzip 该文件,然后上传即可。

虽然也部署过无数次 web 应用,为避免意外,事先备份了服务器上的 webapps 目录。事实证明,小心驶得万年船,程序员的谨慎意识对后来定位问题起到了决定性作用。

问题一:空白页

部署后,访问项目菜单模块时,出现了 SpringBoot 空白页:

问题排查:将这个工程的 war 包还原为备份版本,访问正常,说明直接原因是 mvn 生成的新包有问题。对比 Tomcat 下的两个工程目录,发现空白页面这个工程的 classes 下没有 static 静态资源文件。

理论上,所有前端代码都应该通过 npm build 打包对应的 SpringBoot 后端工程的 static 目录下的,这个空白页产生大概率是访问不到前端页面文件,难道这个工程没有打包前端?

为什么这个工程没有打包前端文件呢?进入它的 pom.xml 中看:

<id>exec-npm-install</id>
<phase>prepare-package</phase>

没有配置这个预处理动作,导致前端文件缺失。除了它,其他所有前后端分离的模块都有,为什么呢?

一再追问下,前同事都被我的问得不耐烦了,真相竟然是这个模块不需要重新打包替换,所以没有配置前端打包命令。

问题二:axios 请求路径错误

解决了第一个问题后,菜单功能正常了,但是 F12 看到控制台一堆 localhost:8080 请求报 404 ,这个问题早有所闻,因为项目多模块之间没法完全独立,所以通过配置文件设置其他模块的后端请求路径 :

const moduleUrl= {
    md1: 'http://localhost:8080/m1',
    md2: 'http://localhost:8080/m2',
};

export default moduleUrl;

开发环境,不同的后端工程,内置 Tomcat 端口不同,所以配置 moduleUrl 的时候需要注意端口信息;统一发布到一个 Tomcat 目录后,端口是统一的,但是路径中不能用 localhost ,因为这是前端配置,浏览访问 localhost 的时候,视为本机 IP,所以会请求失败。

解决办法:全局路径配置中,区分开发环境和测试环境,开发环境,直接用相对路径:

const moduleUrl= {
    md1: 'http://localhost:8080/m1',
    md2: 'http://localhost:8080/m2',
};

if (process.env.NODE_ENV === 'production') {
  moduleUrl.md1 = 'm1';
  moduleUrl.md2 = 'm2';
}
export default moduleUrl;

问题三:context-path 配置和发布路径不一致问题

最后一个问题,是 SpringBoot 的 servlet:context-path 配置和发布路径不一致导致前端 axios 请求 404 错误。

有一个模块,特立独行,它的模块根路径配置为 / :

# Tomcat
server:
  tomcat:
    uri-encoding: UTF-8
    max-threads: 1000
    min-spare-threads: 30
  port: 8084
  servlet:
    context-path: /

而打包后,该工程为 manager.war ,即部署后,前端应该访问路径是 /manager,但所有的 axios 请求都是相对于根路径的,比如,这个登录请求:

因此前端爆出一堆 404 ,通过对比备份工程和当前工程的网络请求,发现了该问题。

隐藏的这么深,我一个写了半年前端的人,咋可能知道嘛!

启示录

原以为就是放几个 war 包的事情,凭我对 Tomcat 的了解,logs 日志里面没有一个异常,判断部署流程没问题,但是前端页面始终是空白页。鼓足了被讨厌的勇气,追问前同事了十几个问题后,终于搞明白了这个简单部署工作背后要注意的问题。

结论就是,打包真的是个极其考验耐心的工作,耗时又长,稍有问题,就要重来:

  1. mvn -X clean install 一次,顺利的时候,四十分钟,忘记关 FTP 目录,导致 clean 一半失败了,还要重来;
  2. 50M 的破网再直连 VPN 上传 六七个 150MB 左右的文件,90Kb/s 的速度,上传完成半个小时到四十分钟,网速还得看运气;
  3. 重启一次 Tomcat ,5分钟;
  4. 被领导扣扣追问进度 3 次,电话催问两次,总共20分钟;
  5. 对比问题包和正常包,以及想到要去对比来定位问题,这个过程一共经过了一小时。

昨天打包这件事,也让我深刻体会到 IT 行业人员变动的时间成本是多么大呀!这些问题原来负责的人都深切经历过的坑点,没有交接给后来人,后者再经历一次排查,虽然成本都是企业的,但当事人可能是自己。

所以,文档很重要,今天公司产品的 doc 目录下已经多了一份打包注意事项。就让这个问题在我手上终结吧,这就是记录的意义!

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服