我正在努力开发OSGI捆绑包以发布到Karaf。在创建新项目时,我正在使用Netbeans 7.4和Create Maven OSGI包。我认为我正在努力解决的问题是处理不同项目之间的依赖关系,并在Netbeans中与他们合作,然后发布到Karaf。
我要做的是建立一个REST Web服务;我发现this tutorial是获得基本启动和运行的良好起点。所以我开始用子项目设置一个父项目(所有这些都来自Maven OSGI Bundle模板)。但是在我开始将捆绑包部署到我的Karaf实例后,我开始在Karaf中解决“缺少要求”错误。我开始尝试列出<Export-Package>
或<Embed-Dependency>
中的每个依赖项,但似乎我只是继续向下走,并总是得到新的“缺少需求”消息列出另一个依赖项。然后我开始尝试使用maven copy-dependencies插件来导出我的项目中使用的任何依赖项,并复制出现在Karaf部署文件夹中的任何内容。这在很大程度上起作用,但我正在努力解决我认为的第三方jar的下游依赖关系,但这无论如何都可能是一个单独的问题。
所以,我想知道的是我应该如何使用这种设置开发一个连贯的“应用程序”?我知道我应该将所有内容分成独立的捆绑包;即,我将我的REST接口作为一个,实现作为另一个,业务逻辑作为另一个。作为一个maven项目,如果我有一个日期时间处理或字符串实用程序的依赖项,maven将处理所有这些。但是这些依赖关系不会自动包含在我的OSGI包中,是这样吗?确保我的项目所依赖的所有内容都可用于Karaf中的捆绑包的工作流程是什么?那些将其他项目作为依赖项的项目,即接口实现呢?我会将该项目作为依赖项包含在内,以便进行编译,但如何确保在发布后满足该依赖项?
答案 0 :(得分:1)
在使用OSGi时,编译时和部署时依赖项之间的不匹配确实是个问题。
您需要知道的是这些是如何相互关联的。在编译时,您有maven依赖项。构建项目时,maven bundle插件会为您创建必要的Import-Package和Export-Package语句。大部分时间这都是有效的,你应该避免手动调整太多。
因此,在构建之后,Manifest指定了生成的bundle需要什么,但这并不会自动确保满足依赖性。因此,当您将软件包部署到karaf时,您会收到有关缺少依赖项的错误。这很正常。
现在您需要安装满足这些依赖关系的其他bundle。通常,您可以简单地安装maven依赖项的jar(如果它们是bundle)。但这并不总是有效。所以基本上你安装捆绑包并检查现在是否满足要求。
karaf的好处在于,许多更大的依赖项如cxf已经可用作功能。因此,在尝试逐个捆绑安装可用功能之前,首先尝试获取依赖项是个好主意。
这样可以帮助您正确获取依赖关系。然后为&#34;生产&#34;使用最佳解决方案是创建自己的功能文件,您可以在其中引用您找到的包。
虽然使用deploy dir安装bundle似乎很不错,但这不是一个好的解决方案。最好使用karaf提供的mvn:url语法直接从maven安装bundle。
关于嵌入依赖项。有时它是一个很好的解决方案,但通常只会使事情变得更糟,因为它可能导致难以解决的包使用冲突。如果可能的话,最好不要嵌入任何东西。