【发布时间】:2015-06-22 04:49:29
【问题描述】:
我已经阅读了所有现有的帖子,这些帖子涉及在 Eclipse 中的 Tomcat 下运行 Java Web 应用程序的 ClassNotFoundException。
我无法提供源代码和配置工件,因为我正在使用专有代码库。但是,通过反复试验,我将问题归结为基本要素。
我的项目被 Maven 打包为 WAR。主包所依赖的工作区中还有许多其他项目。这种安排运行良好:我可以在 Eclipse 中的 Tomcat 实例下部署 WAR 和它所依赖的 JAR,并且应用程序运行并且我可以调试它。
现在我创建了一个新项目,该项目目前包含一个带有公共构造函数的公共类。 Maven 构建工作正常,Eclipse 编译工作区工作正常。但是,当我部署到 Tomcat 并执行一个在新项目中实例化类的执行路径时,我得到了 ClassNotFoundException。
我已经检查了以下项目:
- 主包项目的 Web 部署程序集将 WEB-INF/lib/ 指定为新项目的部署路径;
- 新项目的 JAR 实际上最终位于实际部署文件夹下的 WEB-INF/lib/ 文件夹中;
- 当我在服务器上进行清理和发布时,实际部署文件夹的内容实际上会被删除并重新填充所有正确的 JAR;
- 我发现新项目的 JAR 部署文件夹中的 WEB-INF/lib 实际上包含我要实例化的类;
- Tomcat 日志(包括启动周期)除了 ClassNotFoundException 之外没有其他错误;
- 我已经多次重新完成 Maven 构建并将 Maven 构建应用于 Eclipse 项目;
- 我已经在 Eclipse 中多次清理和重建;
- 我已经无数次清理并重新发布到 Eclipse 中的 Web 服务器;
- 我创建了几个新的服务器实例。
基于对 ClassNotFoundException-in-Tomcat 问题的现有讨论,这些是我发现要检查的唯一内容。我还应该研究什么?
感谢您的帮助。
【问题讨论】:
-
那么缺少什么类?很可能是版本问题
-
@ScaryWombat:你的意思是 JAR 不包含当前版本的类吗?还是主要项目正在寻找新 JAR 的不同版本?
-
如果您的 jar1 依赖于 jar2,其中包含方法 doMe,但您包含了 jar2.2 和 jar2.2。里面没有doMe的方法,那你就麻烦了。经常发生在日志罐子上。
-
您可以使用findjar.com 之类的东西来查找缺少的类所在的 jar 文件 - 以防它不是您自己的项目之一。
-
@ScaryWombat: 伙计,你搞定了。如果我做 jar tf 来列出 jar 的内容,那么类就在那里。但是,如果我使用 javap 检查类,我会得到“找不到类”。但我认为这不像版本控制问题那么简单。