两个Eclipse项目 - >一个Eclipse插件

时间:2009-11-20 20:41:56

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

背景

我是Vrapper项目的开发人员。

Vrapper包含2个主要部分

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

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

vrapper.core实现了各种Vim命令,模式等。 这些都与平台进行通信 - 一个抽象出来的界面 基础内容(文本编辑器,剪贴板,设置系统等)。

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

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

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

  • vrapper.core - 与Vrapper无关的Eclipse代码
  • vrapper.eclipse - 依赖于 vrapper.core
  • 的Eclipse插件
  • surround.core - 与Eclipse无关的代码,模拟 surround.vim (Vim插件)
  • surround.eclipse - vrapper.eclipse 的Eclipse片段 这使得它提供了 surround.core 的命令。

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

一个用于统治所有

的插件

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

许多插件

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

问题

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

如果你从Eclipse运行东西并从运行配置中选择所有插件,这是有效的, 但是,如果一个部署功能和插件和运行eclipse通常会抛出异常 因为找不到来自surround.core的类。 这是 surround.core的精神,需要额外的命令 依赖插件创建隐式循环依赖

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

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

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

只有对我来说成功的事情才是一个丑陋的黑客。

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

这种丑陋的黑客方法的问题(除了它是丑陋的黑客)是 这种发展变得非常痛苦。 Eclipse代码导航,代码覆盖 Eclipse中很少有其他东西停止工作。

摘要

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

如何将来自少数项目的代码转换为一个插件/片段?

2 个答案:

答案 0 :(得分:4)

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

问题解决了: - )

答案 1 :(得分:0)

从阅读本文来看,听起来好像实际问题是两个方向都存在依赖关系。难道你不能重构你的项目,只能让Eclipse-spcific项目依赖于核心项目,而不是相反吗?