【问题标题】:Has anyone succesfully got Tomcat running via Spring OSGi Web in ServiceMix4?有没有人通过 ServiceMix 4 中的 Spring OSGi Web 成功让 Tomcat 运行?
【发布时间】:2011-04-16 22:14:11
【问题描述】:

我们已经将 Fuse 的 Apache ServiceMix 版本 4.2.0-fuse-02-00 用于标准 OSGi 应用程序已有一段时间了,并且相当成功。我们还一直在利用 CXF 提供网络服务。

现在我们想将我们的 web 应用程序部署到 servicemix4 并利用 OSGi 层来实现依赖项和服务。然而,PAX Web 中的打包似乎不支持我们大量使用的标记库:Richfaces、facelets 等。 似乎允许此处概述的工作标记库的 springDM 解决方案:http://static.springsource.org/osgi/docs/current/reference/html/web.html 应该可以工作,但是我很难启动网络服务器,我目前收到此错误。

Exception in thread "WebExtender-Init" java.lang.NoClassDefFoundError: org/apache/catalina/Loader
 at org.springframework.osgi.web.extender.internal.activator.WarListenerConfiguration.createDefaultWarDeployer(WarListenerConfiguration.java:194)
 at org.springframework.osgi.web.extender.internal.activator.WarListenerConfiguration.<init>(WarListenerConfiguration.java:105)
 at org.springframework.osgi.web.extender.internal.activator.WarLoaderListener$1.run(WarLoaderListener.java:366)
 at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.ClassNotFoundException: org.apache.catalina.Loader
 at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:494)
 at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:410)
 at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:398)
 at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:105)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
 ... 4 more

按照 Spring 文档的建议,我创建了 2 个片段。但它们不会解决,它们保持已安装状态

1) 网络服务器配置片段 定义了以下片段主机:

<Fragment-Host>org.springframework.osgi.web.extender</Fragment-Host>

并且有一个文件 META-INF/spring/extender/tomcat-deployer.xml 包含

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans   
       http://www.springframework.org/schema/beans/spring-beans.xsd">
 <bean id="warDeployer"
        class="org.springframework.osgi.web.deployer.tomcat.TomcatWarDeployer" />

</beans>

2) 和 Catalina Config 片段 与以下主机:

<Fragment-Host>org.springframework.osgi.catalina.start.osgi</Fragment-Host>

和定义的 conf/server.xml 主要是 tomcat 6 server.xml 文件的通用 Windows 安装的副本。

这几天我也一直在搞乱依赖关系,这很困难。但这是我一直在搞砸的功能。我也一直在安装 fuse-servicemix 默认的“jpa-hibernate”功能。

<feature name="spring-dependencies" version="1.0.0">
    <bundle>mvn:org.osgi/org.osgi.compendium/4.1.0</bundle>
    <bundle>mvn:javax.el/com.springsource.javax.el/1.0.0</bundle>
    <bundle>mvn:javax.xml.ws/com.springsource.javax.xml.ws/2.1.1</bundle>
    <bundle>mvn:javax.xml.stream/com.springsource.javax.xml.stream/1.0.1</bundle>
    <bundle>mvn:javax.xml.rpc/com.springsource.javax.xml.rpc/1.1.0</bundle>
    <bundle>mvn:javax.xml.soap/com.springsource.javax.xml.soap/1.3.0</bundle>
    <bundle>mvn:javax.persistence/com.springsource.javax.persistence/1.99.0</bundle>
    <bundle>mvn:org.aspectj/com.springsource.org.aspectj.tools/1.6.8.RELEASE</bundle>
    <bundle>mvn:org.apache.commons/com.springsource.org.apache.commons.logging/1.1.1</bundle>
    <bundle>mvn:org.apache.commons/com.springsource.org.apache.commons.lang/2.4.0</bundle>
    <bundle>mvn:org.apache.xmlcommons/com.springsource.org.apache.xmlcommons/1.3.4</bundle>
    <bundle>mvn:org.jboss.el/com.springsource.org.jboss.el/2.0.0.GA</bundle>
    <bundle>mvn:org.jboss.javassist/com.springsource.javassist/3.9.0.GA</bundle>
    <bundle>mvn:org.aopalliance/com.springsource.org.aopalliance/1.0.0</bundle>
</feature>
<feature name="spring" version="1.0.0">
    <!--feature version="1.0.0">spring-dependencies</feature-->
    <!--bundle>mvn:org.springframework.osgi/org.springframework.osgi.core/1.2.1</bundle--> <!-- there is 1.2.1, but servicemix plays the 1.2.0 game -->
    <!--bundle>mvn:org.springframework.osgi/org.springframework.osgi.io/1.2.1</bundle--> <!-- there is 1.2.1, but servicemix plays the 1.2.0 game -->
    <!--bundle>mvn:org.springframework.osgi/org.springframework.osgi.extender/1.2.1</bundle--> <!-- there is 1.2.1, but servicemix plays the 1.2.0 game -->
    <!--bundle>mvn:org.springframework.osgi/org.springframework.osgi.extensions.annotation/1.2.1</bundle--> <!-- there is 1.2.1, but servicemix plays the 1.2.0 game -->
    <!-- commenting the 3.0.4 release to see if i can get by with the prepacked version in servicmeix bundle>mvn:org.springframework/org.springframework.aop/3.0.4.RELEASE</bundle>
    <bundle>mvn:org.springframework/org.springframework.asm/3.0.4.RELEASE</bundle>
    <bundle>mvn:org.springframework/org.springframework.aspects/3.0.4.RELEASE</bundle>
    <bundle>mvn:org.springframework/org.springframework.beans/3.0.4.RELEASE</bundle>
    <bundle>mvn:org.springframework/org.springframework.context/3.0.4.RELEASE</bundle>
    <bundle>mvn:org.springframework/org.springframework.context.support/3.0.4.RELEASE</bundle>
    <bundle>mvn:org.springframework/org.springframework.core/3.0.4.RELEASE</bundle>
    <bundle>mvn:org.springframework/org.springframework.expression/3.0.4.RELEASE</bundle>
    <bundle>mvn:org.springframework/org.springframework.jms/3.0.4.RELEASE</bundle>
    <bundle>mvn:org.springframework/org.springframework.jdbc/3.0.4.RELEASE</bundle>
    <bundle>mvn:org.springframework/org.springframework.transaction/3.0.4.RELEASE</bundle>
    <bundle>mvn:org.springframework/org.springframework.orm/3.0.4.RELEASE</bundle>
    <bundle>mvn:org.springframework.security/org.springframework.security.core/3.0.3.RELEASE</bundle-->
    <bundle>mvn:org.springframework.osgi/org.springframework.osgi.web/1.2.0</bundle> <!-- there is 1.2.1, but servicemix plays the 1.2.0 game -->
    <bundle>mvn:org.springframework.osgi/org.springframework.osgi.web.extender/1.2.0</bundle>  <!-- there is 1.2.1, but servicemix plays the 1.2.0 game -->
</feature>
<feature name="tomcat" version="1.0.0">
    <!--feature version="1.0.0">spring</feature-->
    <bundle>mvn:javax.ejb/com.springsource.javax.ejb/3.0.0</bundle>
    <bundle>mvn:javax.activation/com.springsource.javax.activation/1.1.1</bundle>
    <bundle>mvn:javax.mail/com.springsource.javax.mail/1.4.1</bundle>
    <bundle>mvn:org.apache.coyote/com.springsource.org.apache.coyote/6.0.18</bundle>
    <bundle>mvn:org.apache.juli/com.springsource.org.apache.juli.extras/6.0.18</bundle>
    <bundle>mvn:org.apache.catalina/com.springsource.org.apache.catalina/6.0.18</bundle>
    <bundle>mvn:org.springframework/org.springframework.instrument.tomcat/3.0.4.RELEASE</bundle>
</feature>
<feature name="web-dependencies" version="1.0.0">
    <!--feature version="1.0.0">spring-dependencies</feature-->
    <!--feature version="1.0.0">tomcat-dependencies</feature-->
    <bundle>mvn:javax.servlet/com.springsource.javax.servlet/2.5.0</bundle>
    <!--bundle>mvn:javax.servlet/com.springsource.javax.servlet.jsp/2.1.0</bundle--> <!--we want this but PAX Web -JSP Support claims tooffer the same thing -->
    <!--bundle>mvn:javax.servlet/com.springsource.javax.servlet.jsp.jstl/1.2.0</bundle--> <!--bundle is causing conflict issues on javax.servlet.jsp 2.1.0 in fuse, omitting for now -->

    <!-- I have been having problems getting the following to work because of conflicts with the javax.servlet.jsp package 1.2.0 presented by Pax Web seems to not be able to be found -->
    <bundle>mvn:javax.faces/com.springsource.javax.faces/1.2.0.09</bundle>
    <bundle>mvn:javax.portlet/com.springsource.javax.portlet/2.0.0</bundle>>
    <bundle>mvn:org.springframework/org.springframework.web/3.0.4.RELEASE</bundle>
    <bundle>mvn:org.springframework/org.springframework.web.servlet/3.0.4.RELEASE</bundle>
    <bundle>mvn:org.springframework/org.springframework.web.portlet/3.0.4.RELEASE</bundle>
    <bundle>mvn:org.springframework.webflow/org.springframework.binding/2.0.9.RELEASE</bundle>
    <bundle>mvn:org.springframework.webflow/org.springframework.js/2.0.9.RELEASE</bundle>
    <bundle>mvn:org.springframework.webflow/org.springframework.webflow/2.0.9.RELEASE</bundle>
    <bundle>mvn:org.springframework.webflow/org.springframework.faces/2.0.9.RELEASE</bundle>  <!--2.1.0 and up rely on Java Server Faces API 2.0 Pre-Release right now, so we must stop at 2.0.9 -->
    <bundle>mvn:com.sun.facelets/com.springsource.com.sun.facelets/1.1.14</bundle>
</feature>

我曾考虑切换到 SpringDM,但似乎该项目已移至目前仅在孵化器中的 Virgo。此外,我们对 Sericemix 非常满意,包括它的 maven 安装功能。

任何见解或资源将不胜感激, 谢谢, 杰里米

【问题讨论】:

    标签: spring tomcat6 jbossfuse fuseesb apache-servicemix


    【解决方案1】:

    因此,在休息后,我回来并与我的团队中的更多成员一起解决了这个问题。 简而言之,我们使用 SpringDM 在 ServiceMix 中成功获得了 Tomcat。 我将列出我在尝试进行此设置时所犯的一些错误。

    1) ServiceMix 的 Refresh 函数重新分析 POM,因此只有在刷新其主机后,片段才会被解析。这就是为什么我的仍在安装中的原因

    2)我其实不需要这两个片段,两个片段都有默认值,适合在tomcat中启动。

    3) 我错过了 catalina.start.osgi 包,它是为 osgi 层提供 tomcat 服务所必需的,更具体地说是 Spring DM 的 web 扩展器。但是,我错过了它,因为我错过了 3 个关键存储库。以下是我们关于这些 repos 的 Nexus 信息:

    Repository ID: springframework.osgi
    Repository Name: Springframework OSGI
    Repository Type: proxy
    Repository Policy: Release
    Repository Format: maven2
    Contained in groups: 
       Public Repositories
    Remote URL: http://maven.springframework.org/osgi/
    
    Repository ID: com.springsource.repository.bundles.release
    Repository Name: SpringSource Enterprise Bundle Repository - SpringSource Bundle Releases
    Repository Type: proxy
    Repository Policy: Release
    Repository Format: maven2
    Contained in groups: 
       Public Repositories
    Remote URL: http://repository.springsource.com/maven/bundles/release/
    
    Repository ID: com.springsource.repository.bundles.milestones
    Repository Name: SpringSource Enterprise Bundle Repository - SpringSource Bundle Milestones
    Repository Type: proxy
    Repository Policy: Release
    Repository Format: maven2
    Contained in groups: 
       Public Repositories
    Remote URL: http://repository.springsource.com/maven/bundles/milestone/
    

    我们还有 4 个其他 SpringSource Enterprise Repos(以防万一

    Repository ID: com.springsource.repository.bundles.external
    Repository Name: SpringSource Enterprise Bundle Repository - External Bundle Releases
    Repository Type: proxy
    Repository Policy: Release
    Repository Format: maven2
    Contained in groups: 
       Public Repositories
    Remote URL: http://repository.springsource.com/maven/bundles/external/
    
    Repository ID: com.springsource.repository.libraries.external
    Repository Name: SpringSource Enterprise Bundle Repository - External Library Releases
    Repository Type: proxy
    Repository Policy: Release
    Repository Format: maven2
    Contained in groups: 
       Public Repositories
    Remote URL: http://repository.springsource.com/maven/libraries/external/
    
    Repository ID: com.springsource.snapshot
    Repository Name: SpringSource Enterprise Bundle Repository - SpringSource Bundle Snapshots
    Repository Type: proxy
    Repository Policy: Snapshot
    Repository Format: maven2
    Contained in groups: 
       Public Repositories
    Remote URL: http://repository.springsource.com/maven/bundles/snapshot/
    
    Repository ID: com.springsource.repository.libraries.release
    Repository Name: SpringSource Enterprise Bundle Repository - SpringSource Library Releases
    Repository Type: proxy
    Repository Policy: Release
    Repository Format: maven2
    Contained in groups: 
       Public Repositories
    Remote URL: http://repository.springsource.com/maven/libraries/release/
    

    因此,我们将这两个片段添加到了 catalina 捆绑包中,以及 servicemix 上的 coyote:

    <bundle>mvn:org.springframework.osgi/catalina.start.osgi/1.0.0</bundle>
    <bundle>mvn:org.apache.jasper/com.springsource.org.apache.jasper/6.0.24</bundle>
    

    jsp 需要 jasper 包。

    4) 添加捆绑包,刷新并重新启动适当的捆绑包后,Tomcat 启动并运行良好。我们可以点击 localhost:8080 并点击空白页。我们决定尝试在此处部署 Spring-DM 下载中的 simple-web-app:

    http://www.springsource.org/osgi
    

    在解决了一些依赖问题后,我们能够清理和构建这个网络应用程序并进行部署。在我们的 Ubuntu 环境中,您可以看到它将战争爆发到 /tmp/ 目录,它将从该目录为 Web 应用程序提供服务。不幸的是,在进行了一些 Tomcat 调试后,我们在尝试访问 http://localhost:8080/simple-web-app/ 时遇到了 404,我们意识到这个安装的 Tomcat 不知何故看不到通常的默认 web.xml servlet 信息。因此,与此同时,我们不得不在我们的网络应用程序的 web.xml 中包含默认 servlet:

        <servlet>
            <servlet-name>default</servlet-name>
            <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
            <init-param>
                <param-name>debug</param-name>
                <param-value>0</param-value>
            </init-param>
            <init-param>
                <param-name>listings</param-name>
                <param-value>false</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
    
    <servlet>
        <servlet-name>jsp</servlet-name>
        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
        <init-param>
            <param-name>fork</param-name>
            <param-value>false</param-value>
        </init-param>
        <init-param>
            <param-name>xpoweredBy</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>3</load-on-startup>
    </servlet>
    
        <!-- The mapping for the default servlet -->
        <servlet-mapping>
            <servlet-name>default</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    
        <!-- The mapping for the JSP servlet -->
        <servlet-mapping>
            <servlet-name>jsp</servlet-name>
            <url-pattern>*.jsp</url-pattern>
        </servlet-mapping>
    
        <servlet-mapping>
            <servlet-name>jsp</servlet-name>
            <url-pattern>*.jspx</url-pattern>
        </servlet-mapping>
    

    关于为什么我们的示例应用找不到默认 servlet 的进一步调查如下:

    http://forum.springsource.org/showthread.php?p=328657#post328657
    

    因此,鉴于这个 spring 示例,此时我们似乎已经根据需要使用工作标签库启动并运行它。尽管我们仍然需要尝试使用 OSGi 类路径从 Web 应用程序加载资源或使用 OSGi 服务,但我们至少已经迈出了第一步。

    请注意,即使我们没有使用 Wicket,此链接也非常有助于验证我所做的事情。

    http://kevinwebber.ca/blog/2009/11/11/wicket-osgi-and-spring-dm.html#references
    

    抱歉链接,stackoverflow 不会让我有超过 1..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-08
      • 2023-04-05
      • 2010-11-02
      • 2018-07-05
      • 1970-01-01
      • 1970-01-01
      • 2013-11-28
      • 2011-04-17
      相关资源
      最近更新 更多