1

We've been using Fuse's Apache ServiceMix version 4.2.0-fuse-02-00 for a while now for standard OSGi applications and have been fairly successful. We've also been leveraging CXF for making web services available.

Now we'd like to deploy our webapps to servicemix4 and leverage the OSGi layer for dependencies and services. However it seems that the packed in PAX Web does not support taglibs, which we've used heavily: Richfaces, facelets, etc. It seems that the springDM solution which allows for working taglibs outlined here: http://static.springsource.org/osgi/docs/current/reference/html/web.html should work, however I've had a hard time starting up the webserver, i currently get this error.

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

I've created 2 Fragments as the Spring documentation suggests. but they will not resolve, they remain as Installed

1) the webserver config fragment has the following fragment host defined:

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

and has a file META-INF/spring/extender/tomcat-deployer.xml containing

<?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) and a Catalina Config fragment with the following host:

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

and a conf/server.xml defined which is mostly a copy of a generic windows install of tomcat 6 server.xml file.

I've also been messing with the dependencies for a few days now, it has been difficult. but here are the features I've been messing with to get this far. I've also been installing the fuse-servicemix default "jpa-hibernate" feature.

<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>

I've considered switching to SpringDM but it seems like the project has been moved to Virgo which is only in incubator right now. Plus we've been mostly happy with Sericemix, including it's maven install feature.

Any insight or resources would be appreciated, thanks, Jeremy

4

1 回答 1

2

因此,在休息一下之后,我回来并与我的团队中的更多成员一起解决了这个问题。简而言之,我们使用 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

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

于 2010-11-09T15:17:34.023 回答