我想创建插件的“克隆”。我要更改插件 ID 以同时加载它们,但我应该更改类的名称吗?Eclipse 能否为每个插件使用不同的类路径,或者它只是从单个堆中的包中加载所有类?
2 回答
这是否有效取决于您在问题中未指定的因素,因此我将向您介绍 Eclipse 中类加载的工作原理,您可以自行决定。
Eclipse 在顶级 OSGi 上运行。每个 Eclipse 插件都是一个 OSGi 包。每个包都有自己的类加载器。这个类加载器会看到包含在包中的类以及来自包依赖项的类。捆绑包有两种指定依赖项的方法。这两种方法都通过 bundle 的 MANIFEST.MF 文件中的条目起作用。一种方法是使用 Require-Bundle 构造来依赖于整个其他包。使用此方法,捆绑包将看到其依赖项通过 Export-Package 导出的所有包。第二种方法是使用 Import-Package。使用这种方法,bundle 将找到这样一个包,任何 bundle 都通过 Export-Package 导出。您还可以在生产者端对捆绑包和包进行版本控制,并在依赖端限制版本。
所以,有了这些知识,你需要问自己这些问题......
是您正在克隆的捆绑包,通过 Export-Package 导出任何包。如果没有,那么你会没事的。
哪些捆绑包当前指定您的原始捆绑包并将通过 Require-Bundle 指定克隆?您要避免的是单个包在 Require-Bundle 中同时指定 Bundle.Original 和 Bundle.Clone 的情况。如果需要这样的安排,您将不得不重命名克隆的包。
最后要检查的是任何包是否在任何导出包上使用 Import-Package。如果是这样,您将需要对原始包进行版本化并以不同方式克隆。这发生在 Export-Package 指令中。您还需要在 Import-Package 指令中仔细指定版本约束,以使其与原始版本或克隆版本相匹配。未能对包进行版本化和约束导入将导致在运行时找到哪个版本的看似随机的行为。同样,如果单个下游包需要导入原始包和克隆包,则需要重命名克隆包。
虽然您可以拥有具有相同类名的不同插件,并且所有插件都有不同的类加载器和类路径,但 JVM 不允许您实际加载具有相同名称的两个类。