避免重复在maven依赖项中导入的OSGi?

时间:2011-06-20 23:47:35

标签: java eclipse maven osgi

目前,当我在写一个包依赖于一个包时,我必须“导入”或“依赖”包含该包的Maven中的整个其他包。

这似乎对OSGi给我的产生了反效果。

例如,假设我有两个捆绑包:BundleAPI和BundleImpl。

BundleAPI提供API接口:

// BundleAPI's manifest
export-package: com.service.api

BundleImpl提供了实现:

//BundleImpl's manifest
import-package com.service.api

然而,当我在Eclipse中编写 BundleImpl 时,我被迫在 BundleAPI 本身的“maven POM”中“依赖” - 所以eclipse不会抱怨。

//BundleImpl's POM
<dependency>
    <groupId>com.service</groupId>
    <artifactId>com.service.api</artifactId>
    [...]
</dependency>

所以 - 一方面,我只依赖于 com.service.api ,而另一方面 - 我需要拥有整个包 - BundleAPI

有没有办法让maven或eclipse足够智能,只是在某处找到包,而不是整个包?

我对这是如何工作非常困惑 - 这里的任何类型的清晰度都会很棒。也许我错过了一些从根本上说简单的事情?

3 个答案:

答案 0 :(得分:7)

关键是区分构建时依赖性和运行时依赖性。

在构建时,您必须依赖于整个工件,即JAR文件或包。由于Java编译器的工作方式,这几乎是不可避免的。但是,在运行时,您只依赖于捆绑中使用的包,这就是OSGi管理运行时替换的方式。这是最终包中的Import-Package语句。

当然作为开发人员,您不希望列出两个并行的依赖关系集,这将是疯狂的。幸运的是,maven-bundle-plugin基于一个名为bnd的工具,它基于分析代码并发现所使用的实际包来为您计算Import-Package语句。其他工具,如bndtools(一个基于Eclipse的OSGi开发IDE)也以这种方式使用bnd。顺便说一句,bnd比任何人做这项工作都更可靠和准确!

因此,您只定义构建时所需的模块级依赖项,该工具会生成运行时程序包级依赖项。

我建议不要使用Tycho,因为它会强迫您使用Eclipse PDE,这反过来会迫使您手动管理导入的包(为了完全公开,我是与PDE竞争的bndtools的作者)。 p>

答案 1 :(得分:4)

您无法使用Maven和eclipse开发常规Java项目等捆绑包。你基本上有两个选择。

  • Apache Felix Bundle Plugin:基本上,您将项目开发为常规Java项目,并像往常一样使用Maven。此插件将用于在部署时将所有OSGi细节添加到jar清单,以便OSGi启用它。这种方法的缺点在于您在工作空间中使用Java项目而不是捆绑包,这使得在OSGi容器中运行项目需要额外的工作,因为Eclipse不会将其识别为插件项目。因此,您必须手动将Maven构建中的jar添加为目标平台的一部分。
  • Tycho:这是另一个Maven插件,它试图将这两个环境结合在一起,并且做得非常好。在这种情况下,您实际上创建了一个Eclipse bundle / plugin项目,这显然可以在Eclipse中实现无缝集成。然后pom将项目标记为eclipse-plugin类型,这有效地使Maven通过目标平台而不是Maven本身解析项目依赖项(在清单中定义)。

我会采用Tycho方法,因为它为Eclipse提供了更加集成的方法。

答案 2 :(得分:0)

将整个jar视为依赖应该不是问题,无论如何你都必须使用Maven。