【问题标题】:Servlets in karaf/servicemixkaraf/servicemix 中的 Servlet
【发布时间】:2013-04-08 08:30:24
【问题描述】:

我在 karaf/servicemix 中部署一个简单的 .war 文件时出现以下错误。如果我遗漏了什么,请告诉我。

错误:

java.lang.ClassNotFoundException: app.web.servlet.ConnectServlet not found by JDBCWebDemo [207]
    at org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:787)[org.apache.felix.framework-3.0.9.jar:]
    at org.apache.felix.framework.ModuleImpl.access$400(ModuleImpl.java:71)[org.apache.felix.framework-3.0.9.jar:]
    at org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1768)[org.apache.felix.framework-3.0.9.jar:]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)[:1.6.0_26]
    at org.apache.felix.framework.ModuleImpl.getClassByDelegation(ModuleImpl.java:645)[org.apache.felix.framework-3.0.9.jar:]
    at org.apache.felix.framework.Felix.loadBundleClass(Felix.java:1619)[org.apache.felix.framework-3.0.9.jar:]
    at org.apache.felix.framework.BundleImpl.loadClass(BundleImpl.java:900)[org.apache.felix.framework-3.0.9.jar:]
    at org.ops4j.pax.swissbox.core.BundleClassLoader.findClass(BundleClassLoader.java:176)[122:org.ops4j.pax.web.pax-web-extender-war:1.0.7]
    at org.ops4j.pax.swissbox.core.BundleClassLoader.loadClass(BundleClassLoader.java:194)[122:org.ops4j.pax.web.pax-web-extender-war:1.0.7]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)[:1.6.0_26]
    at org.ops4j.pax.web.extender.war.internal.RegisterWebAppVisitorHS.newInstance(RegisterWebAppVisitorHS.java:221)[122:org.ops4j.pax.web.pax-web-extender-war:1.0.7]

代码如下:

清单.MF:

Manifest-Version: 2 
Bundle-SymbolicName: JDBCWebDemo 
Bundle-Version: 2.3 
Bundle-ClassPath: WEB-INF/classes 
Import-Package: javax.servlet,javax.servlet.http 

web.xml:

<web-app ...>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
  <servlet>
    <description></description>
    <display-name>ConnectServlet</display-name>
    <servlet-name>ConnectServlet</servlet-name>
    <servlet-class>app.web.servlet.ConnectServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ConnectServlet</servlet-name>
    <url-pattern>/ConnectServlet</url-pattern>
  </servlet-mapping>
</web-app>

【问题讨论】:

    标签: apache-karaf apache-servicemix


    【解决方案1】:

    您的 OSGi 包很可能需要导出包含 servlet 代码的包,例如在您需要的 MANIFEST.MF 文件中

    Export-Package: app.web.servlet
    

    【讨论】:

    • 太棒了。然而,根据 OSGi Export-Package 定义,“Bundles 可以从 JAR 中导出零个或多个包以供其他包使用。”我没有在战争之外使用过 servlet,为什么它仍然需要这个参数?为什么我只需要导出 servlet,还有其他类没有在 MANIFEST.MF 中定义就可以正常工作
    • 因为 karaf 实际上对您在 &lt;servlet-class&gt; 中指定的类名做了一些事情。它尝试加载该类。为了让 Karaf 能够在您的包中找到该类,您需要将其导出。
    【解决方案2】:

    如果它不在你的战争中,你需要导入正确的包。

    Import-Package: app.web.servlet
    

    或者如果它位于 lib 文件夹中的某个库中,则需要确保所有这些 jar 都包含在类路径中:

    Bundle-ClassPath: WEB-INF/classes, WEB-INF/lib/jar1.jar, .... 
    

    【讨论】:

      猜你喜欢
      • 2016-06-08
      • 2011-10-19
      • 2017-06-15
      • 1970-01-01
      • 2012-04-12
      • 2018-10-01
      • 2016-09-03
      • 2016-06-08
      • 1970-01-01
      相关资源
      最近更新 更多