文章目录
- SpringBoot-Maven插件打包的目录结构(jar包)
- 项目中的pom打包配置
第一次部署项目,报错
Action:
Consider revisiting the entries above or defining a bean of type ‘org.redisson.api.RedissonClien’ in your configuration
一看到这个错,第一反应是缺少jar包了。
但是,添加了redisson的包还是报一样的错。。。没有办法了,只能一通百度,奈何百度上都说是缺少包或者启动类没有扫描到。
我这个菜菜,检查发现启动类和包都是对的,就不知所措了
这时候,架构师来了。他一通操作,打断点看redis配置有没有进去,加载redis的启动类数据有没有,检查pom文件,看我的build配置。最后将apollo本地opt中该服务删除,重新打包,apollo本地缓存中没有生成文件。检查了半天,没找到问题。(虽然他最后没找到原因,我还是决定记录下他解决问题的方式,毕竟,我只会百!度!)
架构师运行我的项目,和我本地运行不一样,他的机子上断电调试,根本没有获取到配置的数据。
最后的最后,一个小哥哥帮我找到了问题。
解压jar包,打开BOOT-INF目录下的classes,里面是这样的
有经验的小伙伴可能一眼就看出了问题所在。。。
没有打包资源文件,正常的classes里面应该是
为什么呢?
原因在
pom文件中打包配置资源文件,resourses的路径我写错了,少加了个s!!!!!
build的时候,自然加载不到配置文件。
我居然会犯这么低级的错误
追本求源,我是怎么犯了这个错误的呢
那天,组长让我重新架构这个项目
我很高兴
因为,可以更熟悉springboot+apollo+dubbo+zk这个架构
然后,我开始了漫长的重构之路。
这个依赖是不是可以不用?api里已经有了,就不用了吧~ 这个我要自己敲一遍,加深理解~~~(心里暗自得意,我太认真了)然后,各种错误层出不穷,我开始了漫长的找不同····
最后,项目运行起来了,我以为一切都该归于平静~
没想到,部署上线还有各种bug,每天我都胆战心惊,会出现什么问题,报什么错。架构上,配置上很多东西没有深入理解它的原理,遇到错误,就很慌,不能只会百度啊,有时候百度解决不了问题的
嗯,小白总是要一步步成长的,不经历风雨,怎么见彩虹。
借此机会,了解下jar包各组成部分
SpringBoot-Maven插件打包的目录结构(jar包)
各层含义:
BOOT-INF : 包含classes文件和lib包
- classes目录存放应用程序的代码和一些配置文件。可以理解为repackage将原始Maven打包的jar文件中的除META-INF以外的内容放置到该目录下打包。
- lib下存放应用程序依赖的其他的jar包(pom.xml配置的内容)
META-INF :项目maven参数配置
- pom文件
- 项目中META-INF目录下的配置文件,其中就有apollo中需要的服务名。
- MANIFEST.MF。jar包必要的配置文件。
这里将Main-Class设置成org.springframework.boot.loader.JarLauncher,JarLauncher类会创建一个spring自己的ClassLoader: LaunchedURLClassLoader, 这个classloader 就能通过URL来加载上面BOOT-INF/lib里面所依赖的包,并通过反射里面的start-class里面定义的类,invoke这个类里面的main方法。
org:springboot应用jar加载和启动相关的类
项目中的pom打包配置
<build>
<!--使用springboot-maven-plugin方式打包。若使用maven package打包,缺少项目依赖的jar包-->
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.aaa.aaa.aaa.aaaApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<!--配置资源文件的位置-->
<resources>
<!--本项目将mapper.xml文件和mapper.java放在一起。利用maven打包,就需要加这个配置,把mapper.xml一起放进jar包-->
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>${basedir}/src/main/resources</directory>
<excludes>
<exclude>/**</exclude>
</excludes>
</resource>
</resources>
</build>
<goal>repackage</goal>
作用
- 在原始maven打包形成jar包的基础上,重新进行打包,新形成的jar包不但包含应用类文件和配置文件,而且还会包含应用所依赖的jar包以及Springboot启动相关类(loader等),以此来满足SpringBoot独立应用的特性。
- 将原始Maven打包的jar重命名为XXX.jar.orginal作为原始文件
写在最后
jar包里都没有资源文件,apollo缓存就读取不到配置,有时候却能读取配置。
另外,别的的服务(portal)还能调用这个服务呢,有时候install成功,有时候不成功,不该每次都不成功吗?