文章目录

  • SpringBoot-Maven插件打包的目录结构(jar包)
  • 项目中的pom打包配置



第一次部署项目,报错

Action:

Consider revisiting the entries above or defining a bean of type ‘org.redisson.api.RedissonClien’ in your configuration


用java启动jar java代码启动jar包_用java启动jar


一看到这个错,第一反应是缺少jar包了。

但是,添加了redisson的包还是报一样的错。。。没有办法了,只能一通百度,奈何百度上都说是缺少包或者启动类没有扫描到。

我这个菜菜,检查发现启动类和包都是对的,就不知所措了

这时候,架构师来了。他一通操作,打断点看redis配置有没有进去,加载redis的启动类数据有没有,检查pom文件,看我的build配置。最后将apollo本地opt中该服务删除,重新打包,apollo本地缓存中没有生成文件。检查了半天,没找到问题。(虽然他最后没找到原因,我还是决定记录下他解决问题的方式,毕竟,我只会百!度!)

架构师运行我的项目,和我本地运行不一样,他的机子上断电调试,根本没有获取到配置的数据。

最后的最后,一个小哥哥帮我找到了问题。

解压jar包,打开BOOT-INF目录下的classes,里面是这样的


用java启动jar java代码启动jar包_maven_02

有经验的小伙伴可能一眼就看出了问题所在。。。

没有打包资源文件,正常的classes里面应该是


用java启动jar java代码启动jar包_jar_03

为什么呢?

原因在

pom文件中打包配置资源文件,resourses的路径我写错了,少加了个s!!!!!
build的时候,自然加载不到配置文件。
我居然会犯这么低级的错误

追本求源,我是怎么犯了这个错误的呢

那天,组长让我重新架构这个项目

我很高兴

因为,可以更熟悉springboot+apollo+dubbo+zk这个架构

然后,我开始了漫长的重构之路。

这个依赖是不是可以不用?api里已经有了,就不用了吧~ 这个我要自己敲一遍,加深理解~~~(心里暗自得意,我太认真了)然后,各种错误层出不穷,我开始了漫长的找不同····

最后,项目运行起来了,我以为一切都该归于平静~

没想到,部署上线还有各种bug,每天我都胆战心惊,会出现什么问题,报什么错。架构上,配置上很多东西没有深入理解它的原理,遇到错误,就很慌,不能只会百度啊,有时候百度解决不了问题的

嗯,小白总是要一步步成长的,不经历风雨,怎么见彩虹。

借此机会,了解下jar包各组成部分

SpringBoot-Maven插件打包的目录结构(jar包)


用java启动jar java代码启动jar包_spring boot_04

各层含义:

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> 作用

  1. 在原始maven打包形成jar包的基础上,重新进行打包,新形成的jar包不但包含应用类文件和配置文件,而且还会包含应用所依赖的jar包以及Springboot启动相关类(loader等),以此来满足SpringBoot独立应用的特性。
  2. 将原始Maven打包的jar重命名为XXX.jar.orginal作为原始文件

写在最后

jar包里都没有资源文件,apollo缓存就读取不到配置,有时候却能读取配置。
另外,别的的服务(portal)还能调用这个服务呢,有时候install成功,有时候不成功,不该每次都不成功吗?