【问题标题】:Another odd NoClassDefFoundError on WhiteSpaceProcessorWhiteSpaceProcessor 上的另一个奇怪的 NoClassDefFoundError
【发布时间】:2011-10-14 15:09:13
【问题描述】:

我这几天都在为一个奇怪的问题苦苦挣扎。

只有 一个 我的 web 应用程序的用户在尝试使用某些功能时会收到 NoClassDefFoundError。这是堆栈跟踪:

java.lang.NoClassDefFoundError: com/sun/xml/bind/WhiteSpaceProcessor
    at com.sun.xml.bind.DatatypeConverterImpl._parseInt(DatatypeConverterImpl.java:105)
    at com.foo.bar.webservice.generated.GetLoginsRequest_JaxbXducedAccessor_panelId.parse(TransducedAccessor_field_Integer.java:32)
    at com.sun.xml.bind.v2.runtime.unmarshaller.StructureLoader.startElement(StructureLoader.java:166)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:406)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:384)
    at com.sun.xml.bind.v2.runtime.unmarshaller.InterningXmlVisitor.startElement(InterningXmlVisitor.java:35)
    at com.sun.xml.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:101)
    at com.sun.xml.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:224)
    at com.sun.xml.bind.unmarshaller.DOMScanner.scan(DOMScanner.java:107)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:289)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:272)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:106)
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.unmarshal(Jaxb2Marshaller.java:424)

以一种奇怪的方式,WhiteSpaceProcessor 在类路径上时找不到。 我用tattletale看了一下类的使用位置:

WhiteSpaceProcessor 在类路径中只存在一次:

DatatypeConverterImpl 在类路径中只存在一次

我坚持这样一个事实,即针对不同环境的确切战争是完美的。

工作环境:

  • Windows 机器
  • Tomcat 5.5.28
  • Java 5 (jdk1.5.0.22)

无工作环境:

  • Linux 机器
  • Tomcat 5.5.??
  • Java 5 (jdk1.5.0.22)

我希望有人能把我送到正确的方向。

tomcat 服务器已经重启

【问题讨论】:

    标签: java class exception structure noclassdeffounderror


    【解决方案1】:

    你在工作机器还是非工作机器上使用了 tattletale?

    也许失败的环境在 jre/lib/ext(或类似的扩展目录)中包含一些 jar 文件,并且优先使用“较低”版本?

    编辑:为了更详细地了解可以抛出NoClassDefFoundError 的情况,值得阅读JVM spec, chapter 5。它讲了三种情况:

    • 类对应的资源根本找不到
    • 已找到资源,但与正确的类不对应(尽管在这种情况下,我希望收到包含“错误名称”的消息)
    • 您使用的 Java 版本早于 1.2,并且类文件的主要/次要版本号不受支持。 (这种情况现在抛出UnsupportedClassVersionError。)

    另请阅读section 2.17.5:它指出如果类处于“错误状态”(例如先前的初始化失败,或者存在字节码验证失败),则将抛出NoClassDefFoundError

    现在,如果类的静态初始化程序失败,那么 first 调用者会看到 ExceptionInInitializerError - 但 第二 调用者会看到 NoClassDefFoundError。这是一个简短但完整的程序来证明这一点:

    class Foo {
        static {
            if (true) {
                throw new RuntimeException();
            }
        }
    
        static void foo() {
        }
    }
    
    public class Test {
    
        public static void main(String[] args) {
            try {
                Foo.foo();
            } catch (Throwable t) {
                System.out.println("First exception: " + t);
            }
            try {
                Foo.foo();
            } catch (Throwable t) {
                System.out.println("Second exception: " + t);
            }
        }
    }
    

    现在除非您的系统中的某些东西抑制了ExceptionInInitializerError,否则我希望NoClassDefFoundError 之前的日志中看到它,如果这是问题所在。我仍然认为更有可能您的故障系统正在将一个类加载到扩展类加载器中,然后找不到 ShiteSpaceProcessor 类。

    【讨论】:

    • 我在工作环境上使用它是因为我在非工作机器上没有足够的权限。但是,如果我理解正确,那么路径上的某处一定有一个 jar,它也代表 com/sun/xml/bind/WhiteSpaceProcessor 类?
    • @michel:在类路径中更早的可能还有另一个 jar 文件包含 DatatypeConverterImpl 但包含 WhiteSpaceProcessor。
    • 有道理!我将使用 jarvana 和 jarfinder 查找某个 jar
    【解决方案2】:

    NoClassDefFoundError 表示在类路径中找不到类文件。这意味着无法加载该类。这通常是由于初始化期间的错误,或者更常见的是,类所依赖的 JAR 文件中的版本不匹配。

    例如,您可能针对 XYZ 包版本 1.2 进行编译,并且您的用户安装了 XYZ 版本 1.1。

    【讨论】:

    • 肯定可以表示在classpath中找不到class文件。例如,我刚刚使用 Joda Time 编译了一个程序(它在类路径上)然后尝试在它不在类路径上的情况下运行它,这就是我得到的错误......
    • 我敢打赌,如果您查看异常消息,您会在 WAS 找到的类上遇到该错误,并且发生故障是因为找不到的类无法“加载”参考。
    • 这是可能的,但我仍然认为您的帖子具有误导性,指出异常“不”意味着无法在类路径中找到类文件。它可能不是那个意思,但它可能。
    • 是什么意思,就是找到了命名的类,但是无法加载。总共有大约六种错误原因,包括错误命名的类。
    • 我现在已经查阅了有关该主题的 JVM 规范,并编辑了我的答案以包含我建议您可能提供的那种简短但完整的程序。我仍然认为最可能的问题是确实找不到该课程:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多