ができないのはなぜでJAXBっjaxb.指数が走行中のApacheフェリックス?
-
20-08-2019 - |
質問
することにしましたが、このパッケージすべきであると索引をただ、呼び出
JAXBContext jc = JAXBContext.newInstance("my.package.name");
を取得しまJAXBExceptionう
"my.パッケージです。名称"を含んだObjectFactory.class やjaxb.index
すが含まれます。
ものは何か仕事がない、
JAXBContext jc = JAXBContext.newInstance(my.package.name.SomeClass.class);
この問題はなく、他人がなかなか一部のメーリングリストやフォーラムがない答えなのです。
いることにOpenJDK6、私のソースパッケージ強化マデバッガの図書館があります。から始める必要がありま見jaxb.性、そして見のためのシステムプロパティが見つのいずれかで作成しようとし、デフォルトコンテキストを使用します。ます。内.形式をサポートしています。連結します。.phpがv2で増えたファイルです。ContextFactory.が、例外がスローされ( ContextFactor.createContext(String ClassLoader, Map)
がんを見ることのできないので、ソースいます。
ETA:
からのソースコードContentFactoryん こちらの, この曲のコードにエラーが発生した場合としての意:
/**
* Look for jaxb.index file in the specified package and load it's contents
*
* @param pkg package name to search in
* @param classLoader ClassLoader to search in
* @return a List of Class objects to load, null if there weren't any
* @throws IOException if there is an error reading the index file
* @throws JAXBException if there are any errors in the index file
*/
private static List<Class> loadIndexedClasses(String pkg, ClassLoader classLoader) throws IOException, JAXBException {
final String resource = pkg.replace('.', '/') + "/jaxb.index";
final InputStream resourceAsStream = classLoader.getResourceAsStream(resource);
if (resourceAsStream == null) {
return null;
}
から 前 体験, 私の顔をみると、ここのクラスローディングのメカニズムOSGiコンテナがこのはます。残念ながら、今の私の深さです。
解決
OKであり、かなり掘り、その答えがないとのことで驚かなくなるかもしれないが複雑な:
JAXBんでいるのがjaxb.指数がデフォルトでは、 newInstance(String)
の現在のスレッドのクラスローダとして返される Thread.getContextClassLoader()
).これは当てはまりません"au design project×yamaha"よりフェリックスでは、OSGi束の枠組みのスレッドが別のクラスローダ.
このセクションの取得に適したクラスローダから使用 newInstance(String, ClassLoader)
.私は適切なクラスローダからのクラスのパッケージが含まれ jaxb.index
, では、良識ある選択肢と柔軟性を理由にするものであった。 ObjectFactory
:
ClassLoader cl = my.package.name.ObjectFactory.class.getClassLoader();
JAXBContext jc = JAXBContext.newInstance("my.package.name", cl);
いきものクラスローダの Bundle
インスタンスは、こんな姿をどのように、上記溶液のように安全です。
他のヒント
っていないとき同様のプロジェクトしました。読み http://jaxb.java.net/faq/index.html#classloader そのJAXBContextできませんので、パッケージを含むjaxb.index.
んでいきたいと思っていくことが可能です。
ていま
Bundle A
-- com.a
A.java
aMethod()
{
B.bMethod("com.c.C");
}
MANIFEST.MF
Import-Package: com.b, com.c
Bundle B
-- com.b
B.java
bmethod(String className)
{
Class clazz = Class.forName(className);
}
Export-Package: com.b
Bundle C
-- com.c
C.java
c()
{
System.out.println("hello i am C");
}
Export-Package: com.c
関 JAXB. クラスBには、JAXBContext bMethodはnewInstance()
していますがOSGiパッケージに制限しなければ非常に明る バンドル億 な輸入パッケージ com.c ん。e クラスC は 見えない へ クラスB があり、したがって、それはインスタンスを生成C.
を解決する過 ClassLoader にbMethod.このクラスローダに来てから バンドルは輸入します。c.る場合には、そのパス A.クラスです。getClassLoader() 以降 バンドルは輸入します。c
ことを期待したい。
同じ問題が、解決する手動でのパッケージのサポートいたします。
ご利用の場合はmavenプロジェクトそのもこのライブラリ:
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-osgi</artifactId>
<version>2.2.7</version>
</dependency>
またGlasfishサーバーはもとTomcat(確認).この図書館できeasly利用JAXBとOSGI束が認められた。
編集2:
また同様の不思議なクラスローディングの問題は私の願います。までとしては、通常のアプリケーションもOKにしたもの呼び出しとして、Windowsサービスも開始して失敗しClassNotFoundExceptions.の解析の結果から、スレッドしたclassloaderとしてnullになんだか。うことでこの問題を解決の設定SystemClassLoaderのスレッド:
// ...
thread.setContextClassLoader(ClassLoader.getSystemClassLoader());
thread.start();
// ...
知らない場合はコンテナではこのような変更ものです。
私だけで走行する。私にとってのソリューションした使用IBMのJREの代わりにOracle。そう、JAXB実施によりOSGIに優れます。
私に解決されたこの追加のパッケージの生成されたクラスを含む ObjectFactory
の <Private-Package>
私はバンドル定義-プラス org.jvnet.jaxb2_commons.*
あ別のシナリオではこの問題です。
インストールすると、開始束を輸出しているため、パッケージが含まれるjaxb.インデックスまたはobjectFactory.java
その後にいくのバンドルの輸入のクラスは止まってることを指摘し、正しいパッケージの名前です。
またチェックの輸出入諸表のpom.xml
を抱えて同様の問題servicemix(karaf)osgiコンテナ
私にとっての問題は、単体テストまたは関係のないモジュールの開発を行っていなかったた依存関係がpom.xml 私のモジュールです。この"UT知識は私のモジュールによる取得のパッケージリストから共通の設定ファイルを指定します。
実行時に学んでコンパイルの新しいモジュールではなかったのObjectFactory.java このため、受信エラーのものがまとめましたのでよろしければ、モジュールを見ることが出来ましたが、ObjectFactory.java
追加の依存関係:
<dependency>
<groupId>com.myCompany</groupId>
<artifactId>my-module-name</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
私の解した:
JAXBContext文脈=JAXBContext.newInstance(新しいクラスの[]{"my.パッケージです。名});
または
JAXBContext文脈=JAXBContext.newInstance(新しいクラスの[]{ます。getName()});
または
フル解
public static <T> T deserializeFile(Class<T> _class, String _xml) {
try {
JAXBContext context = JAXBContext.newInstance(new Class[]{_class});
Unmarshaller um = context.createUnmarshaller();
File file = new File(_xml);
Object obj = um.unmarshal(file);
return _class.cast(obj);
} catch (JAXBException exc) {
return null;
}
}
作品100%