バンドル アクティベーターを実行しようとすると、次の例外が発生します。
java.lang.LinkageError: loader constraint violation: when resolving
method "com.openaf.osgi.OSGIUtils$.mapToDictionary(Lscala/collection/immutable/Map;)Ljava/util/Dictionary;"
the class loader (instance of
org/apache/felix/framework/BundleWiringImpl$BundleClassLoaderJava5) of
the current class, com/openaf/test/TestBundleActivator, and the class
loader (instance of sun/misc/Launcher$AppClassLoader) for resolved
class, com/openaf/osgi/OSGIUtils$, have different Class objects for
the type a/util/Dictionary; used in the signature
at com.openaf.test.TestBundleActivator.start(TestBundleActivator.scala:11)
が 2 つの異なるクラスローダーによってロードされたようですが、そのjava.util.Dictionary
理由はわかりません。問題の原因となっているクラス ( com.openaf.osgi.OSGIUtils
) はシステム パッケージです。すなわち
hm.put("org.osgi.framework.system.packages.extra", "sun.misc, com.openaf.osgi")
これは、存在するバンドルのマニフェストですTestBundleActivator
。
Manifest-Version: 1
Bnd-LastModified: 1345098244802
Bundle-Activator: com.openaf.test.TestBundleActivator
Bundle-ManifestVersion: 2
Bundle-Name: test.impl
Bundle-SymbolicName: test.impl
Bundle-Version: 0
Created-By: 1.7.0_04 (Oracle Corporation)
Export-Package: com.openaf.test;uses:="scala.collection,scala.collection
.immutable,com.openaf.test.api,scala.collection.mutable,scala.reflect,o
rg.osgi.framework,com.openaf.osgi,scala.runtime,scala,com.openaf.utils"
;version="0.0.0"
Import-Package: com.openaf.osgi,com.openaf.test.api,com.openaf.utils,org
.osgi.framework,scala,scala.collection,scala.collection.immutable,scala
.collection.mutable,scala.reflect,scala.runtime
Tool: Bnd-1.44.0
誰かが私が間違っていることを知っていますか? システムパッケージに含まれているため、基本クラスローダーによってロードされる必要があると推測しました。そうではないようです。
ありがとう、ニック。
編集 - 私がやろうとしていることを言うべきです。felix アプリケーションの起動時にクラスパスにパッケージがあり、すべてのバンドルで利用できるようにしたいと考えています。プロパティはそれを行う方法だと思いorg.osgi.framework.system.packages.extra
ました。あれは正しいですか?