Skip to content

Commit

Permalink
new posts
Browse files Browse the repository at this point in the history
  • Loading branch information
TangMisaka23001 committed Dec 15, 2023
1 parent 5190100 commit 5fec6ef
Showing 1 changed file with 37 additions and 0 deletions.
37 changes: 37 additions & 0 deletions source/_posts/2023/start-aliyun-maven-problem.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
---
title: 阿里云原生应用脚手架攀爬事故小记
mathjax: false
date: 2023-12-15 11:45:14
categories: [技术]
tags: [maven, Spring]
---
## 起源
这个事故来源于某个PHPer转职Javaer时发生的灵异事件,在[云原生应用脚手架](https://start.aliyun.com/)中选择了应用架构为MVC架构之后生成的脚手架打包的jar包启动之后无法访问Controller中配置的路径。

## 现象
据某PHPer所说,在IDEA中直接启动项目没有问题但是打包成jar之后就访问不到controller中定义的请求路径了。

## 第一次排障
面对这个bug的第一直觉就是maven打包有问题,应该是代码没有打包进去。但是在解压jar包之后发现代码确实已经在lib文件夹里,而且解压之后也能找到对应的class文件。

这时候怀疑对象就转到了spring bean装配有问题上,于是便使用ApplicationContext的getBean方法尝试在spring启动完成之后获取basicController的bean,然后发现果然是bean并没有成功装载。

于是死马当活马医的给启动类加上了@ComponentScan注解尝试抢救一下,结果抢救失败仍然没有装载。

这时候已经是万策尽放弃治疗了,直接劝退了PHPer。

## 第二次排障
一天之后这个bug迎来了专家会诊,某Java领域大神准备对其进行一番操作,但是失败了。于是又将项目clone下来看了一看,因为病因是IDEA启动时可以正确加载而maven打包之后有问题,于是又将嫌疑人锁定到了maven上,但是根据本人浅薄的maven知识并没有发现配置有任何有问题的地方。

于是又开始死马当活马医,准备使用SPI机制给spring强制注入bean试试。在spring.factories文件中配置`org.springframework.boot.autoconfigure.EnableAutoConfiguration`为controller之后发现IDEA正常启动。但是maven打包时springboot启动直接报错:找不到该class文件。

嗯,有错误是好事,说明并不是spring装配的时候有问题而是项目启动时根本没有这个class的文件。这时候随便找了一个自己项目里的SDK jar包解压看了一下目录,又看了一下多模块中web模块的jar包:`BOOT-INF`。凶手已经找到了。

## 破案
按照配置给web模块和service模块增加了`<skip>true</skip>`配置,跳过了springboot打包插件,项目正常启动并可以访问请求路径。

很明显,在创建模板的时候pom.xml直接被复制了三份放到了三个模块当中,导致了spring-boot-maven-plugin插件把三个子项目都打包成了可部署的jar包。

一开始解压jar包的时候并没有关注到这个细节导致多次抢救无效。

令人疑惑的是 https://github.com/alibaba/cloud-native-app-initializer/issues/65 官方仓库里竟然有这种issue,但是`<skip>true</skip>`在最外层完全是反作用导致打包失败,而内部web模块明明需要这个配置缺没有填写。属实神秘。

0 comments on commit 5fec6ef

Please sign in to comment.