问题描述:
springboot搭建的多模块项目,maven管理,由两个模块组成,一个模块(order)依赖另一个模块(user)的jar包,但是依赖模块启动后报错,order模块报错:user下的程序包不存在;找不到符号。
错误复现:
User本身也是一个服务,他的pom文件中的插件设置是这样的。
User可以正常启动服务,并且可以正常install到本地库中。
然后编译Order服务,Order代码依赖User。以下是问题:
打开项目structure,在order的依赖包里也能找到user的jar包,但是看着像个文件夹。说明依赖包被引入了,但是order就是识别不了user里的类。
原因:
Springboot项目打包编译时,会生成两种jar包,一种是普通jar,另一种是可执行jar。这两种jar名称相同,如果不配置,会先生成普通jar,再生成可执行jar。可执行jar会覆盖普通jar。而user无法依赖可执行jar,所以idea可以找到这个模块中的类,但是编译时报错,程序包不存在。
/dayu123/p/16486340.html如何生成不包含依赖包(不可执行的)普通jar包呢?
修改:
如下图,在被依赖的user代码中,依赖的插件里加入exec。
样会生成两个jar包,如下,一个普通的jar,一个可执行(包含了相关依赖)的jar。
重新对被依赖模块clean install,然后对依赖模块clean compile。此时项目成功运行。
结论:
在多模块项目中,如果一个模块a依赖模块b,a和b本身又是微服务,插件如图加上exec,这样既可以生成可执行jar包,又可以生成普通jar包以供其他项目引入。如果b不是微服务,可以直接把插件删掉。