2011-08-25 14 views
7

彼らは、netbeansモジュールでJAXBマーシャラーを実行しようとすると問題があるようです。もともと私は問題が輸入/輸出で動作しているようであるかを正確にわからない私は、しかし、私はまだ奇妙なエラーメッセージJAXB in Netbeans Module

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) 

をrecieveingたすべてのものを再編成数日を過ごしたので、それはノードimplimentationだと思いました通常のプロジェクトであり、輸入者はファイルを解析する際に問題なく動作するように見えますが、輸出によって問題が発生するようです。私は、輸出に使用する方法は、私があなたの代わりにJAXBContext.newInstaneにJAXBContextのの初期設定を変更した場合ことがわかった(文字列のcontextPath、クラスローダローダ)クラスローダれるどのような援助が

+0

私は、実行時に使用されている2種類のクラスローダーで問題があるようですが、適切な修正が見つからないようです。私はそれが別のコンストラクタで助けることができると信じていますが、最初のparamater contextPathとして何を含めるべきかを把握することができず、nullまたは空文字列に設定すると、問題が発生しているようです 'JAXBContext jc = JAXBContext.newInstance "、JAXBImporterExporter.class.getClassLoader()); ' – kdgwill

+0

回答を回答として掲示してください。あなたの質問には載せないでください。下に「あなたの質問に答える」ボタンがあります。また、タイトルや何かに「答えました」と叫ぶ必要はありません。時間が熟ればいつでも答えをマークするだけです。これはQ&Aサイトであり、ディスカッションフォーラムやそれ以外の原始的なものではありません:) – BalusC

+0

私は昨晩早くそれを理解しました。誰も答えなかったかコメントして以来、解決策の1つを投稿するのは大丈夫です誰かが質問を投票しました – kdgwill

答えて

2

を高く評価している

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); 
     } 
    } 

です現在のクラス、つまりMyClass.class.getClassLoader()から受信します。また、スキーマの代わりにjaxb.in​​dexを使用することもできます。jaxb.in​​dexは、同じディレクトリにあるjaxbで使用するために拡張したクラス名のテキストファイルリストです。彼らは私のために彼らがすべて同じディレクトリにどこにもかかわらず、各ディレクトリのために1つでなければなりません。そして、で、コンストラクタのコンテキストパスのparamで同じ文字列で区切ら:

HERE

3

簡単な解決策は、NetBeansの一部であるorg.netbeans.modules.xml.jaxb.apiモジュールにモジュールの依存関係を追加することです。これにより、2つのバージョンのJAXBクラス(JDKの1つとランタイムで優先されるそのモジュールの2つ)の間の衝突を避けることができます。

+0

これは、IMHOの推奨解決策になるはずです。これはNetBeansの問題を解決するためのより多くの方法であり、クラスローダーの手間を省くことができます。 – peterh

+1

私は同じ問題に直面しています。 しかし、org.netbeans.modules.xml.jaxbを依存関係として追加すると、「モジュールはorg.netbeans.modules.xml.jaxbに友人依存関係がありますが、友人としてはリストされません」という別のエラーが発生します。 https://netbeans.org/bugzilla/show_bug.cgi?id=140336によれば、いくつかの他のモジュールだけがそれに依存することが許されています。 –

+0

この解決策は私のために働いた。ありがとう! – Spindizzy