Tomcat 7 中的 ClassNotFoundException

ClassNotFoundException in Tomcat 7

我在使用 Tomcat 网络应用程序的依赖项时遇到问题。我试过:

  1. 将 .jar 添加到 WEB-INF/lib
  2. 在$CATALINA_HOME/conf/catalina.properties
  3. 中添加路径
  4. 在 IntelliJTomcat 配置中添加 .jar
  5. 将 .jar 添加到 $TOMCAT_HOME/lib

但是,调用依赖项时出现相同的错误:

java.lang.ClassNotFoundException: org.mongodb.morphia.Morphia
    java.net.URLClassLoader.run(URLClassLoader.java:366)
    java.net.URLClassLoader.run(URLClassLoader.java:355)
    java.security.AccessController.doPrivileged(Native Method)
    java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    com.turn.quest.mongo.MongoManager.<init>(MongoManager.java:31)
    com.turn.quest.mongo.MongoManager.<clinit>(MongoManager.java:22)
    com.turn.quest.mongo.data.Document.<init>(Document.java:30)
    com.turn.quest.mongo.data.Template.<init>(Template.java:21)
    com.turn.quest.mongo.data.GeoTargetingTemplate.<init>(GeoTargetingTemplate.java:15)
    com.turn.jaxrs.template.TemplateController.get(TemplateController.java:30)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:606)
    com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:168)
    com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:71)
    com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:280)
    com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
    com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
    com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
    com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
    com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1341)
    com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1273)
    com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1223)
    com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1213)
    com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:414)
    com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
    com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176)
    org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145)
    org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92)
    org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:381)
    com.turn.quest.filters.ClickjackFilter.doFilter(ClickjackFilter.java:27)
    com.turn.quest.filters.PbAuthenticationFilter.doFilter(PbAuthenticationFilter.java:286)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:606)
    org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
    org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
    org.springframework.transaction.interceptor.TransactionInterceptor.proceedWithInvocation(TransactionInterceptor.java:96)
    org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
    com.sun.proxy.$Proxy315.doFilter(Unknown Source)
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:343)
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:260)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118)
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:150)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter.doFilter(AbstractPreAuthenticatedProcessingFilter.java:94)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
    org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:343)
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:260)

如果我从外部调用依赖项 Tomcat,一切正常。

上述错误意味着包含 class org.mongodb.morphia.Morphia 的 jar 不存在于 class 路径中。因此,请确保在您的 Web 应用程序的库或 tomcat 的库中包含包含上述 class 的 jar。我想你可以从 here.

得到罐子

您只需将它作为依赖项添加到您的 IDEA 项目定义中。如果您使用的是 maven 或 gradle,请将依赖项添加到您的构建文件中。例如,对于 Maven,您可以将以下内容添加到 pom.xml 文件中:

<dependency>
    <groupId>org.mongodb.morphia</groupId>
    <artifactId>morphia</artifactId>
    <version>0.109</version>
</dependency>

如果您通过 IDEA 配置项目:

  1. 转到File > Project Structure
  2. 单击左侧 项目设置 部分中的 模块 link。
  3. Select 使用依赖的模块。
  4. 单击 依赖项 选项卡。
  5. 点击右边的添加按钮然后select"Library"
  6. 在 "Choose Libraries" 对话框中,单击 "New Library..." 按钮并从弹出列表 select Java
  7. 在“文件浏览器”对话框中,select 库的 JAR 文件,或包含 JAR 文件的目录(它将添加目录中的所有 JAR),或包含 类.
  8. 在文件选择器对话框中单击“确定”
  9. 在 "Configure Library" 对话框中,为库指定一个合适的名称。如果需要,您可以将源代码和 javadoc 添加到定义中。 (您也可以通过 selecting 多个 JAR 在前面的步骤中的文件选择器中执行此操作。IDEA 会自动确定它们是 类、来源还是 Javadoc。)
  10. 在 "Configure Library" 对话框中单击“确定”。
  11. 返回 "Choose Libraries" 对话框,您刚刚创建的库应该 selected。 (如果没有,select它。)点击"Add Selected"按钮
  12. 在“项目结构”对话框中单击“确定”。

有关详细信息,请参阅帮助指南中的 "Configuring Module Dependencies and Libraries"(也在 web here 上)。

现在,当您通过 IDEA Tomcat run/debug 配置将 Web 应用程序部署到 Tomcat 时,该库将与您的其余代码一起部署。有关更多信息,请参阅 IDEA 帮助指南中的 "Run/Debug Configuration: Tomcat" 主题(或 web here)。

这是因为 Morphia jar 不是您输出的一部分 war/jar。 Eclipse 或本地构建将它们作为类路径的一部分包含在内,但远程构建或 auto/scheduled 构建不将它们视为类路径的一部分。

您可以使用插件包含依赖的 jar。

将以下代码片段添加到您的 pom 插件部分

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.0.0</version>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
</plugin>