我编写 Eclipse 插件并将一些类导出为 API,同时希望限制对其他类的访问。
我遵循将这些类分成“.internal”子包的常见 Eclipse 做法。
但是,我不能在这些类上使用“包”或默认级别访问,因为其中许多需要由我正在导出的类使用。
防止或阻止我的 API 用户将这些类用于他们自己的目的的最佳做法是什么?有自动检查器吗?
我承认当我别无选择时,我曾涉足使用 Eclipse 的一些内部类 :)
澄清:我对非插件代码有类似的需求。
这不仅仅是将 META-INF/MANIFEST.MF 更新为插件 osgi 项目的情况(如果还没有的话?)。它应该看起来像:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: My-plugin
Bundle-SymbolicName: com.mycompany.mypluginname
Bundle-Version: 1.0.0
Bundle-Vendor: MyCompany
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Service-Component:
Import-Package: org.apache.log4j;version="1.2.14" (, separated etc)
Export-Package: com.mycompany.mypluginname.myapipackage;version="1.0.0"
然后很好地省略 .internal 包。平台应该完成其余的工作。
顺便说一句,然后你使用 Import-Package: 在任何依赖的包、插件等中,而不是依赖于 jar/项目(这是旧的、糟糕的方式,它不起作用 - 正如你所发现的那样)。
这使您可以大量解耦代码依赖项。如果你决定你的插件代码应该属于不同的 jar/bundle,你只需移动单个包,然后让新的 bundle/plug-in 导出它。由于客户端包只是从“云”(云是 OSGi 平台)导入包,因此您可以更自由地移动代码。
注意:如评论中所述,您无需在 OSGi 中运行您的应用程序即可获得此“好处”。Eclipse 可以在 OSGi 包限制下编译它的代码,并且您的构建/服务器可以在“不受保护的世界”中运行。例如,OSGi 清单不会对第 3 方(希望使用 .internal)强制执行任何操作,但会向需要它们的人提供“通知”和限制。
除非您必须使用您信任的库来处理其他人的不受信任的代码,否则请不要限制它。
需要内部/包访问有时表明您的 API 设计失败,直到很长一段时间后您才能知道。
将其公开,将其命名为 InternalWhatever,并接受它。