0

我正在将一个项目从 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.Requestjavax.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.HttpServletRequestjboss-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.RequestRedHat/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 的不兼容性吗?我还可能遗漏哪些其他原因?在这里非常感谢任何帮助。

4

2 回答 2

0

1/ 你不应该依赖 servlet API 实现 2/ 你不应该在你的应用程序中包含这些实现类,因为它们是由服务器本身提供的 3/ 你不应该把 API jar 或者它们的实现放在你的应用程序中,或者如果你为此,您需要使用 jboss-deployment.xml 从应用程序中排除这些模块

于 2019-11-18T07:57:11.277 回答
0

看起来问题是我没有正确使用 modules.xml。我需要在我的 module.xml 文件中添加两个包的依赖项

   <dependencies>
      <module name="org.jboss.as.web"/>
      <module name="javax.servlet.api"/>
   </dependencies>

我之前已将这些模块添加到我的 war 文件的 jboss-deployment-structure.xml 中,但这并没有起到作用,并给我留下了 ClassNotFoundExceptions。我的 Jboss-deployment-structure.xml 现在只是将我自己的自定义模块作为依赖项引用,而后者又具有自己的依赖项。

我仍然不明白是什么导致了上一个错误,因为它是所有相同版本的 jar 文件,所以我不知道哪里有冲突,但这让错误消失了,不再有 ClassNotFoundExceptions。

于 2019-11-18T16:45:19.027 回答