【问题标题】:OSGi LinkageError with two library plugins providing the same packages and classes, but different versionsOSGi LinkageError 带有两个库插件,提供相同的包和类,但版本不同
【发布时间】:2017-05-05 19:50:42
【问题描述】:

我有两个库插件,每个库都具有相同的 API,但版本不同

其中一个库插件在 MANIFEST.MF 中有以下内容:

Export-Package: com.package1.packagename1;version=1.0.0,
com.package2.packagename2;version=1.0.0

第二个库插件在 MANIFEST.MF 中定义了以下内容:

Export-Package: com.package1.packagename1;version=1.1.0,
com.package2.packagename2;version=1.1.0

使用此 API 的插件在 MANIFEST.MF 中定义了以下内容:

Import-Package: com.package1.packagename1;version="[1.0.0,1.1.0]",
com.package2.packagename2;version="[1.0.0,1.1.0]"

当使用 Import-Package 的插件被激活时, 它检查首选项值以确定库的哪个版本 用户想使用。然后激活器使用

bundle.stop() 
bundle.uninstall()

对于不需要的库版本,只留下一个可用的插件来满足 进口包装。到目前为止,一切都按预期运行,并且正确版本的 库可以正常使用。

更改版本时出现问题。当前,当用户更改库首选项时, 应用程序关闭并要求用户手动重新启动它。这保证了 JVM 和平台 两者都重新启动,以便我可以以编程方式停止和卸载插件的其他版本。然而, 当库使用者插件尝试调用库插件的剩余安装版本时, 抛出以下异常:

java.lang.LinkageError: loader constraint violation: loader (instance of
org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader) previously
initiated loading for a different type with name "com/package1/packagename1/ClassName"

有一个类似的问题here,但解决方案似乎是重命名一些包以避免该问题。这个解决方案对我不起作用,因为它们具有完全相同的 API 并且只是更改了底层库版本。

在不更改首选项的情况下再次重新启动 JVM 和平台可解决此问题,但我愿意 而是找到一个不需要用户重新启动应用程序两次即可更改的解决方案 库版本。是否有其他方法可以解决此问题以避免出现此链接错误?

【问题讨论】:

    标签: java eclipse-plugin osgi eclipse-rcp linkageerror


    【解决方案1】:

    听起来使用其他库的类加载器仍然处于活动状态。

    您必须确保使用该库的包在停止时不包含对对象和类的任何引用。只有这样才能清理捆绑类加载器。

    此外,您必须使用该库刷新所有捆绑包。这会将它们重新连接到新库。

    【讨论】:

    • 有没有办法以编程方式刷新 Eclipse 中的特定包?粗略的看一下并没有显示 bundle.refresh() 或 Platform.refresh(bundleId) 方法
    • 查找 FrameworkWiring.refreshBundles。在 bundle 0 上使用 bundle.adapt 转换为 FrameworkWiring。
    猜你喜欢
    • 2012-05-08
    • 1970-01-01
    • 2016-04-03
    • 2014-01-15
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多