【问题标题】:NoClassDefFoundError using JAR from other projectNoClassDefFoundError 使用来自其他项目的 JAR
【发布时间】:2014-04-02 08:19:30
【问题描述】:

在这个领域似乎有很多关于 SO 的问题,但我找不到与我的场景完全一致的问题:

我在 Eclipse 中有两个项目:CoreInterface

在核心项目中,我有 5 个.jar 文件,其中包含有用的类等等。假设其中一个罐子名为 DAO

在 Interface 项目中,我进入了 Build Path(通过右键单击 > Build Path > Configure Build Path...)并进入 Projects 部分,然后添加了 Core 项目。

起初 Interface 项目仍然看不到 DAO.jar 中的类,这让我很困惑,但我发现通过进入 Core 项目的构建路径并选中 DAO.jar 旁边的框(用于导出)编译器停止抱怨,我可以使用 DAO.jar 中的类。

(具体来说,我正在制作一个带有 Servlet 和 JSP 等的 Java webapp,在本地 Tomcat 服务器上运行。)

我构建了项目,但是当我导航到 Get 方法涉及 DAO.jar 中的类的 Servlet 时,我得到了 NoClassDefFoundError。这是堆栈跟踪:

java.lang.ClassNotFoundException: dao.DirectSqlVisitorImpl
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1702)
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547)
    java.lang.ClassLoader.defineClass1(Native Method)
    java.lang.ClassLoader.defineClass(ClassLoader.java:792)
    java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2928)
    org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1174)
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1669)
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547)
    interface.DonationsServletController.doGet(DonationsServletController.java:79)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

我收集到的是 JRE 在运行时找不到 DirectSqlVisitorImpl 类的定义,即使 Eclipse 错误检查让它飞起来,因为我已经在(看似)正确的时尚。

那么我需要做些什么来确保 jar 通过 Core 项目被拉入 Interface 项目?

作为说明,我不希望直接将 jars 添加到 Interface 项目中,因为 Core 项目可以被其他项目使用,并且我希望对 Core 项目级联进行修改以所有依赖项目。

谢谢!

【问题讨论】:

  • 您是否尝试使用neabeans 调试器运行它?这可以通过clean and build 解决
  • @Desolator 我正在使用 Eclipse。我做了几次清理 Tomcat 服务器并重建,但没有效果。

标签: java eclipse jar noclassdeffounderror buildpath


【解决方案1】:

一种解决方案可能是将依赖的 jar 添加到 tomcat lib 文件夹中。即/lib。

【讨论】:

  • 你能详细解释一下这是如何完成的,作为一系列步骤吗?谢谢。
【解决方案2】:

您的问题是eclipse在编译代码时使用的类路径与tomcat在运行时使用的类路径之间的区别。我已经在一个基于 OSGi 的桌面应用程序中处理过这个问题,尽管我还没有学会如何将 JavaEE 应用程序打包为单独的组件。但是,我可以告诉您答案的路径是学习如何构建 WAR 和/或 EAR 文件,以便其中一个库由捆绑包导出,另一个可以导入它们。

【讨论】:

    【解决方案3】:

    虽然这里的其他答案在某些方面可能有用,但总体而言它们是不完整的。

    我确实找到了解决问题并消除此错误的方法,尽管它并不能完全实现我所希望的级联系统。

    似乎 dsh 是对的,因为我的问题是 eclipse 在编译我的代码时使用的类路径与 tomcat 在运行时使用的类路径之间的区别。或者更具体地说,DAO jar 文件存在于我的项目中,但没有部署到 tomcat 服务器。

    为了解决这个问题,我去了我的项目的属性 > Web 部署程序集 > 添加... > 来自工作区的存档 > 添加...

    然后我选择了 DAO jar 并将其添加进去。然后项目构建并运行良好,没有 NoClassDefFoundError。所以我的问题基本上解决了。

    但是,我不确定如果更改/更新 Core 项目中的 jar 文件会发生什么。

    【讨论】:

    • 我认为问题涉及将库从一个 WAR/EAR 导出到另一个。根据您的解决方案,为了简化您的情况,只需将 jar 放在 WEB-INF/lib/ 目录中。 Eclipse 将自动将它们包含在编译时类路径中,并自动部署它们。这样就不需要将它们添加到项目的构建路径中,也不需要专门配置部署程序集。
    • @dsh 很有趣,作为常规的处理方式是有意义的。我暂时保持原样。但是,了解如何让它们从其他项目自动部署会很有用。
    猜你喜欢
    • 2013-08-17
    • 2013-09-20
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2013-02-21
    相关资源
    最近更新 更多