我正在将一个项目从 JBoss 5 迁移到 6.4。在此过程中,我更新了构建中的几个 jar 文件。我有几个 ClassCastExceptions,我通过从 JBoss 系统模块中的 jar 中获取特定类的版本并在我的应用程序构建中使用它来解决这些问题。我已经用两个罐子做到了,jbossweb-7.5.26.Final-redhat-1.jar
它们分别jboss-servlet-api_3.0_spec-1.0.2.Final-redhat-2.jar
包含类org.apache.catalina.connector.Request
和javax.servlet.http.HttpServletRequest
。我在我的应用程序构建中使用这两个 jar 作为库,并且所有的编译都没有错误或警告。我已经确认,当我删除这些库时,应用程序无法编译,因为它找不到包含的引用类,所以我知道我实际上并没有在我的构建中引用这些类的其他副本。该应用程序部署良好,但是当我尝试点击它时出现异常
JBWEB001018:请求处理过程中容器发生异常或错误:java.lang.IncompatibleClassChangeError: Class org.apache.catalina.connector.Request 未实现请求的接口 javax.servlet.http.HttpServletRequest
当我在我的编辑器 (JDeveloper 12c) 中查看 jar 中的类定义时,我可以看到org.apache.catalina.connector.Request
定义jbossweb-7.5.26.Final-redhat-1
在.javax.servlet.http.HttpServletRequest
jboss-servlet-api_3.0_spec-1.0.2.Final-redhat-2.jar
我打开了类加载的详细日志记录(JAVA_OPT -verbose:class),并确认当 JBoss 正在加载这两个类时,它们实际上是从这两个 jar 文件中加载的,而不是我不知道的其他一些。我可以在我的开发人员工具中看到,我在项目中包含的 .class 文件来自这两个相同的 jar 文件。
可能相关的是,类加载日志说 JBoss 正在org.apache.catalina.connector.Request
从RedHat/JBoss/EAP-6.4.0/modules/system/layers/base/.overlays/layer-base-jboss-eap-6.4.18.CP/org/jboss/as/web/main/
. 我不确定它为什么使用该副本/位置而不是RedHat\JBoss\EAP-6.4.0\modules\system\layers\base\org\jboss\as\web\main
.
那么给了什么?我在错误中读到的内容会向我建议,它jboss-servlet-api_3.0_spec-1.0.2.Final-redhat-2.jar
是针对不同版本的 HttpServletRequest 编译的,而不是jbossweb-7.5.26.Final-redhat-1
包含的。
这种解释或错误是否正确?JBoss 6.4 是否真的在其系统模块中附带了不兼容的 jar 文件?如果是这样,我需要这些 jar 的哪些版本以及如何检查兼容性?我可以安全地切换到不同的 jar 文件而不引入更多与其他 jar 的不兼容性吗?我还可能遗漏哪些其他原因?在这里非常感谢任何帮助。