5

XMLドキュメントの解析を含むJira用のプラグインを書いています。私はこれを行うためにJAXBを使用しています(XMLからpojoへ、またはその逆)。したがって、JAXBを使用してpojoからXMLを生成するクラスがあります。のように見えます...

import javax.xml.bind.*;

Class Parser {
  public void m1() {
    ...
    // code which uses classes in javax.xml.bind.*
  }

  public static void main(String args[]){
   Parser p=new Parser();
   p.m1();

  } 
}

上記のパッケージには、JDKディストリビューション(rt.jar)が付属しています。だから私はクラスを実行するために他に何も中継していません。

'java'を使用してコマンドラインから起動すると、正しく機能しています。しかし、それをjarとしてパッケージ化し、プラグインとしてJiraに配置すると、次のエラーで失敗します。

javax.xml.bind.JAXBException: Provider com.sun.xml.bind.v2.ContextFactory not found
 - with linked exception:
[java.lang.ClassNotFoundException: com.sun.xml.bind.v2.ContextFactory]
        at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:152)
        at javax.xml.bind.ContextFinder.find(ContextFinder.java:299)
        at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:372)
        at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:337)

これは同じマシン上にあります。私が見ることができる唯一の違いは、コマンドラインからの起動とは異なります。Jiraにデプロイした場合、インスタンス化によってmain()ではなくm1()を呼び出します。

何が起こっているのだろうか!同じマシン上にあります。Jiraがアプリケーションを起動する方法がわかりません(コマンドラインから起動しているため)。

4

3 に答える 3

6
于 2012-05-08T10:49:46.923 に答える
5

ついにその理由を知ることができました。

ClassLoadersJIRA(Felix)でプラグインをロードする際には、多くのことが関係します。'bootstrap'に委任されませんClassLoader。したがって、問題があります。

どちらがクラスをClassLoaderロードしたかを知るには、 whichを使用してFelixを出力します。 JAXBContextJAXBContext.class.getClassLoader()ClassLoader

jaxb-api.jar依存する代わりにからクラスをロードしましrt.jarたが、実装は少し異なります。 rt.jarversionは 、 versionが使用するcom.sun.xml.bind.internal.v2.ContextFactory場所を使用します。jaxb-apicom.sun.xml.bind.v2.ContextFactory

別のパラメータをとして取るJAXBのoverlaodedメソッドを使用して問題を解決することができますClassLoader

かなり時間がかかりました。しかし、私は内部の詳細と私の無知に驚いています

于 2010-06-24T11:52:34.733 に答える
0

このcom.sun.xml.bindパッケージはJAXBRI(http://jaxb.dev.java.net/)の一部であるため、クラスパスのどこかにある可能性があります。

Java6には独自のバージョンのJAXBがcom.sun.xml.internal.bindパッケージに含まれているため、通常、Java6のRIは必要ありません。

RIJava6で動作するように作成できますが、困難な戦いであり、通常はこの種の問題が発生します。

于 2010-06-23T08:05:46.447 に答える