背景
我是 Vrapper 的开发者项目。
Vrapper 包含 2 个主要部分
Vim 仿真库 (vrapper.core)
很好用的Eclipse部分
我们希望 vrapper.core 不知道 Eclipse,所以它是可重用的
在 Eclipse 之外。目前,我们可以“vrap”各种 Eclipse
文本编辑器和我们用于单元测试的小型模拟文本编辑器。
vrapper.core 实现了各种 Vim 命令、模式等。
那些都与 Platform 通信 - 一个抽象出来的接口(interface)
底层的东西(文本编辑器、剪贴板、设置系统等)。
当为编辑器创建模式时,它会询问平台是否有额外的
适用于底层编辑器、当前编辑的文件类型等的命令。
EclipsePlatform 使用 Eclipse 扩展点机制提供这些命令。
因此,让我们考虑以下项目(还有更多):
vrapper.core - 独立于 Eclipse 的 Vrapper 代码
vrapper.eclipse - 依赖于 vrapper.core 的 Eclipse 插件
环绕.core - 模拟环绕.vim(Vim 插件)的Eclipse 独立代码
around.eclipse - vrapper.eclipse 的 Eclipse 片段
这使得它提供了来自 around.core 的命令。
我们有两种方法可以处理这些:
一个插件来统治一切
从 Eclipse 的角度来看,它应该是这样的。
有一个插件包含来自 vrapper.eclipse 和 vrapper.core 的代码,
以及一个包含来自 around.core 和 around.eclipse 的代码的片段。
很多插件
有3个插件
两个 OSGified 库 vrapper.core、surround.core
vrapper.eclipse
在这种情况下,surround.eclipse 片段依赖于 vrapper.core
问题
许多插件解决方案都有一些我不明白的延迟类加载问题。
这是因为当 vrapper.core 中的模式实例被创建时,他们需要
要创建的来自 around.core 的类(通过 vrapper.eclipse -> around.eclipse)。
如果您从 Eclipse 运行东西并从运行配置中选择所有插件,这将起作用,
但是如果部署功能和插件并正常运行 Eclipse,则会引发异常
因为找不到来自 around.core 的类。
这是围绕着 around.core 的精神,要求来自
依赖插件创建隐式循环依赖。
我所说的隐式依赖是指在编译时没有核心类依赖于特定于 eclipse 的类。
模式(如 vim 正常模式)是核心类。它们包含命令。有一些特定于特定 Eclipse 编辑器的命令(例如运行此特定于 JDT 的重构)。这些命令实现了核心接口(interface),但它们的代码(显然)存在于特定于 eclipse 的项目中。创建模式时,它会向底层平台询问一些额外的命令——这些额外的命令是在 eclipse 插件中实现的。这是当 eclipse 中的延迟类加载使运行时一切都崩溃时 - 扩展点引用了额外命令的类,但它们尚未加载。轰隆隆,异常(exception)。
我试图通过使用“一个插件来统治它们”的方法来解决这个问题。
只有一个插件对我来说似乎是更好的解决方案,但我无法让它干净利落地工作。
对我来说唯一成功的是一个相当丑陋的黑客。
所有 .core 项目都有一个 Ant 任务,用它们的类创建 .jar 文件
并将其放入相应的 *.eclipse 项目
*.eclipse 项目包含这些 jars 并将它们登记在 list 文件中。
这种丑陋的黑客方法的问题(除了它是丑陋的黑客)是
这种发展变得非常痛苦。 Eclipse 代码导航、代码覆盖率
Eclipse 中的其他一些东西停止工作。
概括
我们有 Eclipse 独立库 + Eclipse 特定的东西架构,
但是我们真的需要所有这些都包含在一个插件中(因为在两个方向上都有一些依赖项)。
如何将少数项目中的代码活成一个插件/片段?
我是一名优秀的程序员,十分优秀!