我已经在维基百科和其他网站上阅读过关于OSGi的内容,但我并没有真正看到全局.它说它是一个基于组件的平台,您可以在运行时重新加载模块.另外,给出的"实际示例"是Eclipse插件框架.
我的问题是:
OSGi的清晰简单定义是什么?
它解决了哪些常见问题?
"常见问题"我指的是我们每天面临的问题,例如"OSGi可以做些什么来提高我们的工作效率/乐趣/简单?"
我有四个捆绑包,每个捆绑包只包含一个清单.捆绑是
app哪个进口com.example.foo.fragment和com.example.barfoo 哪个出口 com.example.foo;uses:=com.example.foo.cfgfoo.fragment其连接到片段foo的是出口com.example.foo.fragment和com.example.foo.fragment.cfg;uses:=com.example.foo.fragmentbar哪些出口com.example.bar和进口com.example.foo捆绑级依赖图:
app -> bar
| |
| v
| foo
| |
v v
foo.fragment
Run Code Online (Sandbox Code Playgroud)
当我在JBoss AS 7.2中同时安装这些软件包时,它们工作得很好.但是,如果我在其他人之后安装app捆绑包,无论是第一次还是成功启动后再卸载它,都会发生以下使用约束违规:
Caused by: org.osgi.service.resolver.ResolutionException: Uses constraint violation. Unable to resolve resource com.example.app [HostBundleRevision[com.example.app:0.0.
0]] because it is exposed to package 'com.example.foo.fragment' from resources com.example.foo [HostBundleRevision[com.example.foo:0.0.0]] and com.example.foo [HostBund
leRevision[com.example.foo:0.0.0]] via two dependency chains.
Chain 1:
com.example.app [HostBundleRevision[com.example.app:0.0.0]] …Run Code Online (Sandbox Code Playgroud) Apache Karaf是Apache Felix的子项目.它被定义为"轻量级OSGi容器".
我不明白我何时应该使用重量级以及何时使用轻量级.他们的网站没有解释太多.
我需要读取Manifest传递我的课程的文件,但是当我使用时:
getClass().getClassLoader().getResources(...)
Run Code Online (Sandbox Code Playgroud)
我MANIFEST从第一次.jar加载到Java Runtime.
我的应用程序将从小程序或webstart运行,
因此.jar我猜我无法访问自己的文件.
我实际上想要读取启动Felix OSGi 的Export-package属性.jar,所以我可以将这些包暴露给Felix.有任何想法吗?
所以截至昨天早上我还没有找到OSGi甚至是什么的线索.OSGi只是一些流行语,我一直看到它一遍又一遍地出现,所以我终于留出一些时间来了解它.
它实际上看起来很酷,所以我想首先说明(对于记录)我在任何方面都不反OSGi,这也不是一个"OSGi-bashing"问题.
在一天结束时,似乎OSGi已经 - 实质上 - 解决了Java Modularity上的JSR 277,它认识到JAR文件规范存在缺陷,导致在某些极端情况下命名空间解析和类加载问题.OSGi还做了很多其他非常酷的东西,但从我可以确定的,这是它最大的吸引力(或者其中之一).
对我来说 - 作为一个相当新的(几年前)Java EE开发人员,我们在2011年并且目前生活在Java 7时代,并且这些类加载问题仍然存在,这绝对令人难以置信.特别是在一个应用服务器上可能有数百个JAR的企业环境中,其中许多应用服务器依赖于彼此的不同版本,并且所有应用服务器同时运行(或多或少).
我的问题:
和我在OSGi中一样感兴趣,并且我想开始了解它以了解它在哪里/是否可以用于我的项目,我只是没有时间坐下来学习大的东西,至少现在.
那么当这些问题出现时,非OSGi开发人员会做些什么呢?目前存在哪些Java(Oracle/Sun/JCP)解决方案?为什么Jigsaw从J7切入?Jigsaw明年将在J8实施的社区有多确定?即使它不是Java平台的一部分,是否有可能为您的项目获得Jigsaw?
我想我在这里问的是恐慌,阴谋和一个facepalm的组合.现在我终于明白了OSGi是什么,我只是不"得到"像Jigsaw这样的东西需要20多年才能实现,然后才能从发布中获得.这看起来很基本.
而且,作为开发人员,我也很好奇我的解决方案是什么,没有OSGi.
另外,注意:我知道这不是一个" 纯编程 "类型的问题,但是在你们中的一些人让你的鼻子弯曲变形之前,我想说明(再次,为了记录)我故意把这个问题放在所以.那是因为我对我的同伴SOE只有最大的尊重,我正在寻找一些我所看到的每天潜伏在这里的"IT之神"的建筑级答案.
但是,对于那些绝对坚持使用某些代码段支持SO问题的人:
int x = 9;
Run Code Online (Sandbox Code Playgroud)
(感谢任何能够权衡这个OSGi/Jigsaw/classloader/namespace/JAR地狱的人!)
我对Apache Karaf究竟是什么感到有些困惑.
你能否说Apache Karaf包含以下内容:
我们正在尝试确定如何为我们正在实现的服务实现一个简单的插件框架,允许不同类型的计算器"插入".
在阅读了一些关于Java插件框架的帖子后,似乎最常见的选项是:
OSGI似乎超出了我们的需要.
"滚动你自己"是可以的,但重用一个公共库会很好.
所以我们归结为JPF和JSPF.JPF似乎不再处于积极发展阶段.
JSPF看起来非常简单,而且我们真的需要它们.但是我没有听到太多关于它的消息.我只在StackOverflow上看过一篇关于它的帖子.有没有其他人有JSPF的经验?或者对这个设计选择的任何其他评论?
更新:对此没有一定的正确答案..然而,我们将采用Pavol的想法,因为我们只需要一个非常非常简单的解决方案.感谢EoH的精彩导游.
我刚刚开始听到使用OSGi这个术语(同时阅读GlassFish和Spring等常见Java EE容器上的教程),但是我无法找到一个简单,直接,易于理解的OSGi解释就是像我这样的企业新手会理解.
有人可以提供这样的防伪解释吗?也许有一些例子甚至代码摘录?
谢谢!
它就在那里,在它应该索引的包中.我还是打电话的时候
JAXBContext jc = JAXBContext.newInstance("my.package.name");
Run Code Online (Sandbox Code Playgroud)
我得到一个JAXBException说
"my.package.name"不包含ObjectFactory.class或jaxb.index
虽然它确实包含两者.
什么工作,但不是我想要的,是
JAXBContext jc = JAXBContext.newInstance(my.package.name.SomeClass.class);
Run Code Online (Sandbox Code Playgroud)
来自其他人的这个问题出现在一些邮件列表和论坛上,但似乎没有得到答案.
我在OpenJDK 6上运行它,所以我获得了源包并将调试器放入库中.它首先查找jaxb.properties,然后查找系统属性并且无法找到,它尝试使用com.sun.internal.xml.bind.v2.ContextFactory创建默认上下文.在那里,异常被抛出(内部ContextFactor.createContext(String ClassLoader, Map)),但我看不到发生了什么,因为源不在这里.
ETA:
从ContentFactory的源代码判断,我在这里发现,这可能是那些无法按预期工作的代码:
/**
* Look for jaxb.index file in the specified package and load it's contents
*
* @param pkg package name to search in
* @param classLoader ClassLoader to search in
* @return a List of Class objects to load, null if there weren't any
* @throws IOException if there is an error reading the index …Run Code Online (Sandbox Code Playgroud) OSGi允许通过Import-Package连接确定依赖关系,它只连接单个包(从任何包中导出),并Require-Bundle连接到特定命名包的导出.
在构建绿地OSGi应用程序时,我应该使用哪种方法来表示依赖关系?大多数bundle都是内部的,但是对外部(开源)bundle会有一些依赖.
osgi ×10
apache-felix ×5
java ×5
apache-karaf ×2
aries ×1
classloader ×1
components ×1
java-platform-module-system ×1
jaxb ×1
jboss7.x ×1
manifest.mf ×1
terminology ×1