4

Modular Java book の例を実行しようとしていて、ClassNotFoundException に直面しています。エラーの要点は、I have 2 bundles です。

バンドル 1 はインデックスと呼ばれます。バンドル 2 は、Compass プロジェクトのラップされたバンドルです。

バンドル 1 はバンドル 2 を使用し、マニフェストの「Import-Package」ヘッダーで宣言されたバンドル 2 から使用するパッケージを持ちます。同じパッケージがバンドル 2 によってもエクスポートされます。

インデックス (バンドル 1) によって使用されるバンドル 2 のクラスは、バンドル 2 の内部にあるいくつかのクラスを呼び出します。これらのクラスのパッケージは、バンドル 2 によってもエクスポートされます。しかし、これらを (Pax-runner を使用して) Felix にデプロイするたびに、次のエラーで開始が失敗します。

[FelixDispatchQueue] DEBUG main-findmyjar.index - BundleEvent STOPPED - main-findmyjar.index
ERROR: Bundle main-findmyjar.index [7] Error starting file:bundles/main-findmyjar.index_1.0.0.SNAPSHOT.jar (org.osgi.framework.BundleException: Activator start error in bundle main-findmyjar.index [7].)
org.compass.core.config.ConfigurationException: Failed to instantiate [org.compass.core.config.binding.metadata.AsmMetaDataReader], please verify class type at setting [compass.scanner.reader]; nested exception is java.lang.ClassNotFoundException: org.compass.core.config.binding.metadata.AsmMetaDataReader
java.lang.ClassNotFoundException: org.compass.core.config.binding.metadata.AsmMetaDataReader
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:247)
        at org.compass.core.util.ClassUtils.forName(ClassUtils.java:90)
        at org.compass.core.config.CompassSettings.getSettingAsInstance(CompassSettings.java:304)
        at org.compass.core.config.binding.metadata.MetaDataReaderFactory.getMetaDataReader(MetaDataReaderFactory.java:35)
        at org.compass.core.config.binding.AbstractClassMetaDataMappingBinding.setUpBinding(AbstractClassMetaDataMappingBinding.java:24)
        at org.compass.annotations.config.binding.AnnotationsMappingBinding.setUpBinding(AnnotationsMappingBinding.java:93)
        at org.compass.core.config.CompassMappingBinding.setUpBinding(CompassMappingBinding.java:56)
        at org.compass.core.config.CompassConfiguration.getMappingBinding(CompassConfiguration.java:121)
        at org.compass.core.config.CompassConfiguration.addClass(CompassConfiguration.java:500)
        at org.gt.osgi.findmyjar.index.internal.Activator.getCompass(Activator.java:40)
        at org.gt.osgi.findmyjar.index.internal.Activator.start(Activator.java:35)
        at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:645)
        at org.apache.felix.framework.Felix.activateBundle(Felix.java:1977)
        at org.apache.felix.framework.Felix.startBundle(Felix.java:1895)
        at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1191)
        at org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:295)
        at java.lang.Thread.run(Thread.java:662)
[FelixDispatchQueue] DEBUG main-findmyjar.index - FrameworkEvent ERROR - main-findmyjar.index
org.osgi.framework.BundleException: Activator start error in bundle main-findmyjar.index [7].
        at org.apache.felix.framework.Felix.activateBundle(Felix.java:2027)
        at org.apache.felix.framework.Felix.startBundle(Felix.java:1895)
        at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1191)
        at org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:295)
        at java.lang.Thread.run(Thread.java:662)
Caused by: org.compass.core.config.ConfigurationException: Failed to instantiate [org.compass.core.config.binding.metadata.AsmMetaDataReader], please verify class type at setting [compass.scanner.reader]; nested exception is java.lang.ClassNotFoundException: org.compass.core.config.binding.metadata.AsmMetaDataReader
        at org.compass.core.config.CompassSettings.getSettingAsInstance(CompassSettings.java:306)
        at org.compass.core.config.binding.metadata.MetaDataReaderFactory.getMetaDataReader(MetaDataReaderFactory.java:35)
        at org.compass.core.config.binding.AbstractClassMetaDataMappingBinding.setUpBinding(AbstractClassMetaDataMappingBinding.java:24)
        at org.compass.annotations.config.binding.AnnotationsMappingBinding.setUpBinding(AnnotationsMappingBinding.java:93)
        at org.compass.core.config.CompassMappingBinding.setUpBinding(CompassMappingBinding.java:56)
        at org.compass.core.config.CompassConfiguration.getMappingBinding(CompassConfiguration.java:121)
        at org.compass.core.config.CompassConfiguration.addClass(CompassConfiguration.java:500)
        at org.gt.osgi.findmyjar.index.internal.Activator.getCompass(Activator.java:40)
        at org.gt.osgi.findmyjar.index.internal.Activator.start(Activator.java:35)
        at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:645)
        at org.apache.felix.framework.Felix.activateBundle(Felix.java:1977)
        ... 4 more
Caused by: java.lang.ClassNotFoundException: org.compass.core.config.binding.metadata.AsmMetaDataReader
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:247)
        at org.compass.core.util.ClassUtils.forName(ClassUtils.java:90)
        at org.compass.core.config.CompassSettings.getSettingAsInstance(CompassSettings.java:304)
        ... 14 more
[FelixDispatchQueue] DEBUG org.apache.felix.framework - BundleEvent STARTED - org.apache.felix.framework
[FelixDispatchQueue] DEBUG org.apache.felix.framework - FrameworkEvent STARTED - org.apache.felix.framework

何が問題であるかの手がかりはありますか?

これがマニフェストです。

Manifest-Version: 1.0
Export-Package: org.gt.osgi.findmyjar.index;uses:="org.gt.osgi.findmyj
ar.domain";version="1.0.0.SNAPSHOT"
Private-Package: org.gt.osgi.findmyjar.index.internal
Ignore-Package: org.gt.osgi.findmyjar.index.internal   
Built-By: tyagig
Tool: Bnd-0.0.255
Bundle-Name: main-findmyjar.index
Created-By: Apache Maven Bundle Plugin
Build-Jdk: 1.6.0_32
Bundle-Version: 1.0.0.SNAPSHOT
Bnd-LastModified: 1357910690482
Bundle-ManifestVersion: 2
Bundle-Activator: org.gt.osgi.findmyjar.index.internal.Activator
Bundle-Description: Generated using Pax-Construct
Bundle-SymbolicName: main-findmyjar.index
Import-Package: org.compass.core,org.compass.core.config,org.compass.c
ore.config.binding.metadata,org.gt.osgi.findmyjar.domain;version="1.0
.0.SNAPSHOT",org.gt.osgi.findmyjar.index;version="1.0.0.SNAPSHOT",org
.osgi.framework
4

1 に答える 1

3

問題をカスケードする Class.forName() を実行する org.compass.core.util.ClassUtils があるようです。

ClassUtils がバンドル 2 にあり、使用する明示的なクラスローダーが指定されていない場合、デフォルトでバンドル クラスローダーになります。bundleclassloader は、(クラス グラフ全体で) bundle2 に表示されるクラスのみをインスタンス化できます。

ロードしようとしている設定は、表示されていない bundle1 で指定されたクラスである可能性があります。

解決策は、クラスを動的にロードするとき、またはクラスローダーのバディメカニズムを調べるときに、クラスローダーを bundle1 から bundle2 に渡すことです。これをもう少し明確に説明する古い記事があります。

于 2013-01-30T09:06:08.643 に答える