java - 无法识别作为外部自定义jar添加到应用程序的.class文件

标签 java eclipse maven jar

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

groupId-- com.test

artifactId--服务

名称--testServiceGjcp

包装-罐

版本-1.0.0-BUILD-SNAPSHOT

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

在职项目结构如下
enter image description here

但是,即使存在.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]调试oswsmmaRequestMappingHandlerMapping-返回处理程序方法[公共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]调试o.s.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(本机方法)〜[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调用
严重:路径为[/ SpringSecurity]的Servlet [appServlet]的Servlet.service()抛出异常[处理程序处理失败;嵌套异常为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(本机方法)处
    在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.lang.NoClassDefFoundError: com/test/users/dao/UserDao at com.test.users.service.MyUserDetailsService.loadUserByUsername(MyUserDetailsService.java:31)

我怀疑出现ClassLoader问题,例如,如果MyUserDetailsServiceUserDao位于两个不同的Web应用程序中,则它们将位于两个不同的(隔离的)ClassLoader中,这样它们将无法彼此看到。它们需要位于相同的Classloader(根类加载器或Web应用程序类加载器)中,或者UserDao可以位于根类加载器(Webapp类加载器的父calssloader)中,而MyUserDetailsS​​ervice位于Web应用程序类加载器中

关于java - 无法识别作为外部自定义jar添加到应用程序的.class文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36443922/

相关文章:

java - 如何在我的 Android 应用程序项目中包含新的 .java 文件?

java - 右键单击 .jsp 文件时,“在服务器上运行”选项未出现在 Eclipse 中

java - 在 Maven 构建中使用 Eclipse Java Compiler (ecj)

java - 为什么使用 OpenJDK+openjfx 的 JavaFX 应用程序在 Ubuntu 16 上失败?

maven - Jenkins 不能用 Maven 构建。可能是代理问题

java - 无法实例化接口(interface) org.springframework.context.ApplicationContextInitializer (Spring 5.2.3 + Spring Boot 2.2.3)

java - 动态加载微调器值

java - nvarchar 的使用有多糟糕

java - 为什么要使用 Char 而不是 String?

python - 在 Eclipse 中远程调试 Python