【发布时间】:2013-05-21 15:04:52
【问题描述】:
我添加了以下捆绑包,可以将战争(Web 应用程序)部署到 OSGi 框架中。我使用“Apache Felix 可分发二进制文件”:
32|Active | 20|OPS4J Pax Logging - API (1.7.0)
33|Active | 20|OPS4J Pax Logging - Service (1.7.1.SNAPSHOT)
34|Active | 20|OPS4J Pax Url - mvn: (1.3.5)
35|Active | 20|OPS4J Pax Url - war (1.3.5)
36|Active | 20|OPS4J Pax Url - wrap: (1.3.5)
37|Active | 20|OPS4J Pax Web - API (1.1.12)
38|Active | 20|OPS4J Pax Web - FileInstall Deployer (1.1.12)
39|Active | 20|OPS4J Pax Web - Extender - WAR (1.1.12)
40|Active | 20|OPS4J Pax Web - Extender - Whiteboard (1.1.12)
41|Active | 20|OPS4J Pax Web - Jetty Bundle (1.1.12)
42|Active | 20|OPS4J Pax Web - Jsp Support (1.1.12)
43|Active | 20|OPS4J Pax Web - Runtime (1.1.12)
44|Active | 20|OPS4J Pax Web - Service SPI (1.1.12)
所以,我使用了一个简单的struts 2应用程序(Hello world)进行测试,我创建了war,然后我把它放在“文件安装”目录中,它变得活跃,我可以看到我的欢迎页面。 在此之后,我尝试检索 BundleContext 以使用战争中注册的服务,我已添加:
BundleContext ctx = (BundleContext) ServletActionContext.getServletContext().getAttribute("osgi-bundlecontext");
但是,我发现了异常:
“java.lang.ClassCastException: org.apache.felix.framework.BundleContextImpl 无法转换为 org.osgi.framework.BundleContext”
可能是什么问题?
谢谢
【问题讨论】:
-
我在日志中看到这条消息:[WebListenerExecutor: 1] DEBUG org.ops4j.pax.web.pax-web-runtime - org/osgi/service/web/DEPLOYED PackageAdmin 服务不可用。
-
您是否有可能将 osgi-core 添加到包中并且 org.osgi.framework.BundleContext 类在您的 OSGi 容器中存在两次?一个来自容器,一个来自 jar 文件。 PAX 模块连接到框架,而您的 wab 连接到 osgi-core.jar
-
感谢您的回复,是的,看来这是问题所在,从简单战争生成的 jar 包将所有战争依赖项嵌入到 jar 中,并将它们添加到包类路径(Bundle-ClassPath :: ....,WEB-INF/lib/org.osgi.core-5.0.0.jar)。我暂时不知道如何管理这个清单文件以避免这种情况,如果我尝试使用 bundle maven 插件生成一个包而不是战争,我不能有相同的正确 jar 包装
-
您可以在 pom.xml 中设置为该依赖项提供的范围,而不是将其包含在 WEB-INF/lib 中。
-
从 cmets 做出了真实的回答(直到现在我的 cmets 只是猜测)