我正在将应用程序从TomEE 1.6.0升级到TomEE 1.7.1并看到一些类加载不一致。我遇到问题的类是javax.ws.rs.core.Response,它存在于jsr311-api和javaee-api中。为了解决问题,我在两个不同的vagrant实例上部署了相同的应用程序并执行了以下操作:
# 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
在这两台机器上,这个类存在于两个不同的jar中,从我读到的here Tomcat应该加载WEB-INF中的内容,但TomEE 1.7.1不是这样。要验证我是否使用-verbose:class JVM选项在两个VM上运行应用程序,这就是我所看到的:
#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目录加载正确的类,但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。这似乎是一个小小的升级,但我仍然想知道在类加载方面是否有任何改变。
答案 0 :(得分:1)
首先你不应该在你的webapp中使用这个jsr jar。
帽子说EE API是由容器提供的,API的重载支持(你做的)不是强制性的。 TomEE甚至明确地跳过这个jar(你肯定在日志中有一条消息)。