我编写Eclipse插件并将一些类导出为API,同时希望限制对其他类的访问。
我遵循将这些类分成“.internal”子包的常见Eclipse实践。
然而,我不能在这些类上使用“包”或默认级别访问,因为我们导出的类需要使用它们。
阻止或阻止我的API用户出于自身目的使用这些类的最佳做法是什么?有自动检查器吗?
我承认当我别无选择时,我已经涉足了使用Eclipse的一些内部类:)
澄清:我对非插件代码有类似的需求。
答案 0 :(得分:8)
是不是只是将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清单不对第三方(希望使用.internal)强制执行任何操作,但为需要它们的人提供“通知”和限制。
答案 1 :(得分:2)
对于插件项目:使用Stephen提到的Manifest设置。 (您也可以通过Manifest编辑器的“运行时”页面进行编辑。请注意,如果您只想将包暴露给特定的插件,您也可以使用
Export-Package: com.javadude.foo;x-friends:="com.javadude.fee"
对于非插件项目:使用单独的源文件夹来定义从项目中导出的内容。
只有在“订购和导出”下检查的源文件夹才会添加到引用项目的类路径中。
答案 2 :(得分:-5)
除非您必须使用受信任的库处理其他人的不受信任的代码,否则请不要限制它。
需要内部/程序包访问有时会表明您的API设计失败,直到很久以后才能知道。
公开,将其命名为InternalWhatever,并与之共存。