jar包升级以及依赖冲突解决思路(小白入门级)

最近工作接了一个坑,要做一个项目的组件版本升级,就是maven项目通过pom.xml文件管理的jar包,之前没有过这方面的工作经验,在这里记录一下遇到的问题,以及自己简单的经验。

1.第一步肯定是要去maven仓库里找到自己要升级的版本了,可能是指定你升级到哪个版本,或者是让你做一些漏洞升级,没有给你指定版本,这就更要去仓库里找到自己需要的版本号了。maven仓库地址。在这里直接搜自己想要查找的jar即可。

2.找到自己需要升级的jar包版本之后,肯定是要把目前项目里的jar包版本给删掉,这里推荐一个idea插件,可以看我这篇博客。可以看下图:
1
3.引入新版本的jar包之后,要看一下有没有冲突,看jar包冲突也可以通过上面说的那个插件,因为新引入的jar包里可能又引用了很多其他的jar包,这些jar包和你项目里已经有的jar包存在冲突,这时候解决一下。可以看下图:
2
4.引入新版本的jar包,在编译运行测试之前还要看一下这个包依赖其他包的版本是什么,去到maven仓库搜一下你要找的jar包,然后找到你需要的版本点进去如下图,但是这个仅供参考,如果升级jar报遇到了问题没有什么头绪,可以看一下是不是需要依赖的jar包版本问题。

3

5.最后肯定是要编译运行项目,然后测试一下,这没什么说的,但是这就是我遇到的第一个坑,这项目本地不能启动,所有测试修改的过程都要拿到服务器上去做,而且打war包,和上传要通过公司的一个系统去做(慢的要死),在这之前还要经过代码审计,开软扫描。唉!

如果是批量的组件升级,我觉得一个一个升级去做好一些,问题也好定位,下面说一下我在升级的时候遇到的一些问题:
1.Not running on Jetty, JSR-356 support unavailable

[org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer@d3a9b786] ServletContainerInitializer(位于以下应用程序 [portal-app] 中)在调用 onStartup 方法时发生了以下错误:[javax.servlet.ServletException: Not running on Jetty, JSR-356 support unavailable        at org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer.onStartup(WebSocketServerContainerInitializer.java:183)

遇到这个问题其实也是个jar包冲突问题,主要是应用中的websocket包与应用服务器自身带的实现冲突了,你的项目里websocket相关的包要排除一下,像上面的报错就去项目里 Ctrl+n(idea快捷键) 搜一下WebSocketServerContainerInitializer这个类,就要把这个类所在的jar包给排除。
这里是解决这个问题我参考的文章:https://blog.csdn.net/YuLimin/article/details/125785007

2.java.lang.NoSuchMethodError: org.yaml.snakeyaml.LoaderOptions.setAllowDuplicateKeys(Z)V

java.lang.NoSuchMethodError: org.yaml.snakeyaml.LoaderOptions.setAllowDuplicateKeys(Z)V
        at org.springframework.boot.env.OriginTrackedYamlLoader.createYaml(OriginTrackedYamlLoader.java:69) ~[spring-boot-2.2.2.RELEASE.jar:2.2.2.RELEASE]
        at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:132) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE]
        at org.springframework.boot.env.OriginTrackedYamlLoader.load(OriginTrackedYamlLoader.java:75) ~[spring-boot-2.2.2.RELEASE.jar:2.2.2.RELEASE]
        at org.springframework.boot.env.YamlPropertySourceLoader.load(YamlPropertySourceLoader.java:50) ~[spring-boot-2.2.2.RELEASE.jar:2.2.2.RELEASE]

大概就是个这样的报错,NoSuchMethodError这个报错在做jar包升级的时候应该会经常遇到,这是典型的jar包冲突了,从报错信息可以看出这是snakeyaml包里的LoaderOptions这个类和其他包里的类重名了导致出现了这个冲突,出现了这个报错就找到报错定位到的类,Crtl+n搜一下这个LoaderOptions,把出现这个类名的其他jar包给排除掉,我这里遇到的冲突包是jruby-complete-1.0.0.jar和jruby-cloudera-1.0.0.jar这两个,把这两个排除掉就可以了。
参考博客:https://codeleading.com/article/45836032600/

3.java.lang.NoClassDefFoundError: io/netty/util/AsciiString

java.lang.NoSuchMethodError: io.netty.handler.codec.http.HttpResponseStatus.codeAsText()Lio/netty/util/AsciiString;
	at io.netty.handler.codec.http2.Http2ConnectionHandler.<clinit>(Http2ConnectionHandler.java:72)
	at io.grpc.netty.NettyClientTransport.start(NettyClientTransport.java:174)
	at io.grpc.internal.ForwardingConnectionClientTransport.start(ForwardingConnectionClientTransport.java:29)
	at io.grpc.internal.InternalSubchannel.startNewTransport(InternalSubchannel.java:202)
	at io.grpc.internal.InternalSubchannel.obtainActiveTransport(InternalSubchannel.java:175)
	at io.grpc.internal.ManagedChannelImpl$SubchannelImplImpl.obtainActiveTransport(ManagedChannelImpl.java:813)
	at io.grpc.internal.GrpcUtil.getTransportFromPickResult(GrpcUtil.java:578)
	at io.grpc.internal.DelayedClientTransport.reprocess(DelayedClientTransport.java:280)
	at io.grpc.internal.ManagedChannelImpl$LbHelperImpl$5.run(ManagedChannelImpl.java:719)
	at io.grpc.internal.ChannelExecutor.drain(ChannelExecutor.java:72)
	at io.grpc.internal.ManagedChannelImpl$LbHelperImpl.runSerialized(ManagedChannelImpl.java:710)
	at io.grpc.internal.ManagedChannelImpl$NameResolverListenerImpl.onAddresses(ManagedChannelImpl.java:759)
	at io.grpc.internal.DnsNameResolver$1.run(DnsNameResolver.java:176)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)


NoClassDefFoundError这个报错也是jar包冲突导致会经常遇到的报错,目前我了解到这个报错有两种方式会出现,一个是对ing的jar包你做过升级或者降级处理,导致你现在用的这个版本里io/netty/util这个路径下没有AsciiString这个类,导致出现报错。针对这种情况,最简单的就是在你们公司允许的范围内找到一个该路径下包含这个类的版本了。另外一种情况就是另一个jar包同样包含io/netty/util这个路径,但是这路径下没有AsciiString这个类,你的项目里引用的就是这个jar包,这种情况就是要做一下jar包排除了,我是遇到了第一种情况,做了jar包降级。
参考博客:https://blog.csdn.net/jxm007love/article/details/84350242

4.java.lang.NoSuchMethodError: com.fasterxml.jackson.core.JsonGenerator.writeStartArray(Ljava/lang/Object;I)V
这又是一个NoSuchMethodError错误,还是去找一下JsonGenerator这个类是不是存在冲突,或者当前这个版本的jar包有没有这个类,这个类里有没有这个方法。我是jackson-databind包做了降级,还有的博客里说的是 jackson-core,jackson-databind,jackson-annotations 这三个包的版本没有对应上导致的,可以看一下下面的这个博客。
参考博客:https://blog.csdn.net/qq_26898033/article/details/129367216

上面就是我总结的升级jar包的经验和遇到的一些问题,仅供没有这方面的工作经验但是又遇到了这样不得不做的工作小白一些参考。
不得不吐槽一下这个项目,启动时候遇到了一个问题,解决了一天,想了各种各样的方法,都不能解决,最后试了一下master分支的代码竟然也不能运行成功,合着根本不是我这导致的问题,去找之前的负责人说,他喵的竟然告诉我遇到问题就解决问题,你挖的坑我来给你填是吧,肯定不能惯着这sb,最后一排查说是一段代码给注释掉了,垃圾项目,垃圾人。这项目奇葩的地方还不止这些,部署的时候不能全量部署,什么意思呢,就是你打完包之后,不能把所有class文件都替换了,你改了哪个class文件,就把哪个替换了,lib包也是一样,这都是什么奇葩啊,什么奇葩人想出来的奇葩方法。

“是不是一定要有所失,才能有所悟”

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐