目前,当我在写一个包依赖于一个包时,我必须“导入”或“依赖”包含该包的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足够智能,只是在某处找到包,而不是整个包?
我对这是如何工作非常困惑 - 这里的任何类型的清晰度都会很棒。也许我错过了一些从根本上说简单的事情?
答案 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项目等捆绑包。你基本上有两个选择。
我会采用Tycho方法,因为它为Eclipse提供了更加集成的方法。
答案 2 :(得分:0)
将整个jar视为依赖应该不是问题,无论如何你都必须使用Maven。