我熟悉Import-Package
和Export-Package
,但这对我来说是新的。它有什么作用?私人包清单标题做什么?
回答
在OSGi容器运行时,它什么都不做。事实上,它甚至没有在OSGi规范中提到过(我检查过R4)。
但是,它可以在构建时由bnd使用的.bnd
文件中指定。如果是这样,它可以用来确定进入捆绑包的内容。 当bnd构建一个包时,它会自动确定哪些类需要进入包中。包含所有导出的包中的类都包含在内,并且它们所依赖的所有类(传递式)也包含在内。这意味着如果一个类似乎没有被使用,那么它将不会被包含在该包中。但是,您可以使用Private-Package指令告诉bnd将软件包的内容包含在软件包中,即使它看起来未被使用。如果未指定Private-Package指令,则它将由bnd自动生成。
为Private-Package的文档的内容如下:
私人包
夹杂物的方法是相同的导出-Package头,唯一的区别是,是,这些包不出口。这个头文件将被复制到清单中。如果通过noth选择了一个包,则导出优先。
私营包= COM。*
其实私募套餐并不仅仅是没有导出包的更多。如果Private-Package中指定的包没有在您自己的项目中定义并且没有导入到Import-Package中,那么它们会自动内联到您的jar中。所以这是包含非OSGi依赖关系的简单方法。请小心,但内联很容易导致类路径问题。
如果你知道什么静态链接然后你明白私人包装。否则继续阅读。
Private-Package是bnd的方式,告诉你必须在jar中但不导出的包。它是而不是一个OSGi头,但一个bnd'指令'。
该指令定义了必须包含在JAR中的类路径中的包(带有通配符)。 bnd是独一无二的,它从规范中填充JAR,而不是像大多数构建工具那样的目录。原因是,除非模块是“设计好的”,并仔细考虑了它们的布局,否则它们很少提供模块化的优势。
通常,Private-Package指定包含不应与其他包(即实现类)共享的类的包。尽管通常它们来自bnd所用的相应项目,但在类路径中从任何其他JAR获取它们是完全可以接受的。
一个用例是一个带有utils的库。在一个bundle中转换一个util库通常会对依赖造成严重破坏,因为utils往往依赖于很多不相关的东西;你使用一种微小的方法,突然你拖入30Mb的依赖关系。 bnd本身在aQute.lib *包中大量使用此模型,因此不应该导出此库中的包。这是一个捆绑规模和'下载互联网'之间的交易。Eclipse和Apache Felix的世界之间可以区别。 Apache Felix捆绑包通常是独立的,不需要各种支持和util捆绑包,而Eclipse的捆绑包往往需要大量的管道捆绑包。我认为这种差异很大程度上是由Eclipse的PDE引起的,它使得包含其他项目的软件包成为不可能,除非您复制源代码当然是一个很大的禁忌。
在C世界里他们有一种叫做静态链接的东西。链接程序后,任何未解决的问题将从库中检索并添加到目标中。在一定程度上私人包装是相同的想法。实际上有一个头条件包,它静态地链接指定的包和它们传递依赖的任何东西(只要它们落入模式中)。
最后,bnd显示未在清单中的Private-Package标头中导出的扩展包。毕竟,清单应该描述的内容...
如果您是作者,您可以删除与-removeheaders头:与< _removeheaders私人封装(或行家>私营包
- 1. 什么是清单。/ ...做什么?
- 2. 什么是私人包裹的交易?
- 3. 什么是隐藏私人网址的做法?
- 4. 'bower update'在私人git回购上做了什么?
- 5. Module.private_constant做什么?有没有办法只列出私人常量?
- 6. 作曲家私人包装问题
- 7. 保持NuGet包私人化的问题
- 8. 做一个C LIB“私人”
- 9. 测试人员做什么?
- 10. 标题中的私人类型定义?
- 11. 什么是清单?
- 12. 什么是班级私人名字?
- 13. 什么是.Net中的私人组装?
- 14. java有什么私人领域?
- 15. 为什么用户私人功能?
- 16. 为什么私人会员继承?
- 17. 为什么允许私人入口?
- 18. 清除标题单页
- 19. 包括什么都不做
- 20. 什么是“#包括‘myfile.php’做
- 21. 嘲讽包私人类
- 22. 设置私人pypi包?
- 23. Azure网站私人包源
- 24. 包括私人范围
- 25. 我想弄清楚我的清单有什么问题
- 26. TortoiseSVN清理实际上做了什么?
- 27. 单身人士目标c澄清
- 28. iSCSI数据包的理解和每个人做什么
- 29. Amazon EC2 - 什么是私人DNS和私有IP?
请问为什么BND不“私人包装”所有的非出口类?如果你的项目中有一个类,那是因为你需要它;所以如果它没有出口,它不应该是私人的。的话,你什么时候不需要导出包或者私有包 - 一个包? – Hilikus
你必须指定私有包,因为bnd并不假定所有来自src目录的类都应该包含在内,所以没有范围允许减少导出软件包。bnd的类路径上的任何软件包都可以包含在软件包中遗弃或出口。这样,bnd可以从一个单独的项目中构建多个bundle,这与大多数构建环境不同。它还允许导出包提供的API包,即使它们来自另一个包/ jar。 –