【问题标题】:Simple Web Application Bundle(WAB) in tomcat osgi implementationtomcat osgi实现中的简单Web应用程序包(WAB)
【发布时间】:2013-04-10 18:06:35
【问题描述】:

我在使用 servletbridge osgi 实现访问部署在 tomcat 中的简单 WAB 时遇到问题。

我能够使用 HttpService 使用纯 osgi 包以编程方式注册 jsp/servlets/html,并且可以访问此包。我尝试的下一件事是创建一个单独的 WAB,其中包含一个 html 和一个 servlet 资源,但在访问包时遇到了一些问题。我尝试了 jarred 和 unjarred bundle。我现在假设的是,对于 WAB,我不需要以编程方式或以声明方式注册我的资源???

下面是我创建的 WAB 包。它不包含任何 Http Service Tracker,只是一个在控制台上显示激活和停用消息的激活器。

sample.http1

   helloworld.html

   |META-INF 
       MANIFEST.MF

   |WEB-INF
      web.xml
      |classes
           |sample
                 |http
                      Activator.class
                      HelloWorldServlet.class

下面是 MANIFEST.MF 文件

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: sample.http1
Bundle-SymbolicName: sample.http1
Bundle-Version: 1.0.0
Bundle-Activator: sample.http.Activator
Import-Package: javax.servlet,javax.servlet.http,org.osgi.framework, org.osgi.service.http, org.osgi.util.tracker
Bundle-ClassPath: WEB-INF/classes
Web-ContextPath: /samplehttp

下面是 Activator 类的代码

package sample.http;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
public class Activator implements BundleActivator {

    public void start(BundleContext context) throws Exception {
    System.out.println("Starting Hello World");
}
        public void stop(BundleContext context) throws Exception {
          System.out.println("Stopping Hello World");
}       
}

下面是web.xml的内容

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
<servlet-name>helloworld</servlet-name>
<servlet-class>sample.http.HelloWorldServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloworld</servlet-name>
<url-pattern>/helloworld</url-pattern>
</servlet-mapping>
</web-app>

然后我激活了这个捆绑包。并尝试如下访问 WAB 资源,但我收到 404 page resource not found 错误。

http://localhost/bridge/samplehttp/helloworld.html --用于静态html

http://localhost/samplehttp/helloworld.html

http://localhost/bridge/samplehttp/helloworld -- 用于 HelloWorldServlet

http://localhost/samplehttp/helloworld

Tomcat 托管在端口 80 上。我可以访问我的其他 osgi 捆绑包,这些捆绑包使用 HttpService 以编程方式注册。下面的 osgi 包完美运行。

例如http://localhost/bridge/jsp-examples/helloworld.jsp

请指教。我已经参考了 osgi 规范文档和另一个博客 http://www.javabeat.net/2011/11/writing-an-osgi-web-application/

【问题讨论】:

  • 您真的需要在 Tomcat 中运行您的应用程序吗?是否考虑过迁移到像 Apache Karaf 或 Eclipse Virgo 这样的 OSGi 容器?
  • @AchimNierbeck 我实际上是在尝试研究现有的部署。 Osgi tomcat 是 SAP 业务对象 4 工具中使用的标准部署。我有兴趣将自己的捆绑包添加到其中,因此我无法更改其现有结构。

标签: tomcat osgi bundle wab


【解决方案1】:

您的嵌入式 OSGi 容器设置是否支持 WAB?什么样的 osgi 框架正在运行?是否只有 HttpService 可用。只要您不支持 WAB(例如 Felix HTTP 服务不支持此功能),您就是徒劳的。如果可以更改 HTTP 服务,您可以考虑使用它的 Pax-Web 实现,它支持标准。 HTTP-Service,它的白板扩展器,当然也完全支持 WAB。最新的甚至支持 Servlets 3.0。 尽管如果您绑定到现有的基础架构,并且不允许更改,那么您将无法部署 WAB。 在 OSGi 容器中部署 WAB 有点“奇怪”,而 OSGi 容器本身在 WAR 容器中运行 :-)

所以基本上如果你想使用这个场景,你可能需要做如下的事情: 在 Tomcat 中运行一个 WAR 应用程序,让您的 OSGi 服务在另一个 WAR 中的 OSGi-Container 中运行。对 OSGi-War 中的服务进行远程 HTTP 调用。

【讨论】:

  • 正在使用的 OSGi 容器是使用定制的 ServletBridge 的 Eclipse Equinox,它在 tomcat 中部署为 WAR。捆绑包位于 Tomcat6\webapps\bridge\WEB-INF\eclipse\plugins 中。由开发人员创建并部署在此目录中的现有插件具有类似结构的 tomcat webapps,例如具有 web/WEB-INF 并在这些 web.xml 中定义了过滤器和 servlet。我在某处读到的要点是,如果您的 OSGi 容器不支持 WAB,则无法使用过滤器并定义您的 servlet,您将不得不使用 HttpService 注册所有资源。
  • 但是由于我可以看到这些捆绑包处于活动状态并且正在运行并且可以通过 url 访问,因此看起来它们是 WAB,因为它们使用 web.xml 来定义一些资源。但同时我可以看到他们的 MANIFEST.MF 不包含 Web-ContextPath 我也无法验证他们的 Activator 类,因为我没有现有插件的源代码。我不确定我所说的是否有足够的意义,我试图找出现有插件是否确实是 WAB,如果是,那么我想部署我自己的 WAB
  • 从你告诉我的情况来看,我认为你只是运行了一个普通的 HTTP 服务,不知道所有这些“WAB”是如何运行的,或者更糟糕的是,每场战争是否也提供一个带有它的 OSGi 框架。然后我会说这是一个真正奇怪的设置......再次,HTTP 服务和 WAB 支持是纲要服务,仅从 osgi-framework 开箱即用。因此,您需要一些提供此功能的附加服务。同样,它很可能是您正在使用的 felix-http-service + 网桥。 --> 把我之前的回答留给你 :)
  • 我阅读了另一篇文章blog.knowhowlab.org/2010/10/…,它描述了将 servletcontext 传递给 bundlecontext 的方法。然而,这篇文章只是提供了代码,但没有解释......我无法在这个 WAB 事情上找到足够的资源:(
  • 好吧,实际上你的方案是问题所在,而不是 WAB,看看 Apache Karaf 作为容器,Pax-Web 作为支持 WAB、HttpService 等的基础设施。“WAB 的东西”正如您所说,它在有效的上下文中完美运行。因此,根据您在这里告诉我的内容,我只能说您的环境确实存在问题。用过的容器只是普通的废话,不支持你正在寻找的东西。关于这篇文章,它是一篇好文章,但你仍然需要一个有效的环境。
猜你喜欢
  • 2014-04-04
  • 2011-02-09
  • 2021-04-29
  • 1970-01-01
  • 2013-01-25
  • 2016-09-10
  • 2013-04-15
  • 1970-01-01
  • 2011-08-10
相关资源
最近更新 更多