【问题标题】:How to ensure loading of classes of external jars when called from an eclipse plugin?从 Eclipse 插件调用时,如何确保加载外部 jar 类?
【发布时间】:2011-01-22 15:33:03
【问题描述】:

我开发了一个 Eclipse 插件,它引用了一个存在于外部安装目录中的外部 jar。 所以我在我的包类路径中添加了一个条目,如下所示:

Bundle-ClassPath: external:C:\mylib.jar

我的类加载正确 - 插件能够检测到此外部 lib 中存在的类 MyClass
但是,方法a() - 我在类MyClass 中调用失败了。

方法a()如下:

public void a()
{
  URL url = this.class.getClassLoader().getResource("META-INF/startup-jar ");
  ...
}

所以返回的 URL 是 eclipse 插件目录的 URL C:\eclipse3.4\test 而不是外部 jar 的物理位置,即C:\mylib.jar

这导致方法a() 失败。现在,我的问题是 -
因为我没有将外部 jar 复制到我的插件目录(它只存在于插件类路径中)

如何确保类加载器获取我的外部 jar 而不是插件目录的 URL 路径?

注意:我无法更改外部 jar 中的类加载机制,因为它是第三方依赖项,我无法控制代码。所以请提出一个解决方案,帮助我正确加载外部 jar 类,以便我可以获得正确的 URL。

非常感谢您的帮助 - 提前

解释一下我面临的问题:: 我的外部 jar 存在于我的服务器安装的安装目录中。

当我的外部 jar 中的类调用 URL 时 url = this.class.getClassLoader().getResource("startup-jar")

它返回相对于 Eclipse 包路径的 URL - 像 C:\eclipse3.4...

这个URL用于获取启动目录(服务器的安装目录)。

所以它应该返回一个相对于服务器安装目录的路径,而是返回一个相对于eclipse安装目录的路径。

因此,我无法调用服务器上的任何 API,因为它尝试使用的服务器安装目录不正确。

所以我想知道我可以处理这个问题的最佳方法是什么,以便此方法调用返回服务器安装目录而不是 Eclipse 包路径。

【问题讨论】:

  • 对不起我的class.getResource 回答。

标签: eclipse plugins jar external classloader


【解决方案1】:

你不能用正确的 OSGI 元数据包装这个第 3 方依赖项并将其安装为插件/捆绑包吗?我们为所有第 3 方依赖项执行此操作,包括 Hibernate 等有问题的依赖项,并使其正常工作。

如果它是一个流行的开源库,您可能可以通过在 Spring 存储库中添加的 OSGi 元数据找到它:www.springsource.com/repository/app

一般来说,我不推荐您在问题中描述的引用外部 JAR 的模式。

【讨论】:

  • “包装这个第三方依赖项”是什么意思-我将所有这些 jar 复制到另一个插件的库下,然后将它们添加到这个新插件的捆绑类路径中?然后添加这个新插件到第一个插件的捆绑类路径?这种方法会对 getResource 方法返回的值产生什么影响吗?
  • 如果方法 a() 在第 3 方库中,那么它应该可以工作,因为第 3 方库将有自己的类加载器。我不确定您是否有特定原因不将该库作为捆绑包/插件提供。
猜你喜欢
  • 1970-01-01
  • 2012-01-13
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
  • 2016-06-22
相关资源
最近更新 更多