当前位置: 首页 > 知识库问答 >
问题:

在Netbeans和Karaf中开发OSGI捆绑包时如何管理依赖关系?

从景曜
2023-03-14

我正在努力开发OSGI包以发布给Karaf。我在创建新项目时使用Netbeans 7.4和Create Maven OSGI包。我想我要做的是处理不同项目之间的依赖关系,在Netbeans中使用它们,然后发布到Karaf。

我试图做的是建立一个REST web服务;我发现这个教程是一个很好的起点,使一些基本的东西开始和运行。因此,我开始使用子项目设置父项目(所有这些都来自Maven OSGI Bundle模板)。但是,在我开始将包部署到我的Karaf实例之后,我开始与Karaf中的“缺少需求”错误作斗争。我开始尝试在 中列出每个依赖项,但似乎我只是继续往下走,总是会得到新的“缺少需求”消息,列出另一个依赖项。然后我开始尝试maven copy-dependencies插件来导出我的项目中使用的任何依赖项,并将出现的任何内容也复制到Karaf deploy文件夹中。这在很大程度上起作用了,但我正在纠结于我认为的第三方jar的下游依赖,但无论如何,这可能是一个单独的问题。

所以,我想知道的是,我应该如何开发一个连贯的“应用程序”与这个设置?我知道我应该把所有的东西分开成独立的包;也就是说,我将把我的REST接口作为一个,实现作为另一个,业务逻辑作为另一个。作为一个maven项目,如果我对日期时间处理或字符串实用程序有依赖关系,maven将处理所有这些。但是这些依赖项不会自动包含在我的OSGI包中,是这样吗?要确保我的项目所依赖的一切对Karaf中的包可用,工作流程是什么?如果我的项目有其他项目作为依赖项,即接口实现,那该怎么办?我会将该项目作为一个依赖项来包含,这样它就可以编译了,但是我如何确保在它发布之后满足该依赖项呢?

共有1个答案

梁丘凯定
2023-03-14

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

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

因此,在构建之后,清单会指定结果包需要什么,但这不会自动确保满足依赖关系。因此,当您将bundle部署到karaf时,您会得到关于缺少依赖项的错误。这很正常。

karaf的好处是,许多更大的依赖(如cxf)已经可以作为特性使用了。因此,在尝试逐个包地安装它们之前,首先尝试通过安装可用的特性来获得依赖项是一个好主意。

所以这可以帮助您正确处理依赖关系。那么对于“生产”使用,最好的解决方案是创建您自己的特性文件,在其中引用您找到的包。

虽然使用deploy dir安装包乍看起来不错,但它不是一个好的解决方案。最好使用karaf提供的mvn:url语法直接从maven安装包。

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

 类似资料:
  • 我是OSGi的新手。我正在使用Apache Felix。我已经构建了一个捆绑包,并且具有依赖性。当我尝试使用启动它会给我这个错误。 org . OSGi . framework . bundle exception:无法解析lk . ucsc . research . belly runner[20](R 20.0):缺失需求[lk . ucsc . research . belly runner

  • 我创建了一个依赖于SLF4J的捆绑包,因此使用Logback来实现OSGI。这一切都捆绑起来并安装正常,但是当我开始捆绑时,我得到以下异常: org.osgi.framework.BundleException: 無法解析 com.felix.test [20](R 20.0): missing requirements [com.felix.test [20](R 20.0)] osgi.wir

  • 以前部署的JDOM的OSGi包究竟是如何解决这些相同的依赖关系的?它们从来没有在捆绑进口包中列出?此外,如果我试图将这些作为项目的依赖项包含并嵌入它们,只会加剧问题。救命啊!

  • 在感觉自己已经掌握了如何使用OSGi之后,我尝试向我的应用程序添加第三方依赖,特别是log4j2,该应用程序使用ApacheFelix并与maven捆绑插件捆绑。不幸的是,我似乎陷入了依赖地狱。 我尝试过使用许多maven捆绑包策略,如导入包,嵌入依赖,wrapImportPackage,Embed-Transitive,以及设置特定的版本号,仅举几例。以下是我的pom在这个插件中的样子: 我觉得

  • 我正在尝试构建一个简单的REST服务来学习OSGI。我正在使用Spark Servlet来处理请求。 我将 spark core 作为依赖项嵌入,在 maven 中构建了我的项目,并在部署时在 Karaf 中出现了布线包错误。 看起来我一个接一个地跟踪程序包,一个一个地解决每个错误,仅仅解决依赖关系就需要大约2个小时。显然我做错了什么。。 我应该如何执行此操作,以便使用 spark servlet