Class 升级到 TomEE 1.7.1 后加载问题

Class loading issue after upgrading to TomEE 1.7.1

我正在将应用程序从 TomEE 1.6.0 升级到 TomEE 1.7.1,发现一些 class 加载不一致。我遇到问题的 class 是 javax.ws.rs.core.Response,它存在于 jsr311-api 和 javaee-api 中。为了解决问题,我在两个不同的 vag运行t 实例上部署了相同的应用程序并执行了以下操作:

# on TomEE 1.6.0 
find /opt -name "*.jar" | xargs grep javax.ws.rs.core.Response.class
Binary file /opt/cc/tomee/mlsvc/webapps/ROOT/WEB-INF/lib/jsr311-api-1.1.1.jar matches
Binary file /opt/apache-tomee-webprofile-1.6.0/lib/javaee-api-6.0-5-tomcat.jar matches

#on TomEE 1.7.1
find /opt -name "*.jar" | xargs grep javax.ws.rs.core.Response.class
Binary file /opt/cc/tomee/mlsvc/webapps/ROOT/WEB-INF/lib/jsr311-api-1.1.1.jar matches
Binary file /opt/apache-tomee-webprofile-1.7.1/lib/javaee-api-6.0-6-tomcat.jar matches

在两台机器上,这个 class 存在于两个不同的 jar 中,根据我的阅读,here Tomcat 应该加载 WEB-INF 中的内容,但事实并非如此TomEE 1.7.1。为了验证我 运行 两个 VM 上的应用程序都带有 -verbose:class JVM 选项,这就是我所看到的:

#on TomEE 1.6.0
[Loaded javax.ws.rs.core.Response from  file:/opt/cc/tomee/mlsvc/webapps/ROOT/WEB-INF/lib/jsr311-api-1.1.1.jar]

#on TomEE 1.7.1
[Loaded javax.ws.rs.core.Response from file:/opt/apache-tomee-webprofile-1.7.1/lib/javaee-api-6.0-6-tomcat.jar]

因此 TomEE 1.6.0 正在从 WEB-INF/lib 目录加载正确的 class 但 1.7.1 正在从公共 lib 目录加载并忽略 WEB-INF 中的内容。我比较了两台机器上的 catalina.properties,但看不出有什么不同。有谁知道为什么会发生这种情况?

编辑: 我刚刚尝试使用 TomEE 1.7.0,与 1.7.1

的行为相同

编辑: 我检查了 Tomcat 版本:TomEE 1.6.0 有 Tomcat 7.0.47,TomEE 1.7.1 有 7.0.55。这似乎是一个小升级,但我仍然想知道 class 加载是否有任何变化。

首先你不应该在你的 webapp 中需要这个 jsr jar。

hat 说 EE APIs 是由容器提供的,API(你做什么)的重载支持不是强制性的。 TomEE 甚至明确地跳过了这个 jar(您肯定在日志中有一条消息)。