运行Logstash插件时遭遇java.lang.NoSuchMethodError问题求助
问题分析与解决方案
这问题我之前帮人排查过,核心原因就是Logstash内置的Jackson库版本和你的Java jar包依赖的Jackson版本不匹配,导致了类路径冲突,进而出现NoSuchMethodError。
为什么会出现这个问题?
com.fasterxml.jackson.databind.node.JsonNodeFactory.numberNode(Ljava/math/BigDecimal;)这个方法是Jackson在特定版本才新增的(比如Jackson 2.7及以上版本)。- Logstash 5.6.x本身自带了一套Jackson库,而且它的类加载机制会优先加载自己内置的依赖,而非你插件jar包里的版本。如果Logstash内置的Jackson版本比你Java程序依赖的版本旧,就会找不到这个新增的方法。
- 你在独立JRuby或本地JRuby实例里运行没问题,是因为那些环境里用的是你jar包自带的Jackson版本,没有版本冲突。
怎么验证这个猜想?
你可以去Logstash的安装目录里查看内置的Jackson版本:
ls ../../logstash-5.6.7.freshinstall/vendor/bundle/jruby/2.3.0/gems/logstash-core-5.6.7/vendor/jars | grep jackson
然后对比你Java程序的pom.xml(或build.gradle)里依赖的Jackson版本,就能确认版本是否不一致。
解决办法
这里有几个可行的方案,按推荐程度排序:
- 对齐Jackson版本:把你的Java程序依赖的Jackson版本改成和Logstash内置的版本完全一致。这样从根源上避免版本冲突,是最简单稳妥的办法。
- 使用Shade插件重打包:如果没办法修改Jackson版本,可以用Maven Shade Plugin(或Gradle的Shadow Plugin)把Jackson相关的类重新打包,修改它们的包名(比如把
com.fasterxml.jackson改成your.package.shaded.com.fasterxml.jackson)。这样你的jar包里的Jackson类就会和Logstash内置的完全隔离,不会冲突。 - 调整Logstash类加载策略(不推荐):Logstash有一套类加载规则来隔离插件依赖,但修改起来比较复杂,容易引发其他问题,除非前两种方法都不可行,否则不建议尝试。
内容的提问来源于stack exchange,提问作者TokyoMike
相关产品推荐
相关产品推荐

