【问题标题】:ClassNotFoundException after Changing Package Names in Eclipse在 Eclipse 中更改包名称后出现 ClassNotFoundException
【发布时间】:2014-03-21 23:53:18
【问题描述】:

我正在 Eclipse 中开发一个 Java 动态 Web 项目。一切都很顺利,直到我意识到我的包名是大写的,并决定更改它们。

更改它们后,我在运行时收到 ClassNotFoundExceptions。代码编译得很好。据我了解,这是一个运行时类路径问题。

错误显示在这里:

javax.servlet.ServletException:实例化 servlet 类时出错 Controllers.LoginServlet org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395) org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250) org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188) org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源) java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) java.lang.Thread.run(未知来源)

根本原因

java.lang.NoClassDefFoundError: 模型/转换器 db.UserHelper.(UserHelper.java:34) Controllers.LoginServlet.(LoginServlet.java:36) sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) sun.reflect.NativeConstructorAccessorImpl.newInstance(未知来源) sun.reflect.DelegatingConstructorAccessorImpl.newInstance(未知 来源)java.lang.reflect.Constructor.newInstance(未知来源) java.lang.Class.newInstance(未知来源) org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395) org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250) org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188) org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源) java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) java.lang.Thread.run(未知来源)

根本原因

java.lang.ClassNotFoundException: Model.Converter org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1676) org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521) db.UserHelper.(UserHelper.java:34) Controllers.LoginServlet.(LoginServlet.java:36) sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) sun.reflect.NativeConstructorAccessorImpl.newInstance(未知来源) sun.reflect.DelegatingConstructorAccessorImpl.newInstance(未知 来源)java.lang.reflect.Constructor.newInstance(未知来源) java.lang.Class.newInstance(未知来源) org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395) org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250) org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188) org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源) java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) java.lang.Thread.run(未知来源)

这是我的文件夹结构的截图:

http://imgur.com/VJvJbeb

src/Controllers 和 src/Model 是我改用小写的包。我把他们换回来希望能解决问题,但无济于事。

我尝试通过转到运行 --> 运行配置来检查项目的运行时类路径,但该项目未在此处列出。

这是我的 Web 部署程序集的快照:

http://imgur.com/D0rg2aZ

有谁知道我该如何解决这个问题?任何帮助将不胜感激。

找到解决方案

感谢大家的回复。谢天谢地,我设法通过以下方式解决了这个问题:

  1. 右键项目文件夹--->构建路径--->配置构建路径
  2. 导航到“源”选项卡
  3. 我看到默认输出文件夹是“WorkTicketSystem/build/classes”。我将其切换为“WorkTicketSystem/WebContent/WEB-INF/classes”。

而且,瞧。我不确定我的行为为什么或如何解决了这个问题,但如果有人能解释一下,我会很想听听。现在我很高兴它运行。

【问题讨论】:

  • 让我猜猜。窗户?
  • 我在 Eclipse 中遇到的大多数类似问题都是由于它发布资源的方式,通常通过在“服务器”视图中右键单击配置的服务器并选择“清理”来解决
  • 您能发布您的 web.xml 文件的内容吗?我怀疑你有一个完全限定的类名,指的是你的旧包名。
  • 我实际上没有这个项目的 web.xml 文件。我编辑了我的帖子,以展示我是如何设法解决这个问题的。感谢您的回复!
  • 呃,错误说找不到类“Model.Converter”。这意味着您在某处引用“Model.Converter”而不是“model.Converter”。

标签: java eclipse jakarta-ee runtime-error classnotfoundexception


【解决方案1】:

在您的 web.xml 中,您有对 Model.Converter 类的引用。您需要将其更改为 model.Converter。

【讨论】:

    【解决方案2】:

    如果我们将包名更改为大写,我们必须检查该包的所有引用是否都被修改。正如您所说,如果您尝试使用小写运行包名称,则可以正常工作。如果您尝试使用 IDE 修改包名称,也会要求更新引用。检查一下。

    注意: *根据 java 编码标准,包名应该小写。*

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-14
      • 1970-01-01
      • 2013-08-26
      • 2015-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-18
      相关资源
      最近更新 更多