在这一领域似乎有很多关于 SO 的问题,但我还没有找到一个完全符合我的场景的问题:
我在 Eclipse 中有两个项目:Core 和 Interface。
在核心项目中,我有 5 个 .jar
文件,其中包含有用的类等。假设其中一个 jar 名为 DAO。
在界面项目中,我进入构建路径(通过右键单击 > 构建路径 > 配置构建路径...)并进入项目部分,然后添加核心项目。
起初,Interface 项目仍然看不到 DAO.jar 中的类,这让我很困惑,但我发现,通过进入 Core 项目的构建路径并选中 DAO.jar 旁边的框(用于导出)编译器停止提示,我可以使用 DAO.jar 中的类。
(具体来说,我正在使用 Servlet 和 JSP 等制作一个 Java Web 应用程序,在本地 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 项目?
请注意,我不想做类似将 jar 直接添加到 Interface 项目的操作,因为 Core 项目可以由其他项目使用,并且我希望对 Core 项目级联进行修改所有依赖项目。
谢谢!
最佳答案
您的问题是 eclipse 编译代码时使用的类路径与 tomcat 在运行时使用的类路径之间的差异。我已经在基于 OSGi 的桌面应用程序中处理过这个问题,尽管我还没有学会如何将 JavaEE 应用程序打包为单独的组件。不过,我可以告诉您,找到答案的途径是学习如何构建 WAR 和/或 EAR 文件,以便其中一个文件中的库由 bundle 导出,而另一个文件可以导入它们。
关于java - 使用其他项目的 JAR 时出现 NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22110267/