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

时间:2009-02-15 23:55:41

标签: java packages

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

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

然而,我不能在这些类上使用“包”或默认级别访问,因为我们导出的类需要使用它们。

阻止或阻止我的API用户出于自身目的使用这些类的最佳做法是什么?有自动检查器吗?

我承认当我别无选择时,我已经涉足了使用Eclipse的一些内部类:)

澄清:我对非插件代码有类似的需求。

3 个答案:

答案 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"

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

  1. 右键单击项目并选择“新建源文件夹”(可能将其命名为“internal-source”)
  2. 右键单击项目,然后选择“属性”
  3. 转到Java Build Path
  4. 单击“订购和导出”选项卡
  5. 取消选中您不想导出的源文件夹
  6. 只有在“订购和导出”下检查的源文件夹才会添加到引用项目的类路径中。

答案 2 :(得分:-5)

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

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

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