【问题标题】:Two Eclispse projects -> One Eclipse Plug-in两个 Eclispse 项目 -> 一个 Eclipse 插件
【发布时间】:2009-11-20 20:41:55
【问题描述】:

背景

我是Vrapper 项目的开发人员。

Vrapper 包含 2 个主要部分

  • Vim 仿真库 (vrapper.core)
  • 充分利用它的 Eclipse 部件

我们希望 vrapper.core 不支持 Eclipse,因此它是可重用的 在 Eclipse 之外。目前,我们可以“vrap”各种 Eclipse 文本编辑器和我们用于单元测试的小型模拟文本编辑器。

vrapper.core 实现了各种 Vim 命令、模式等。 这些都与 Platform 通信 - 一个抽象出来的接口 底层的东西(文本编辑器、剪贴板、设置系统等)。

当为编辑器创建模式时,它会询问平台是否有额外的 适用于底层编辑器、当前编辑的文件类型等的命令。

EclipsePlatform 使用 Eclipse 扩展点机制提供这些命令。

那么,让我们考虑以下项目(还有更多):

  • vrapper.core - Vrapper 的独立于 Eclipse 的代码
  • vrapper.eclipse - 依赖于 vrapper.core 的 Eclipse 插件
  • surround.core - 模拟 surround.vim(Vim 插件)的独立于 Eclipse 的代码
  • surround.eclipse - vrapper.eclipse 的 Eclipse 片段 这使得它提供 surround.core 形式的命令。

我们可以通过两种方式处理这些问题:

一个插件统统统统

从 Eclipse 的角度来看,它应该是这样的。 有一个插件包含来自 vrapper.eclipsevrapper.core 的代码, 以及一个包含来自 surround.coresurround.eclipse 的代码的片段。

很多插件

  • 有3个插件
    • 两个 OSG 化库 vrapper.coresurround.core
    • vrapper.eclipse
  • surround.eclipse 片段在这种情况下依赖于 vrapper.core

问题

许多插件解决方案都有一些我不理解的延迟类加载问题。 这是因为当创建来自 vrapper.core 的模式实例时,他们需要 要创建来自 surround.core 的类(通过 vrapper.eclipse -> surround.eclipse)。

如果您从 Eclipse 运行东西并从运行配置中选择所有插件,则此方法有效, 但是如果部署功能和插件并正常运行 eclipse,则会引发异常 因为无法找到来自 round.core 的类。 这是 surround.core 的精神,要求从 依赖插件创建隐式循环依赖

我所说的隐式依赖是指没有核心类在编译时依赖于eclipse特定的类。

模式(如 vim 普通模式)是核心类。它们包含命令。有一些特定于特定 Eclipse 编辑器的命令(比如运行这个 JDT 特定的重构)。这些命令实现了核心接口,但它们的代码(显然)存在于特定于 eclipse 的项目中。创建模式时,它会向底层平台询问一些额外的命令——这些额外的命令在 eclipse 插件中实现。这是当 Eclipse 中的延迟类加载使一切在运行时崩溃的时候——扩展点引用了额外命令的类,但它们还没有加载。繁荣,例外。

我试图通过使用“一个插件来统治它们”的方法来解决这个问题。 对我来说,只有一个插件似乎是更好的解决方案,但我无法让它干净利落地工作。

对我来说唯一成功的是一个相当丑陋的 hack。

  • 所有 .core 项目都有一个 Ant 任务,该任务使用它们的类创建 .jar 文件 并将其放入相应的 *.eclipse 项目
  • *.eclipse 项目包含这些 jar,并将它们列入 MANIFEST 文件中。

这种丑陋的 hack 方法的问题(除了它是丑陋的 hack)是 这种发展变得相当痛苦。 Eclipse 代码导航、代码覆盖率 Eclipse 中的其他一些东西停止工作。

总结

我们有 eclipse 独立库 + eclipse 特定的东西 架构, 但我们确实需要所有这些都存在于一个插件中(因为在两个方向上都存在一些依赖关系)。

如何将少数项目的代码集成到一个插件/片段中?

【问题讨论】:

    标签: eclipse eclipse-plugin eclipse-rcp eclipse-pdt


    【解决方案1】:

    事实证明,将Eclipse-BuddyPolicy: dependent 添加到 MANIFEST.MF 文件,重新导出一些依赖项并将一个片段转换为插件(因此 BuddyPolicy 需要跟踪插件依赖项)是正确的解决方案。

    问题解决了:-)

    【讨论】:

      【解决方案2】:

      从读到这里,听起来好像实际的问题是在两个方向上都存在依赖关系。难道你不能重构你的项目,只让特定于 Eclipse 的项目依赖于核心项目,而不是反过来吗?

      【讨论】:

      • 这是一个很好的观点,但不幸的是没有。我刚刚编辑了我的问题并更好地解释了我所说的两个方向的依赖关系
      猜你喜欢
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 2015-01-08
      • 1970-01-01
      • 2015-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多