2014-07-04 40 views
0

我正在努力围绕开发OSGI包发布给卡拉夫。在创建新项目时,我使用Netbeans 7.4和创建Maven OSGI包。我认为我正在处理不同项目之间的依赖关系,并在Netbeans中与他们合作,然后发布给Karaf。在Netbeans和Karaf中开发OSGI包时如何管理依赖关系?

我想要做的是建立一个REST Web服务;我发现this tutorial是一个很好的起点,可以让一些基本的东西运行起来。所以我开始用子项目设置一个父项目(所有这些都来自Maven OSGI Bundle模板)。但是,在我开始部署捆绑到我的Karaf实例后,我开始在Karaf内部与“缺失的要求”错误搏斗。我会开始尝试列出每个依赖关系<Export-Package><Embed-Dependency>,但似乎我只是继续往下走,总是得到新的“缺少要求”消息列出另一个依赖项。然后我开始尝试使用maven copy-dependencies插件来导出我的项目中使用的任何依赖关系,并将所有出现在Karaf deploy文件夹中的副本都复制出来。这在很大程度上是有效的,但我正在与我认为是第三方jar的下游依赖关系摔跤,但无论如何,这可能是一个单独的问题。

所以,我想知道的是我应该如何使用此设置开发一个连贯的“应用程序”?我知道我应该把所有东西都分成独立的捆绑包;即将我的REST接口作为一个接口,将实现作为另一个接口,将业务逻辑作为另一个接口。作为maven项目,如果我有日期时间处理或字符串实用程序的依赖项,maven将处理所有这些问题。但是这些依赖不会自动包含在我的OSGI包中,是这种情况吗?什么是工作流程,以确保我的项目所依赖的一切都可用于Karaf中的包?我的项目是否有其他项目作为依赖关系,即接口实现?我会将该项目作为依赖项包含在它的编译中,但是如何确保在项目发布后符合该依赖项?

回答

1

使用OSGi时,编译时和部署时的依赖关系不匹配确实是一个问题。

你需要知道的是这些如何相互关联。在编译时你有maven的依赖。当你建立你的项目时,maven bundle plugin会为你创建必要的Import-Package和Export-Package语句。大多数时候这只是简单的工作,你应该避免手动调整太多。

所以在构建之后,Manifest指定了生成的包需要的内容,但是这并不能自动确保满足相关性。所以当你将这个包部署到karaf时,你会得到关于缺失依赖关系的错误。这个是正常的。

现在您需要安装满足这些依赖关系的其他包。通常你可以简单地安装你的Maven依赖关系的罐子(如果它们是捆绑的)。这并不总是工作。因此,基本上你会安装捆绑软件并检查现在是否符合要求。

与卡拉夫的好处是,许多更大的依赖项,如cxf已经可以作为功能。因此,在尝试按包捆绑安装它们之前,首先尝试通过安装可用功能来获取依赖关系是个不错的主意。

所以这可以帮助你正确地获得你的依赖关系。然后,对于“制作”,使用最好的解决方案是创建您自己的功能文件,并引用您找到的包。

使用deploy dir安装bundle看起来很不错,起初它不是一个好的解决方案。更好地使用karaf提供的mvn:url语法直接从maven安装捆绑包。

关于嵌入依赖关系。有时候这是一个很好的解决方案,但往往只会让事情变得更糟,因为它会导致很难解决的软件包使用冲突。如果可能的话,最好不要嵌入任何东西。

+0

谢谢,这非常有帮助!我认为我的问题的一部分是,我的一个捆绑包依赖于第三方的jar,我在Karaf中遇到了麻烦。我认为这抛出了一些试图使用它的捆绑包。现在对我来说更有意义,但我可能会打开一个针对该问题的新问题。 还有一个 - 在Karaf/OSGI中,配置变量是如何处理的?也就是说,针对开发者开发,然后再将服务指向生产层?通常我会使用某种参数或配置文件,但这是如何工作的? –

+1

在OSGi中,通常最好使用配置管理服务处理配置。在karaf中,它被映射到etc目录中的配置文件。我写了一篇关于此的教程:http://www.liquid-reality.de/x/G4Be –

+0

谢谢!我已经浏览了示例,并设置了蓝图设置和.cfg文件。我的设置在Karaf控制台中可用,我可以对其进行修改,但这一更改似乎并未反映在我的捆绑应用程序中。至少refresh()方法永远不会被触发。从代码中读取配置值有没有诀窍?如果使用Blueprint进行配置,是否需要使用纯OSGI接线(ConfigUpdater)? –

相关问题