控制对“.internal”包的访问的最佳实践

我编写Eclipse插件并将一些类导出为API,同时希望限制对其他类的访问。

我按照常见的Eclipse实践将这些类分成“.internal”子包。

但是,我不能在这些类上使用“包”或默认级别访问,因为它们中的许多都需要由我导出的类使用。

防止或阻止我的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清单不对第三方(希望使用.internal)强制执行任何操作,但为需要它们的人提供“通知”和限制。

对于插件项目 :使用Stephen提到的Manifest设置。 (您也可以通过Manifest编辑器的“运行时”页面进行编辑。请注意,如果您只想将包暴露给特定的插件,您也可以使用它

 Export-Package: com.javadude.foo;x-friends:="com.javadude.fee" 

对于非插件项目 :使用单独的源文件夹来定义从项目中导出的内容。

  1. 右键单击项目并选择“新建源文件夹”(可能将其命名为“internal-source”)
  2. 右键单击项目,然后选择“属性”
  3. 转到Java Build Path
  4. 单击“订购和导出”选项卡
  5. 取消选中您不想导出的源文件夹

只有在“订购和导出”下检查的源文件夹才会添加到引用项目的类路径中。

除非您必须使用受信任的库处理其他人的不受信任的代码,否则请不要限制它。

需要内部/程序包访问有时会表明您的API设计失败,直到很久以后才能知道。

将其公之于众,将其命名为InternalWhatever,并与之共存。