NoClassDefFoundError使用来自其他项目的JAR

时间:2014-03-01 04:48:07

标签: java eclipse jar noclassdeffounderror buildpath

在这方面似乎有很多关于SO的问题,但是我无法找到完全符合我情景的问题:

我在Eclipse中有两个项目:核心接口

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

在Interface项目中,我已进入构建路径(通过右键单击>构建路径>配置构建路径...)并转到项目部分,然后添加了核心项目。

首先,Interface项目仍然无法看到DAO.jar中的类,这让我很困惑,但我发现进入Core项目的构建路径并选中DAO.jar旁边的框(用于导出)编译器停止抱怨,我能够使用DAO.jar中的类。

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

我构建项目,但是当我导航到一个Servlet,其中Get方法涉及来自DAO.jar的类时,我得到一个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项目?

作为一个注释,我不想做像直接将jar添加到Interface项目那样的东西,因为Core项目可以被其他项目使用,并且我想修改Core项目级联到所有依赖项目。

谢谢!

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

虽然这里的其他答案在某些方面可能有用,但总的来说它们并不完整。

我确实找到了解决问题的方法并摆脱了这个错误,尽管它并没有完全实现我所希望的级联系统。

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

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

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

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