当前位置:  开发笔记 > 编程语言 > 正文

在普通的java中拆分包

如何解决《在普通的java中拆分包》经验,为你挑选了2个好方法。

OSGi存在拆分包的问题,​​即相同的包但托管在多个包中.

是否有任何边缘情况,拆分包可能会在普通java(没有OSGi)中造成问题?

只是好奇.



1> Steve Powell..:

拆分包来自哪里

Require-Bundle使用清单头时会发生拆分包(在OSGi中)(我相信,在Eclipse的清单中).Require-Bundle命名用于搜索类的其他包(如果未Import编辑包).搜索在捆绑包自己的类路径被搜索之前发生.这允许从多个 bundle(可能是不同的jar)的导出中加载单个包的类.

OSGi规范(4.1)第3.13节描述Require-Bundle并且有一长串(意外)使用这个标题的结果(这个标题应该被弃用吗?),其中一部分专门用于拆分包.其中一些后果是奇怪的(而不是特定于OSGi),但如果您理解一件事,大多数都会被避免:

如果一个(在一个包中)由多个包提供,那么你就麻烦了.

如果包装件是不相交的,那么一切都应该是好的,除了你可能没有在任何地方可见的类,并且如果从拆分包的"错误"部分查看,包可见性成员可能看起来是私有的.

[当然这太简单了 - 可以安装多个版本的软件包 - 但是从应用程序的角度来看,任何时候软件包中的所有类都应该来自单个模块.

'标准Java'中会发生什么

在标准的Java中,没有花哨的类加载器,你有一个类路径,并且要加载的类的jar(和目录)的搜索顺序是固定的和明确定义的:你得到的就是你得到的.(但是,我们放弃了可管理的模块化.)

当然,你可以使用拆分包 - 它实际上很常见 - 它表明模块化程度很差.症状可能是模糊的编译/构建时错误,但是在多个类实现的情况下(一个在一个类路径中覆盖其余的),它通常会产生模糊的运行时行为,因为语义略有不同.

如果你是幸运的你最终看错误的代码,没有意识到这一点,并问自己"怎么能说可能做?"
如果你运气不好,那么你正在寻找正确的代码,并要求完全相同的东西 - 因为其他东西正在产生意想不到的答案.

这与旧的数据库格言并不完全不同:"如果你在两个地方记录同一条信息,很快它将不再相同".我们的问题是"很快"通常不会很快.



2> starblue..:

对于OSGi,无论名称如何,不同捆绑软件中的软件包都是不同的,因为每个捆绑软件都使用自己的类加载器。确保捆绑包不是问题,而是功能。

因此,在纯Java中,这通常不是问题,除非您开始使用一些使用类加载器的框架。加载组件时通常就是这种情况。

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有