0

我正在用 Java 构建一个基于插件的程序,因此我想保持项目的封闭源代码,但允许第 3 方开发人员创建插件。我正在使用的系统正在运行,但这只是因为我(当然)可以完全访问源代码。

基本上,插件从 Plugin.java 继承,它们可以利用 ServerManager.java 来执行某些关键功能。如何使用户能够看到这些类的接口(即他们知道 ServerManager 具有 sendMessage() 函数并且插件类可以覆盖 onMessage() 函数)而不向他们提供完整的源代码。

来自 Objective-C 背景,我将 .h 文件用于这些“接口”,将 .m 文件用于源(私有)——然后我只提供 .h 文件——显然在 Java 中没有这样的东西一个.h文件!

提前致谢 :)

4

4 回答 4

3

一种方法是创建一个接口,让它公开,并提供该接口的实现。

例如:

interface Light{
    void turnOn();
    void turnO();
    void setBrightness(int newValue);
    void setTimer(int timeoutSeconds);
}

然后你在一个私有文件中定义你的实际类:

class MyLight implements Light {
    void turnOn() {
      // implementation
    }
    // etc..
}

您可以提供一个为用户生成 MyLight 对象的 Factory 类。

于 2013-01-28T11:49:53.507 回答
1

因为那个 java 有SPI,服务提供者接口。这里有一篇文章

该机制有一个接口,公开可用,最好在它自己的库中。

(几个)实现者提供了一个 jar,其中一个(或多个)实现类在一个文本文件中指定,接口名称在 META-INF 下。

然后java有一个API来选择一个实现,或者列出所有。

这是一个相对简单和通用的机制,查看官方javadoc。对于 XML 实现,它被使用。

于 2013-01-28T11:54:34.610 回答
0

你可以在这里打点类似的东西。创建一个开源接口,客户端将在他身边执行实现。

大多数 java EE 世界都是这样工作的。例如,您有一个像这样的接口定义http://jsr311.java.net/nonav/javadoc/index.html并且有多个不同的供应商 imepmentations。同样,您的代码将具有用于访问插件的接口。

Atlassian Confluence 完成了一种类似的实现,其中产品是封闭源代码,除非您拥有源代码的特定许可证,但插件开发完全分离:https ://developer.atlassian.com/display/CONFDEV/Confluence+Plugin+Guide

于 2013-01-28T12:21:46.863 回答
0

如果您希望任何人看不到您的核心代码,那么您可以混淆所需的代码,您可以从混淆中跳过您想要向客户端公开以创建插件的部分。

于 2013-01-28T12:01:49.073 回答