bundle的激活器无效

时间:2009-08-20 10:42:47

标签: java eclipse eclipse-plugin osgi osgi-bundle

我正在尝试在eclipse中创建一个简单的插件。当我运行应用程序时,我在日志文件中看到此错误:

  

org.osgi.framework.BundleException:bundle的激活器   org.x.y.Activator for bundle org.x.y无效。

您对此错误有任何疑问吗?

14 个答案:

答案 0 :(得分:17)

检查您的build.properties部分

如果没有正确指定最终二进制结果中应该包含的内容,则无效。检查.class文件是MANIFEST.MF所说的文件。


来自EclipseZone,此错误消息的另一个原因是:

  

如果您在日志中看到一条消息,如

 The activator org.example.FooActivator for bundle org.example.foo is invalid 
  

,那么这通常意味着有一个ClassNotFoundException尝试首先加载该类,然后才开始使用start()方法。


penguru补充道:

  

当我尝试从激活器类的构造函数中的任何其他类创建新对象时发生错误。在激活器插件中创建对象不合法吗?

  • 如果该类来自另一个尚未“激活”的插件,则可能是您的问题。
  • 如果找不到该类,那也会使插件激活器失效。

基本建议:在Activator的{​​{1}}而不是其构造函数中完成初始化可能会更好。

答案 1 :(得分:3)

从不同的工作区导入插件时,我也遇到了同样的问题。基本上,它是在加载类时框架查找的bundle类路径。导入到其他工作区时,请确保将类路径更改为指向适当的位置,即类文件所在的位置。

修改类路径后,尝试清理并重新构建并重新运行。它应该工作..希望......

答案 2 :(得分:1)

如果您已将eclipse工作区移动到新路径,那么您应该在插件构建之前使用project-> clean,否则您将遇到此问题。

答案 3 :(得分:1)

好吧,我不想在这里明显成为队长,但我之前犯过这个错误。当您忘记扩展BundleActivator时也会发生这种情况。

答案 4 :(得分:1)

我花了一些时间来解决这个问题。最后我注意到ClassNotFoundExceptions与我的代码不一致,它们来自错误的(旧)软件包。我检查是否有其他插件搞砸了我的调试/导出,确实有我自己的插件!

如果你面对这个并且CNFE不符合你的代码,那么这是一个简单的解决方法:

  • 转到“安装新软件”
  • 点击“已安装”
  • 删除包/插件的所有实例并重新启动

可能这是因为我更改了插件ID,因此Eclipse将其视为新插件。

另一个很好的网站,如果你感到沮丧和困难,请看看http://www.eclipsezone.com/eclipse/forums/t99010.html

答案 5 :(得分:1)

在我的情况下,有这个消息“Activator ..invalid”但在接下来的例外情况下,捆绑包中的ClassNotFound异常是我没有改变的东西..

Guu(也是解决方案)是我的英雄,增加

之后
Bundle-ManifestVersion: 2

Bundle-ManifestVersion: 3

一切正常:)

答案 6 :(得分:1)

我得到了同样的例外。潜在的问题是ClassCastException。我的包需要org.osgi.core 4.3,而equinox启动器使用4.2。

此致 罗兰

答案 7 :(得分:1)

如果您在另一个包中的包之后命名一个包,也会发生这种情况。

所以:

  • 如果您的Bundle A包含包org.my.package.name.function
  • 并创建名为bundle B的{​​{1}},
    • =>然后系统可以在那里寻找激活器,而不是找到任何激活器。

答案 8 :(得分:0)

我找到了错误的原因。当我尝试从激活器类的构造函数中的任何其他类创建新对象时发生错误。在插件激活器中创建对象不合法吗?

答案 9 :(得分:0)

在我的情况下,这个异常是因为Eclipse自定义类加载器无法及时解析和加载来自其他插件的所有依赖类。我不是Eclipse超级大师所以也许这是我的错。

然而,它是通过禁用延迟加载插件来解决的。在MANIFEST.MF编辑器的概述选项卡上的GUI中取消选中在加载其中一个类时激活此插件。或直接在MANIFEST.MF删除行

Bundle-ActivationPolicy: lazy

答案 10 :(得分:0)

另一位队长显而易见:如果你改变你的源文件的路径(例如src /到src / main / java),但忘记更新build.properties,编译总会成功,但你的插件永远不会工作。 / p>

答案 11 :(得分:0)

我遇到了同样的错误,在我的情况下,我使用参数创建了自己的构造函数。但我没有提供默认构造函数。因此,在删除我的构造函数并在start()方法中初始化all之后,它就像charme一样工作。

答案 12 :(得分:0)

我也遇到了同样的错误。 bundle XX的激活器XX无效,ClassNotFoundException。 我检查了plugins \目录,找不到所需的类。

- 因为没有包含所需类的jar文件,所以只有相应的目录。 例如,没有com.hh.jar,只有com.hh目录。

因此,创建com.hh.jar一定有问题。

如果com.hh.jar引用其他插件,那么也要检查它们。

我通过编辑MANIFEST.MF解决了这个问题。 通过Plug-in Manifest Editor打开它,在运行时选项卡中,在" Exported Packages"中添加所需的包。 并在" classpath"中添加所需的库,以及"。" (当前目录,重要)

答案 13 :(得分:0)

当'捆绑'普通jar文件时,我也遇到了这个问题。如果某些依赖关系未得到解决,或者jars依赖于比您正在使用的更高的JAVA版本,则激活器将无法启动,从而产生上述异常。找出问题的快速方法是从bundle-classpath(清单的运行时选项卡)中删除jar,并检查激活器是否能正常运行。