Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OSGiClassNotFoundException_Java_Osgi - Fatal编程技术网

Java OSGiClassNotFoundException

Java OSGiClassNotFoundException,java,osgi,Java,Osgi,我试图运行模块化Java书籍中的示例,但遇到了ClassNotFoundException。错误的要点是“我有两个包” Bundle 1称为索引。 捆绑包2是Compass项目的包装捆绑包 Bundle 1使用Bundle 2,并在其清单中的“Import Package”头中声明了它从Bundle 2中使用的包。同样的包也通过Bundle 2导出 索引(Bundle 1)使用的Bundle 2的类调用Bundle 2内部的几个类。这些类的包也通过Bundle 2导出。但每当我在Felix上部署

我试图运行模块化Java书籍中的示例,但遇到了ClassNotFoundException。错误的要点是“我有两个包”

Bundle 1称为索引。 捆绑包2是Compass项目的包装捆绑包

Bundle 1使用Bundle 2,并在其清单中的“Import Package”头中声明了它从Bundle 2中使用的包。同样的包也通过Bundle 2导出

索引(Bundle 1)使用的Bundle 2的类调用Bundle 2内部的几个类。这些类的包也通过Bundle 2导出。但每当我在Felix上部署它们时(使用Pax runner),启动就会失败,并出现以下错误

[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

似乎您有一个org.compass.core.util.ClassUtils,它有一个Class.forName(),它级联了问题

如果ClassUtils在bundle 2中,并且没有提供要使用的显式类加载器,那么它将默认为bundle类加载器。bundleclassloader只能实例化bundle2可见的类(在整个类图中)

它试图加载的设置很可能是bundle1中指定的类,该类不可见


解决方案是在动态加载类或查看类加载器绑定机制时,将类加载器从bundle1传递到bundle2。有一个古老的解释可能会更清楚一些。

我们可以查看bundle1和bundle2的清单吗?在这里找到了更多信息。当Bundle 1调用Bundle 2的类时,它们会在内部尝试使用class.forName()加载一个类。是否在加载这个包时,Class.forName()仍然使用第一个包中的classloader。嗯,我不确定,您发布的清单,是包1还是包2?你能把这两个舱单都贴出来吗?