【问题标题】:NoClassDefFoundError although OSGi bundle is thereNoClassDefFoundError 虽然有 OSGi 包
【发布时间】:2011-07-20 15:44:44
【问题描述】:

尝试在 Eclipse Equinox 上运行 grails 应用程序时出现运行时错误。

java.lang.NoClassDefFoundError: org/apache/commons/collections/Transformer

at java.lang.ClassLoader.defineClass1(Native Method)

at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)

at java.lang.ClassLoader.defineClass(ClassLoader.java:616)

at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.defineClass(DefaultClassLoader.java:188)

at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClass(ClasspathManager.java:580)

at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findClassImpl(ClasspathManager.java:550)

at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClassImpl(ClasspathManager.java:481)

at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass_LockClassLoader(ClasspathManager.java:469)

at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:449)

at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:216)

at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:393)

at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:469)

at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:422)

at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:410)

at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)

at java.lang.ClassLoader.loadClass(ClassLoader.java:248)

问题是我的包正在导入以下包com.springsource.org.apache.commons.collections; version="3.2.1" 在搜索 spring EBR 时,我发现该捆绑包包含所需的类。

我使用了监控工具来确保捆绑包正在运行。

可能是什么问题?

问候?

【问题讨论】:

  • 您是否已将 Spring 集合包安装到您的 OSGi 运行时中?
  • 你有包名吗?我已经用它安装了很多东西,但我不确定。

标签: java osgi equinox


【解决方案1】:

根据您编写的内容,您正在导入包 com.springsource.org.apache.commons.collections,但这是 org.apache 的 Spring 构建的 OSGi 版本。 commons.collections jar 文件。它是一个捆绑包,而不是一个包。

您的包必须导入 org.apache.commons.collections,它由 com.springsource.org.apache.commons.collections 包提供。假设您已经将 Spring 捆绑包提供给运行时,您只需修复 import 语句。

在您现有的清单中,更改(在您的 Import-Package 部分下):

com.springsource.org.apache.commons.collections;version="3.2.1"

org.apache.commons.collections;version="3.2.1"

【讨论】:

  • 在我的清单中,我在导入语句 com.springsource.org.apache.commons.collections;version="3.2.1" 中有这个。我安装了从 spring EBR 获得的 jar 文件
  • @Houcem - 那是你的问题,导入应该像我在回答中所说的那样。
【解决方案2】:

您的包无法导入包com.springsource.org.apache.commons.collections,因为没有这样的包。您的意思可能是您已经安装了具有该名称的 bundle

该错误表示您的包没有导入包org.apache.commons.collections,即它必须出现在您的包的Import-Package 语句中的某处。

【讨论】:

  • 出现在导入包中。我在运行时而不是在安装我的包时收到此错误。
  • 当然;安装捆绑包时不可能出现这样的错误。嗯,如果包确实出现在您的 Import-Package 语句中,那么 NCDFE 不应该发生。是否有可能是另一个包实际上抛出了这个错误,即不是你认为的那个?
【解决方案3】:

将 commons-collections jar 文件添加到您的构建路径将解决此问题。

【讨论】:

  • 我已经添加了。但是类加载器从 OSGi 上的包而不是从 lib 目录中的文件中查看类
猜你喜欢
  • 2016-09-07
  • 2021-04-06
  • 2015-09-08
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
  • 2023-03-18
相关资源
最近更新 更多