2011-08-25 84 views
7

他們似乎是一個問題,當我嘗試在NetBeans模塊中運行JAXB編組器。本來我以爲是節點執行力度,所以我花了幾天的重組一切,但是我仍然recieveing奇怪的錯誤消息Netbeans模塊中的JAXB模塊

javax.xml.bind.JAXBException: ClassCastException: attempting to cast jar:file:/C:/Program%20Files/jmonkeyplatform/ide/modules/ext/jaxb/api/jaxb-api.jar!/javax/xml/bind/JAXBContext.class to jar:file:/C:/Program%20Files/Java/jdk1.6.0_21/jre/lib/rt.jar!/javax/xml/bind/JAXBContext.class. Please make sure that you are specifying the proper ClassLoader.  
    at javax.xml.bind.ContextFinder.handleClassCastException(ContextFinder.java:96) 
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:205) 
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:363) 
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574) 
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:522) 
    at com.spectre.util.JAXBImporterExporter.write(JAXBImporterExporter.java:63) 

我並不完全相信這個問題是進口商/出口商似乎工作中正常的項目和導入程序似乎在分析文件時工作正常,但導出似乎會導致問題。我用出口的方法是

public static <T> void write(T savable, Class<T> type,Object path) { 
     try { 
      JAXBContext jc = JAXBContext.newInstance(type); 
      Marshaller marshaller = jc.createMarshaller(); 
      marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
      if(path instanceof File) 
       marshaller.marshal(savable, (File)path); 
      else if(path instanceof OutputStream){ 
       marshaller.marshal(savable, (OutputStream)path); 
      }else throw new NoSuchMethodException("The Field Path must be of either type File or OutputStream"); 
     } catch (NoSuchMethodException ex) { 
      Exceptions.printStackTrace(ex); 
     } catch (JAXBException ex) { 
      Exceptions.printStackTrace(ex); 
     } 
    } 

任何援助表示讚賞

+0

我發現它似乎是在運行時使用2個不同的類加載器的問題,但我似乎無法找到正確的修復方法。我相信它可以與另一個構造函數幫助,但我似乎無法弄清楚應該包含什麼作爲第一個參數contextPath並將其設置爲空或空字符串似乎會導致和發出 'JAXBContext jc = JAXBContext.newInstance(「 「,JAXBImporterExporter.class.getClassLoader());' – kdgwill

+0

請將回答作爲答案發布,不要放在您的問題中。底部有一個「回答你的問題」按鈕。也沒有必要在標題或其他內容中喊出「ANSWERED」。只要時間成熟,就要接受答案。看,這是一個問答網站,而不是討論論壇或類似原始的東西:) – BalusC

+0

好吧我昨天早上想出了它,因爲沒有人回答或評論所有我認爲這是可以發佈其中一個解決方案以來有人投了個問題 – kdgwill

回答

2

我發現,如果你不是改變的JAXBContext來JAXBContext.newInstane(字符串的contextPath,類加載器加載器)初始化中的類加載器你從當前類接收你的in MyClass.class.getClassLoader()。此外,您也可以使用jaxb.in​​dex而不是模式,它只是您爲與jaxb一起使用而在其相同目錄中使用的類名稱的文本文件列表。他們應該是一個爲每個目錄,但對我來說,他們都在同一目錄。和分隔在相同的字符串在構造函數中的上下文路徑PARAM有:

HERE

3

一個簡單的解決方案是增加對org.netbeans.modules.xml.jaxb.api模塊,該模塊的NetBeans的一部分模塊依賴。這將避免兩個版本JAXB類(JDK中的一個和運行時首選的那個模塊中的第二個)之間的衝突。

+0

這應該是首選解決方案,恕我直言。這似乎是一種更加NetBeans'ish的解決問題的方式,並且可以幫助您擺脫類加載器的束縛。 – peterh

+1

我正面臨同樣的問題。 但是,將org.netbeans.modules.xml.jaxb作爲依賴項添加會導致出現另一個錯誤「模塊對org.netbeans.modules.xml.jaxb有朋友依賴性,但未列爲好友」。根據https://netbeans.org/bugzilla/show_bug.cgi?id=140336只允許其他幾個模塊依賴它。 –

+0

該解決方案適用於我。謝謝! – Spindizzy