2011-10-14 36 views
1

我現在正在爲一個奇怪的問題而苦惱。WhiteSpaceProcessor上的另一個奇怪的NoClassDefFoundError

只有一個當我嘗試使用某些功能時,我的webapp的用戶得到一個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看類的用法的possitions:

WhiteSpaceProcessor只在類路徑中存在一次: enter image description here

DatatypeConverterImpl只在類路徑中存在一次 enter image description here

我被困在一個事實上,在不同的環境上的確切的戰爭工作是完美的。

工作環境:

  • Windows機器
  • 的Tomcat 5.5.28
  • Java 5中(jdk1.5.0.22)

沒有工作環境:

  • Linux機器
  • Tomcat 5.5。
  • Java 5中(jdk1.5.0.22)

我希望有人能在正確的方向送我。

Tomcat服務器已經重啓

回答

2

你的工作或不工作的機器上使用告密?

也許失敗的環境在jre/lib/ext(或類似的擴展目錄)中包含一些jar文件,並且優先使用「較低版本」的版本?

編輯:只是想進一步瞭解NoClassDefFoundError可以拋出的情況,值得一讀JVM spec, chapter 5。它談論三種情況:

  • 對應類的資源不能在所有
  • 資源發現中找到,但不符合正確的類(雖然在這種情況下我會期望包含「錯誤名稱」的消息)
  • 您使用的是早於1.2的Java版本,並且該類文件具有不受支持的主要/次要版本號。 (這種情況現在拋出UnsupportedClassVersionError。)

而且讀section 2.17.5:它指出如果類處於「錯誤狀態」(例如先前初始化失敗,或出現了一個字節碼驗證失敗),然後NoClassDefFoundError將被拋出。

現在,如果類的靜態初始化失敗,則該第一呼叫者看到一個ExceptionInInitializerError - 但調用方看到NoClassDefFoundError。下面是一個簡短而完整的程序demontrate這樣的:

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類。

+0

我在工作環境中使用它,因爲我在非工作機器上沒有足夠的權利。 但是,如果我理解它是正確的,那麼路徑上的某個地方必須有一個代表'com/sun/xml/bind/WhiteSpaceProcessor'類的jar? – Michel

+1

@michel:在包含DatatypeConverterImpl的類路徑中更早有另一個jar文件,但*不包含WhiteSpaceProcessor。 –

+0

這很有道理!我要用jarvana和jarfinder查找某個jar文件 – Michel

2

的NoClassDefFoundError 意味着該類文件不能在類路徑中找到。這意味着該類不能被加載。這通常是由於初始化期間發生錯誤,或者更常見的原因是該類所依賴的JAR文件中的版本不匹配。

例如,你可能對編制XYZ包版本1.2和您的用戶安裝了XYZ 1.1版。

+0

它當然可以*表示在類路徑中找不到類文件。例如,我剛剛編寫了一個使用Joda Time的程序(在類路徑中使用它),然後嘗試運行它而不在類路徑中,這就是我得到的錯誤... –

+0

我打賭,如果你看在異常消息中,您發現了一個類的錯誤,並且發生了失敗,因爲找到的類由於缺少引用而無法「加載」。 –

+0

這是可能的,但我仍然認爲你的文章是誤導性的,指出異常「不」意味着類文件無法在類路徑中找到。它*可能不是那個意思,但它可能。 –