【问题标题】:IncompatibleClassChangeError while starting the my application启动我的应用程序时出现 IncompatibleClassChangeError
【发布时间】:2019-03-18 10:48:26
【问题描述】:

当我尝试在 Amazon Linux 机器上启动我的应用程序时遇到以下错误。

Caused by: java.lang.IncompatibleClassChangeError: class com.google.common.cache.CacheBuilder$3 has interface com.google.common.base.Ticker as super class
        at java.lang.ClassLoader.defineClass1(Native Method)

【问题讨论】:

    标签: java maven deployment guava


    【解决方案1】:

    该错误意味着CacheBuilder 的字节码期望Ticker 是一个Java 类,但它是一个接口。

    您在类路径上有两个版本的 Guava,或者您正在使用与您之前构建的不同版本的 Guava 启动应用程序。

    尝试mvn dependency:tree 并查找重复项。如果看起来不错,请在 VM 上运行应用程序时检查类路径。

    在极少数情况下,有人可能很“聪明”并将com.google.common.base.Ticker(或CacheBuilder)的字节码复制到他们的JAR 中。尝试对所有 JAR 进行文本搜索以查找候选对象或编写一个单元测试来打印

    的结果
    getClass().getClassLoader().getResources("com/google/common/base/Ticker.class");
    

    查看谁喜欢贡献(应该只返回一个 URL)。如果可行,请对 CacheBuilder 执行相同操作。

    【讨论】:

    • 我的类路径有两个版本的 Guava。一个是 jersey-Guava-2.22.2 和 guava-16.0.1 。我尝试删除以前的,仍然面临同样的问题。当我尝试文本搜索时,我发现这两个番石榴版本都有股票代码类。接下来我可能会做什么。
    • @AnuragAnand 那么请接受我的回答 (stackoverflow.com/help/someone-answers)
    • 感谢您的回复,但我仍然对我的问题持开放态度,我期待一些意见。肯定会接受您的回复,这显然很有帮助..
    • @AnuragAnand 查看 ZIP 档案中的文件名(任何 ZIP 工具都可以查看 JAR 文件)。据我所见,Jersey 包含 Ticker 但包名称不同。这不会引起问题。再次尝试搜索以查看哪些 JAR 包含 com/google/common/cache/CacheBuilder.class
    • @AnuragAnand 在某个时间点,Guava 将 Tickerinterface 更改为 abstract class。见github.com/google/guava/commit/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    相关资源
    最近更新 更多