本地启动项目能正常运行,但是打成war包部署启动报错如下:
agement-provider/WEB-INF/lib/spring-webmvc-5.2.11.RELEASE.jar]11:40:33.317 [main] ERROR org.springframework.boot.SpringApplication - Application run failed
java.lang.NoSuchMethodError: org.yaml.snakeyaml.constructor.SafeConstructor.<init>(Lorg/yaml/snakeyaml/LoaderOptions;)V
at org.springframework.boot.env.OriginTrackedYamlLoader$OriginTrackingConstructor.<init>(OriginTrackedYamlLoader.java:92)
at org.springframework.boot.env.OriginTrackedYamlLoader.createYaml(OriginTrackedYamlLoader.java:73)
at org.springframework.boot.env.OriginTrackedYamlLoader.createYaml(OriginTrackedYamlLoader.java:69)
at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:162)
at org.springframework.boot.env.OriginTrackedYamlLoader.load(OriginTrackedYamlLoader.java:82)
at org.springframework.boot.env.YamlPropertySourceLoader.load(YamlPropertySourceLoader.java:50)
at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.loadDocuments(ConfigFileApplicationListener.java:632)
at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.load(ConfigFileApplicationListener.java:534)
at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.loadForFileExtension(ConfigFileApplicationListener.java:501)
at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.load(ConfigFileApplicationListener.java:471)
at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.lambda$null$7(ConfigFileApplicationListener.java:450)
at java.lang.Iterable.forEach(Iterable.java:75)
at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.lambda$load$8(ConfigFileApplicationListener.java:450)
at java.lang.Iterable.forEach(Iterable.java:75)
at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.load(ConfigFileApplicationListener.java:447)
问题原因:
java 的类加载机制是把所有不同名称的本类和引用类的包全部加载到内存,这样就有一个问题,如果有两个类名一样怎么办,机器很难区分
类似错误多产生于引入包版本问题,随后查看后面问题SafeConstructor类,全局搜索此class类找到如下:(统称类一,类二)
image.png
第一个类依赖包如下:(错误引入类)
image.png
第二个类依赖包如下:(应该引入类)
image.png
因为本地开发环境是dev,uat环境是test,启动不报错,打包报错,起初以为是环境问题,对比工具找配置,百度相关问题未果,随后发现:是不是本地开发环境有缓存,就清空了本地缓存
image.png
果然本地开发启动也报错,随后调整找寻方向,发现主要原因还是依赖包方法冲突的问题,找到修改版本解决问题的帖子,按照大部分人提供的版本配置,发现并未好用。
最后找到帖子说是大概是加载顺序的问题,我按照相应思路,修改加载顺序如下:
首选找到错误引入类的依赖如下:
<!-- dubbo必须依赖服务 -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-server-standalone</artifactId>
<version>${selenium.version}</version>
</dependency>
其次找到正确类的依赖: 本人是在测试用例中使用的该方法,所以其初并未找到相关snakeyaml类,随后在 pom图谱中搜索定位该类:
image.png
image.png image.png
因为不是直接引入的该类,随后将该类配置在pom文件中
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.26</version>
</dependency>
可是配置后依然报开头错误,我想有没有先后顺序的问题,随后我将该依赖配置放在dubbo的配置文件上方(依赖顺序引入,是否存在加载周期?),发现问题解决。
<!-- 位置先于 org.seleniumhq.selenium -->
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.26</version>
</dependency>
<!-- dubbo必须依赖服务 -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-server-standalone</artifactId>
<version>${selenium.version}</version>
</dependency>
补充:
Dependency Scope <dependency>中还引入了<scope>,它主要管理依赖的部署。目前<scope>可以使用5个值:
compile,缺省值,适用于所有阶段,会随着项目一起发布。
provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。
runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。
test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。
网友评论