【发布时间】: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