【问题标题】:Unable to identify .class files which are added as a external customized jar to the application无法识别作为外部自定义 jar 添加到应用程序的 .class 文件
【发布时间】:2016-04-06 07:10:31
【问题描述】:

我使用 maven 为 dao 和模型包创建了一个外部自定义 jar 文件,我将该 jar 文件导入到我想访问 dao 方法的客户端应用程序中,但它给出了 java.lang.NoClassDefFoundError:com/test/ users/dao/UserDao 但 .class 文件存在于 jar 文件中。我能够在客户端 Web 应用程序中看到该特定自定义 jar 文件的包和方法。 在服务端项目中,我们将其作为客户端应用程序的 jar,maven pom 文件具有以下依赖关系

groupId-- com.test

artifactId--服务

名称--testServiceGjcp

包装--罐子

版本--1.0.0-BUILD-SNAPSHOT

根据上述依赖属性 groupid、aritfact id 和版本,我们在客户端应用程序 maven pom.xml 文件中将其作为依赖项提供,然后我们将生成的服务 jar 文件添加到客户端 maven 依赖项中并构建客户端应用程序, jar 已创建,可以看到生成的 jar 文件中的 .class 文件。

服务项目结构如下

但是,即使 .class 文件及其对应的包以及该特定 .class 文件的方法存在,我们仍然会收到 java.lang.NoClassDefFoundError。

我在这里粘贴实际错误的完整堆栈跟踪。

11:39:34.466 [http-bio-8080-exec-18] DEBUG o.s.web.servlet.DispatcherServlet - DispatcherServlet with name 'appServlet' processing GET request for [/SpringSecurity/login]

11:39:34.479 [http-bio-8080-exec-18] 调试 o.s.w.s.m.m.a.RequestMappingHandlerMapping - 查找路径 /login 的处理程序方法 11:39:34.481 [http-bio-8080-exec-18] 调试 o.s.w.s.m.m.a.RequestMappingHandlerMapping - 返回处理程序方法 [public org.springframework.web.servlet.ModelAndView com.test.controller.MainController.login(java.lang.String, java.lang.String,javax.servlet.http.HttpServletRequest)] 11:39:34.481 [http-bio-8080-exec-18] 调试 o.s.b.f.s.DefaultListableBeanFactory - 返回单例 bean 'mainController' 的缓存实例 11:39:34.481 [http-bio-8080-exec-18] 调试 o.s.web.servlet.DispatcherServlet - [/SpringSecurity/login] 的上次修改值为:-1 11:39:34.543 [http-bio-8080-exec-18] 调试 os.web.servlet.DispatcherServlet - 无法完成请求 org.springframework.web.util.NestedServletException:处理程序处理失败;嵌套异常是 java.lang.NoClassDefFoundError: com/test/users/dao/UserDao 在 org.springframework.web.servlet.DispatcherServlet.triggerAfterCompletionWithError(DispatcherServlet.java:1259) ~[spring-webmvc-3.2.8.RELEASE.jar:3.2.8.RELEASE] 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945) ~[spring-webmvc-3.2.8.RELEASE.jar:3.2.8.RELEASE] 在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) ~[spring-webmvc-3.2.8.RELEASE.jar:3.2.8.RELEASE] 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953) [spring-webmvc-3.2.8.RELEASE.jar:3.2.8.RELEASE] 在 org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:844) [spring-webmvc-3.2.8.RELEASE.jar:3.2.8.RELEASE] 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:621) [servlet-api.jar:na] 在 org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829) [spring-webmvc-3.2.8.RELEASE.jar:3.2.8.RELEASE] 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:722) [servlet-api.jar:na] 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) [catalina.jar:7.0.27] 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) [catalina.jar:7.0.27] 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225) [catalina.jar:7.0.27] 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) [catalina.jar:7.0.27] 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) [catalina.jar:7.0.27] 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) [catalina.jar:7.0.27] 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) [catalina.jar:7.0.27] 在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) [catalina.jar:7.0.27] 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) [catalina.jar:7.0.27] 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) [catalina.jar:7.0.27] 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999) [tomcat-coyote.jar:7.0.27] 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565) [tomcat-coyote.jar:7.0.27] 在 org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307) [tomcat-coyote.jar:7.0.27] 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_75] 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_75] 在 java.lang.Thread.run(Thread.java:745) [na:1.7.0_75] 引起:java.lang.NoClassDefFoundError: com/test/users/dao/UserDao 在 com.test.users.service.MyUserDetailsS​​ervice.loadUserByUsername(MyUserDetailsS​​ervice.java:31) ~[MyUserDetailsS​​ervice.class:na] 在 com.test.controller.MainController.login(MainController.java:53) ~[MainController.class:na] 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_75] 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_75] 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_75] 在 java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_75] 在 org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215) ~[spring-web-3.2.8.RELEASE.jar:3.2.8.RELEASE] 在 org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) ~[spring-web-3.2.8.RELEASE.jar:3.2.8.RELEASE] 在 org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) ~[spring-webmvc-3.2.8.RELEASE.jar:3.2.8.RELEASE] 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745) ~[spring-webmvc-3.2.8.RELEASE.jar:3.2.8.RELEASE] 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686) ~[spring-webmvc-3.2.8.RELEASE.jar:3.2.8.RELEASE] 在 org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) ~[spring-webmvc-3.2.8.RELEASE.jar:3.2.8.RELEASE] 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925) ~[spring-webmvc-3.2.8.RELEASE.jar:3.2.8.RELEASE] ...省略了22个常用框架 引起:java.lang.ClassNotFoundException: com.test.users.dao.UserDao 在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1711) ~[catalina.jar:7.0.27] 在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1556) ~[catalina.jar:7.0.27] ...省略了35个常用框架 2016 年 4 月 6 日上午 11:39:34 org.apache.catalina.core.StandardWrapperValve 调用 严重:servlet [appServlet] 的 Servlet.service() 在路径 [/SpringSecurity] 的上下文中抛出异常 [处理程序处理失败;嵌套异常是 java.lang.NoClassDefFoundError: com/test/users/dao/UserDao] 根本原因 java.lang.ClassNotFoundException: com.test.users.dao.UserDao 在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1711) 在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1556) 在 com.test.users.service.MyUserDetailsS​​ervice.loadUserByUsername(MyUserDetailsS​​ervice.java:31) 在 com.test.controller.MainController.login(MainController.java:53) 在 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.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215) 在 org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) 在 org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745) 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686) 在 org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925) 在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953) 在 org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:844) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 在 org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565) 在 org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 在 java.lang.Thread.run(Thread.java:745)

【问题讨论】:

    标签: java eclipse maven jar


    【解决方案1】:

    其实你真正的问题是java.lang.NoClassDefFoundError: com/test/users/dao/UserDao at com.test.users.service.MyUserDetailsService.loadUserByUsername(MyUserDetailsService.java:31)。

    我怀疑是 ClassLoader 问题,例如,如果 MyUserDetailsService 和 UserDao 位于两个不同的 Web 应用程序中,它们将位于两个不同的(隔离的)ClassLoader 中,因此它们将无法看到彼此。它们需要位于同一个类加载器(根类加载器或 Web 应用类加载器)中,或者 UserDao 可以位于根类加载器(Web 应用类加载器的父类加载器)中,而 MyUserDetailsS​​ervice 位于 Web 应用类加载器中

    【讨论】:

    • 是的 MyUserDetailService.java 来自一个 Web 应用程序,而 UserDao 来自另一个应用程序。我将 UserDao 作为 jar 并提供给 MyUserDetailsS​​ervice 这是一个客户端 Web 应用程序。您能否详细说明关于类加载器,如何将其作为根类加载器和 Web 应用程序类加载器。
    • 这取决于您使用的 Application Server/Servlet Engine,但假设您使用 Tomcat,您将拥有包含 JVM 提供的基本运行时类的 Bootstrap + 您在$JAVA_HOME/jre/lib/ext,系统类加载器基本上是您在 CLASSPATH 中拥有的,通用类加载器是您在 tomcat/lib 中拥有的全局类加载器,最后是 Webapp 类加载器,这是您在 WEB-INF/classes 中拥有的WEB-INF/库。在这种情况下,我所说的根类加载器是通用类加载器,因此您需要将 UserDao 的 jar 放在 tomcat/lib 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 2019-10-04
    相关资源
    最近更新 更多