我正在使用maven和eclipse将我的项目转换为OSGI包.Maven构建的东西很好,只是我现在在Eclipse中得到了上面的错误.我怎样才能找出导致这个问题的项目?有什么特别的观点吗?怎么会发生这种情况,我希望maven也能检测到循环依赖?
更新
这可能是由felix maven-bundle-plugin引起的,它对每个导出也是一个导入吗?
是什么让模块/服务/位应用程序功能成为OSGi模块特别好的候选者?
我有兴趣在我的应用程序中使用OSGi.我们是一家Java商店,我们使用Spring非常广泛,所以我倾向于使用Spring Dynamic Modules for OSGi(tm)服务平台.我正在寻找一种将OSGi作为试用版纳入应用程序的好方法.有没有人在这里使用过这种或类似的OSGi技术?有任何陷阱吗?
@Nicolas - 谢谢,我见过那个.这是一个很好的教程,但我正在寻找更多关于如何做我的第一个"真正的"OSGi包的想法,而不是Hello World示例.
@david - 感谢您的链接!理想情况下,使用绿地应用程序,我会将整个事物设计为动态的.不过,我现在正在寻找的是将其引入现有应用程序的一小部分.假设我可以选择应用程序的任何一部分,有哪些因素可以使这件作为OSGi豚鼠变得更好或更差?
我刚开始使用OSGI开发,并且正在努力了解如何最好地处理依赖JAR.
即如果我正在创建一个捆绑包,那么我可能需要使用一些第三方JAR.当我创建我的捆绑JAR以部署到OSGI时,显然这些第三方JAR不包括在内,因此捆绑包将无法运行.
我知道一个选项是将这些JAR转换为捆绑包并将它们部署到OSGI容器中.但是,如果它们只需要被一个捆绑使用,那么这似乎并不理想.
这是什么最好的解决方案?JAR是否可以嵌入到捆绑JAR中,如果是这样,这是一种合理的方法吗?
在OSGi下,组件与服务之间的主要区别是什么?据我了解,所有服务必须是组件,但并非所有组件都必须是服务.
使用样本用例有什么好处?
如何在Scala中编写我的包,然后将其部署到OSGI容器中?
我首先将它编译成"java"还是可以直接将scala部署到OSGI中并使用某种捆绑来识别它?
任何指针都会很棒.目前我使用Apache Felix作为我的osgi容器,但只是对通用概念的简单解释就足以让我开始.
本主题说明如何将OSGI框架转换为在android上运行.然后它给出了将android包转换为能够调用android API的OSGI包的技巧.
在目前阶段,这些Android OSGI捆绑包不能做的唯一事情就是操纵活动并使用资源和资产.我一直在努力解决这个限制.我希望有关于这个问题的好消息.
我发现在Eclipse中使用Create Plugin项目工具比将标准android包转换为OSGI包更困难,所以我不会谈论它.
您可以在此消息末尾的"日志"部分中跟踪我的成就.
我指的是Knopflerfish项目,因为它是我工作的基础.这些修改意味着要在Knopflerfish OSGi android项目上执行,但实际上适用于其他OSGI框架.不需要修改OSGi框架本身,我们只会更新项目KfServiceLib和Knopflerfish发行版KfBasicApp的tool目录.
功能和限制
这是android框架的第一级定制.这些更改将与上下文或调用线程无关,但它们允许使用一组有限的Android API类android.util.Log.
由于这些变化,bundle可以在他们的原型和实现中使用android类.然而,他们将无法与图形用户界面,内容提供商和系统服务等相关,因为他们缺乏对它的强制性参考.
Knopflerfish应用程序的变化
实际上,tools/android/apk下的应用程序能够在android上执行OSGi框架,但前提是捆绑包只调用java类.作为Knopflerfish框架的一部分的捆绑包就是这种情况,但是想要调用android API的自定义捆绑包是什么?以下是在框架中进行的更改,以启用解析android类的bundle.
首先,android包必须是框架包的一部分,以便可以解析它们.这是OSGi属性的目的org.osgi.framework.system.packages.extra
在创建框架之前将属性设置为要导出的android包列表,然后进行设置.请注意,野生炭android.*似乎没有效果:我们必须逐一告诉每个包,如下所示.
要添加到KfServiceLib文件src/org/knopflerfish/android/service/KfApk.java中
static final String ANDROID_FRAMEWORK_PACKAGES = (
"android,"
+ "android.app,"
+ "android.content,"
+ "android.database,"
+ "android.database.sqlite,"
+ "android.graphics,"
+ "android.graphics.drawable,"
+ "android.graphics.glutils,"
+ "android.hardware,"
+ "android.location,"
+ "android.media,"
+ "android.net,"
+ "android.net.wifi,"
+ "android.opengl,"
+ "android.os,"
+ "android.provider,"
+ "android.sax,"
+ "android.speech.recognition,"
+ …Run Code Online (Sandbox Code Playgroud) 我对Blueprint和Spring DM有点困惑:
从我的想法是真的:
没有?
我们可以期望这两个框架在未来成为一个(合并)吗?如果没有,哪一个将是最具前瞻性的?
首先是一些背景:
我正在开发一些基于Apache Sling的 webapp原型代码,它基于OSGI并在Apache Felix上运行.尽管我认为我现在已经掌握了大部分概念,但我对OSGI仍然相对较新.然而,令我困惑的是,我无法找到"完整"依赖注入(DI)框架.我使用声明服务(DS)成功地使用了基本的DI.但我的理解是DS用于引用 - 我该怎么说呢? - OSGI将注册的服务和组件放在一起.为此,它工作正常,但我个人使用像Guice这样的DI框架将整个对象图连接在一起,并将对象放在正确的范围内(想想@RequestScoped或者@SessionScoped例如).但是,我所看到的OSGI特定框架似乎都没有支持这个概念.
我开始阅读有关OSGI蓝图和iPOJO的内容,但这些框架似乎更关注将OSGI服务连接在一起,而不是提供完整的DI解决方案.我不得不承认我还没有做任何样品,所以我的印象可能不正确.
作为Guice的扩展,我已经尝试了Peaberry,但是我发现文档很难找到,而且当我得到基本的DI工作时,很多guice-servlet的高级功能(自动注入过滤器,servlet等)没有'干活了.
所以,我的问题如下:
抱歉这个相当长的问题.
任何反馈都非常感谢.
更新
范围注入:范围注入是一种有用的机制,可以自动注入特定生命周期中的对象.例如,您的一些代码依赖于作为servlet过滤器的一部分创建的Hibernate会话对象.通过标记依赖关系,容器将自动重建对象图.也许只有不同的方法呢?
JSR 330 vs DS:从你所有出色的答案中我看到这些是两个不同的东西.这提出了一个问题,如何处理在OSGI上下文中使用时使用JSR 330注释的第三方库和框架?什么是好方法?在Bundle中运行JSR 330容器?
我感谢您的所有答案,您一直非常乐于助人!
我的OSGi项目中的每个包都有它自己的BundleActivator,我认为这是正常的.这会传递当前的BundleContext,这对于获取服务引用和诸如此类的东西很有用.
但是,从我的bundle中的类,我如何获得BundleContext?将它分配给BundleActivator中的公共静态字段很糟糕,并将其作为参数传递也很糟糕.有更智能的方式吗?
我使用Eclipse Luna win32.x86_64运行Java 8.
这里来自Help Menu > About > Installation Detail > Configuration Tab:
java.runtime.version=1.8.0_05-b13
java.version=1.8.0_05
Run Code Online (Sandbox Code Playgroud)
我创建了新的插件项目,请求JavaSE-1.8作为执行环境:

在myplugin/META-INF/MANIFEST.MF我的文件当然:
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Run Code Online (Sandbox Code Playgroud)
我在产品文件中使用此插件.当我尝试验证它时,我收到以下错误:

当然,如果我开始使用该产品,我会得到:
!ENTRY org.eclipse.osgi 2 0 2014-07-10 08:14:22.042
!MESSAGE One or more bundles are not resolved because the following root constraints are not resolved:
!SUBENTRY 1 org.eclipse.osgi 2 0 2014-07-10 08:14:22.043
!MESSAGE Bundle update@********/myplugin/ was not resolved.
!SUBENTRY 2 myplugin 2 0 2014-07-10 08:14:22.044
!MESSAGE Missing required capability Require-Capability: osgi.ee; filter="(&(osgi.ee=JavaSE)(version=1.8))".
Run Code Online (Sandbox Code Playgroud)
我试过验证了很多:
首选项> Java>已安装的JRE …