`
snoopy7713
  • 浏览: 1141161 次
  • 性别: Icon_minigender_2
  • 来自: 火星郊区
博客专栏
Group-logo
OSGi
浏览量:0
社区版块
存档分类
最新评论

为什么我们需要Bnd?

    博客分类:
  • OSGi
阅读更多

为什么我们需要Bnd?

刚收到一个Google提醒,是关于一篇谈论OSGi的博客文章。文章作者Jilles van Gurp开篇便称赞OSGi,但随之抨击OSGi的一些工具。他不能忍受的关键,在于需要把包的导入一行一行的加到manifest,他还认为manifest的格式很糟糕。

我不同意他的看法,因为Bnd完全可以满足他提到的需求。

管理bundle之间的依赖比简单的import要难得多。以前我想要用某个库, 我就下载下来放在classpath里,在代码里敲一些首字母,用ctrl+space就可以知道他里面的API。但在OSGi里就比较麻烦了,你把 bundle下载下来(假如网上有的话),还要判断它里面暴露了哪些包,然后才能决定究竟使用哪些包。

我赞同Eclipse JDT是比PDE功能更加强大,更加好用。但如果用bnd工具,你就可以像你刚才描述的那样工作。你可以像以前一样使用库,你甚至不需要使用PDE,比如 我就只用Eclipse JDT来完成工作。Bnd会读取配置文件里的描述来决定classpath的哪些内容会被打到bundle里。通配符和默认值使得这个描述尽可能的短。然 后Bnd会计算需要导入的包和其它一些相关信息。

大部分库不是以bundle的形式发布的。bundle是一个新的概念,他不能向 后兼容以前的jar包(而这是很多第三方提供库的主要形式)。我认为这是一个没必要的限制,他们更应该默认的把jar看成导出所有包而且引用所有依赖包的 bundle。从jar里取到这些信息应该是不难的,至少应该提供一个工具给我们做转换之用吧

跟上面说的一样,通过使用Bnd,你的这些要求也可以得到满足。Bnd有一个封装功能就是做这个转换。但实际上很多jar文件的依赖关系都很糟糕,所以这 个转换也不是那么轻松。我们经常需要加入可选的导入或者忽略导入来使得bundle能够被安装到系统中。当你分析一个JAR文件时(Bnd就可以完成这个 功能),你经常会发现里面有大量没用到(或很少用到)的依赖。

最后,我很讨厌要写这样一个格式糟糕的属性文件(manifest),我发现需要在manifest后加上一个空行的bug仍然存在(如果少了这个会出莫名其妙的错误)。这个就像makefile里必须用tab而不能用空格一样令人烦恼

嗯,这个确实有点烦,但是通过使用Bnd,你也不用再担心这些小事。一个bnd文件就是一个属性文件,而且不管你文件中的一行需要多长,它都能够处 理。行可以通过“”来延续到下一行,谁会在乎多出的最后一个空行呢?你还可以在文件中添加注释。Bnd读取这些属性,通过Java内嵌的 Manifest类生成一个规范的manifest。在读取过程中Bnd会检查属性头是否正确。我们随便看一个Bnd的例子,它可能像这样:

Export-Package: aQute.service.*



Import-Package: javax.servlet.http;version="[2,3)", *

然而,Jilles的抱怨还没结束,他又对OSGi有意见了:

当然我们有一个更好的方式来做这个,就是使用Java5.0里刚引入的 annotations。可以理解OSGi需要兼容老的版本(使得拙劣的设计也有台阶下),但很明显我们应该更注重对新版本的应用,抛弃陈旧的方式。实际 上,对于导入和导出包来说,我更希望能把粒度细化到类和方法的层面上

Annotations现在比较流行了,他们在自己的领域发挥的很好。但这应该是一个分离关注点的问题。我想我们都知道要分离业务逻辑和底层架构。在类或 方法里加入annotations来定义约束显然会搞乱你的代码。我也认为让用户自己管理依赖挺复杂。我们需要更好的工具支持,让用户手动管理代码里的依 赖很容易错误百出。所以我不确定annotations能解决问题。通过在代码里定义版本号(编辑manifest或包目录下的 packageinfo文件),Bnd可以找出引用的包版本。这种方式简单一致,尽管它不能处理版本范围。我大概知道要怎么做可以处理版本范围(在 classpath里允许同一个包有多个版本,然后比较版本之间的差异),但是,这需要时间。。。

还有一个问题,在java中包没有它们自己单独的表达方式。它们只是在类的包声明里被提到,但没有自己的独立表述。这意味着很难针对包添加annotation(不过你可以通过package-info.java来达到这个效果)。

仍旧像刚才说的那样,我不确定annotations是不是最佳方案,因为它会把业务逻辑的代码搞得很乱。在OSGi中,你可以通过manifest(或者Bnd)来定义包的属性。

此外,Bnd还有很多其它特点,比如说下面这些:

* Bnd还被用在Maven构建工具的Felix Maven-bundle插件中。
* Bnd还是一个Eclipse插件,它在.bnd和.jar文件的右键菜单中添加了执行项。
* 可以集成来自任何地方的资源,无论是通过文件系统还是URL。不需要首先为这些资源找一个文件夹来放置,因为JAR文件的构建是实时进行的。
* 资源名称中可以包含变量,这些变量在构建时会被自动替换成实际值。
* 通过在classpath中定义包引用,可以很容易地把这些包集成到jar中。如果你只是想依赖另一个bundle的某一部分,而不想产生额外的依赖,这样做是很方便的。
* Bnd也可以在导出时生成uses语句。uses语句用来表述当前包要用到的所有包。框架将会用这些信息来创建一致的类空间。
* 可以内联其他Jar文件或目录。
* 还有很多很多。。。

我不是说Bnd已经完美了。我希望能多花点时间来扩展它,让它看着就像这样:一个管理依赖的图形编辑器,有着更好的语法支持,与Eclipse构建器集成得更好,等等。

Peter Kriens

(译完)

分享到:
评论

相关推荐

    BND2-v2.0.zip

    "BND2-v2.0.zip" 是一个压缩文件,其中包含了"BND2"软件的第二个主要版本,版本号为2.0。这个名称表明这是一款经过升级和改进的产品,可能修复了旧版本的问题,并添加了新的功能。 **描述分析:** 该描述指出,...

    百度下载神器-BND1.rar

    【标题】"百度下载神器-BND1.rar"指的是一个压缩包文件,其中包含了一款名为“百度下载神器”的工具,其版本为BND1。这款软件设计用于提升用户从百度网盘下载文件的速度,尤其对普通用户来说,其速度可能高达普通...

    佰诺德BND800A系列变频器

    功能码的查看和修改通常需要遵循特定的操作步骤。 4.3 上电初始化 首次接通电源时,变频器将进行自我检测和初始化,确保所有内部参数设置正确。在此过程中,观察显示屏上的指示,确认无异常。 4.4 故障保护 当变频...

    BND2-v2.0.0-mac.dmg.zip

    这款名为"BND2"的软件,以其独特的功能——“不限速下载”,为Mac用户带来了全新的下载体验。 首先,我们需要理解“不限速下载”这一概念。通常,当我们通过浏览器或普通下载工具下载文件时,下载速度会受到网络...

    bnd, bnd,用于OSGi的瑞士军刀 构建OSGi包的工具.zip

    bnd, bnd,用于OSGi的瑞士军刀 构建OSGi包的工具 自述文件bnd是针对OSGi的军刀,它基于分析类代码,验证设置,验证你的设置,并对项目的依赖关系进行验证,并提供了相应的日期和时间。关于bnd的信息可以在 ...

    BND1-v4.0.0-windows.zip

    结合以上信息,我们可以推测BND1是一个专门针对百度网盘设计的第三方下载管理器,其主要目标是提高从该平台下载文件的效率。 在压缩包内只有一个文件名"bnd1",这很可能是BND1软件的主程序或安装程序。用户解压后,...

    BND2-v2.0.0.zip

    标题"BND2-v2.0.0.zip"指的是一个名为"BND2"的软件的版本2.0.0的压缩包文件,后缀为".zip",表明这是一款使用ZIP格式压缩的文件集合。这种类型的文件通常包含了多个相关联的文件或程序,便于用户一次性下载并解压...

    MIYANO BND-51YS2.rar

    MIYANO BND-51YS2支持G代码编程,用户需要掌握基本的编程语句,如直线插补、圆弧插补、螺纹切削等,以及如何使用宏程序进行复杂形状的加工。同时,设备还可能配备有自动换刀系统,需要了解其工作原理和换刀指令。 ...

    BND2第三方网盘.rar

    BND2 是一款图形界面的百度不限速下载器,支持 64 位 Windows 和 Mac

    bnd-2.1.0.jar

    Jar转换为Bundle工具

    BND2-百度云盘不限速

    在提供的压缩包子文件“BND2-v2.0.0-windows.exe”中,我们可以看出这是BND2的Windows平台安装程序。这意味着该工具支持在Windows操作系统上运行,用户只需执行这个.exe文件,按照安装向导的指示,即可完成BND2的...

    BND_mac_linux_window.zip

    为了解决这一问题,出现了名为BND的第三方下载工具,它支持Mac、Windows和Linux三大操作系统,旨在提供不受限的下载速度,极大地提高了用户在使用百度网盘时的效率。 BND,全称为“Baidu NetDisk Download”,是一...

    bnd 下载速度加快

    加快下载速度呢能够有限提高百度云下载速度,同时含有下载方法

    Bnd_SD.shx

    Bnd_SD.shx

    aqute-bnd-0.0.363-11.el7.noarch.rpm

    离线安装包,亲测可用

    BND2-v2.0.0-windows

    百度云下载工具,百度云速度破解工具

    BND2-v2.0.0-windows.rar

    为了解决这一问题,出现了各种第三方下载工具,其中之一便是我们今天要探讨的"BND2-v2.0.0-windows"。这个压缩包文件包含了专为Windows系统设计的百度网盘不限速下载器,旨在提供更加流畅的下载体验。 首先,我们...

    Go-BND是一个用golang编写的百度网盘不限速下载器

    【标题】"Go-BND:基于Golang的百度网盘高速下载工具" 【知识点详解】 在互联网上,百度网盘因其大容量存储和分享功能而广受欢迎。...同时,通过开源社区的合作与迭代,Go-BND持续优化,为用户提供更好的服务。

    bnd-platform-sample:使用 bnd-platform 构建一组 OSGi 包和 Eclipse 更新站点的示例项目

    查看build.gradle和modules/ 中的脚本文件,看看您可以使用bnd-platform做什么,并使用./gradlew或gradlew.bat运行构建以从示例中配置的依赖项创建 OSGi 包和 Eclipse 更新站点. 创建的包将驻留在build/plugins 中...

Global site tag (gtag.js) - Google Analytics