虽然OSGi捆绑包存在,但出现了NoClassDefFoundError错误

5

当我尝试在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)

问题在于我的bundle正在导入以下包:com.springsource.org.apache.commons.collections; version="3.2.1"。 当我搜索spring EBR时,发现该bundle包含所需的类。
我使用监视工具确保bundle正在运行。
问题可能是什么?
问候。

你已经将Spring collections bundle安装到你的OSGi运行时中了吗? - JustinKSU
你有这个包的名称吗?我用它安装了很多东西,但我不确定它是哪一个。 - Houcem Berrayana
3个回答

4
根据您的写作,您正在导入包com.springsource.org.apache.commons.collections,但它是 org.apache.commons.collections jar文件的Spring内置OSGi版本。它是一个bundle,而不是一个package。

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

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

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

to

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

在我的清单文件中,我在导入语句中有这个 com.springsource.org.apache.commons.collections;version= "3.2.1"。我安装了从 Spring EBR 获取的 jar 文件。 - Houcem Berrayana
@Houcem - 这是你的问题,导入应该按照我在答案中所述。 - Robin

2

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

该错误意味着您的bundle未导入org.apache.commons.collections包,即它必须出现在您的bundle的Import-Package语句中的某个位置。


出现在导入包中。我在运行时而不是在安装我的捆绑包时收到此错误。 - Houcem Berrayana
当安装一个bundle时,出现这样的错误是不可能的。如果该包在您的“Import-Package”语句中出现,则不应发生NCDFE错误。是否有可能是另一个bundle实际上抛出了此错误,即不是您认为的那个bundle? - Neil Bartlett

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

我已经添加了它。但是类加载器从OSGi捆绑包中查找类,而不是从lib目录中的文件中查找。 - Houcem Berrayana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接