3

明らかに sun.reflect パッケージを使用するバンドルを実行しようとしています。

最初にいくつかの背景情報: AndroidでApache Felixを使用しています。また、sun.reflect をシステム エクストラ パッケージとして追加しました。

String extrapackets =  "sun.reflect; version=\"1.0.0\"";

config.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA, extrapackets);

config.put("felix.bootdelegation.implicit", "false");

「sun.reflect」は、システム バンドルの exportinglist にも表示されます (headers cmd を使用)。そして、それは私のバンドルによってインポートされます。また、エクスポートおよびインポート時に正しいバージョン番号を取得しました。

エラー メッセージ:

java.lang.NoClassDefFoundError: sun/reflect/ConstructorAccessorImpl
at sun.misc.Unsafe.defineClass(Native Method)
at sun.reflect.ClassDefiner.defineClass(ClassDefiner.java:45)
at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:381)
at java.security.AccessController.doPrivileged(Native Method)
at sun.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:377)
at sun.reflect.MethodAccessorGenerator.generateConstructor(MethodAccessorGenerator.java:76)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:30)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
...
4

3 に答える 3

1

In case anyone else runs across this issue, there may be a quicker fix.

I hit this bug when using reflection in OSGi running on a Sun/Oracle JVM. It turns out this is a known issue. The suggested fix of setting -Dsun.reflect.noInflation=true at the JVM level will cause the class not to be referenced, at the cost of ignoring an optimization.

I tried the fix, and it worked for me.

于 2014-01-20T06:15:25.337 に答える
0

私の知る限り、sun。*パッケージは、コンピュータにインストールするOracleJVMで使用される内部パッケージです。一方、Androidは、Sun(現在はOracle)によるJVMの実装を使用していません。AndroidはJavaSEと同様のAPIを提供しますが、VM(Dalvik VMと呼ばれる)の独自の実装があります。

そのため、Androidではsun。*パッケージは見つかりません。使用しているバンドルのソースコードを取得し、Androidライブラリに対してコンパイルする必要があります(EclipseでAndroidプロジェクトを使用するか、Antを使用します)。次に、それをjarに再パッケージ化すると、sun。*パッケージを参照せずにデプロイできます。

Kartik

于 2012-07-14T10:34:33.843 に答える
0

バンドル内のパッケージもインポートしましたか? systembundles.extra に追加するだけでは不十分です。

于 2012-07-14T12:58:30.620 に答える