【问题标题】:Cannot retrieve BundleContext in a web application无法在 Web 应用程序中检索 BundleContext
【发布时间】: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 只是猜测)

标签: osgi war


【解决方案1】:

从 cmets 的讨论中做出回答:

您在类路径中有两次提到的类。存在于 OSGi 容器中的和包含在 jar 文件中的。 PAX 模块从 OSGi 容器导入类,而您的 web 应用程序从外部 jar 文件导入它。

在您的情况下,jar 包含在 WEB-INF/lib 中。当您使用 Maven 时,您应该将 osgi-core 依赖的范围设置为提供。

【讨论】:

  • 在此之前,它是完美的,但我还应该添加这个包的导入,而不是从本地类路径中使用它,因为有了这个解决方案,我有一个新的 InvocationTargetException (org.osgi. framework.BundleContext 未找到)。那么我该怎么做(向生成的捆绑清单添加导入)。谢谢:)
  • 是否存在像“maven bundle plugin”这样的插件来生成 wab 包(使我能够管理 web 项目中的导入/导出包列表)?
  • maven-bundle-plugin 可以生成wab项目。在说明中,您可以定义 Web-ContextPath,_wab- 我想您可以在 google 中轻松找到详细的文档。
猜你喜欢
  • 1970-01-01
  • 2021-11-04
  • 2012-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多