当我尝试将应用程序升级到spring boot 2.4.13并部署到websphere 8.5.5时,它给了我以下错误。java.lang.NoSuchMethodError: javax/servlet/http/HttpServletResponse.setContentLengthLong(J)V (loaded from file:/apps/WebSphere85/AppServer/ plugins/javax.j2ee.servlet.jar by org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader@ede7c06f) called from class org.springframework.http.server.ServletServerHttpResponse (loaded from file:/applis/196233/was/app_name/installedApps/ app.ear/app-war.war/WEB-INF/lib/spring-web-5.3.20.jar by
我在pom.xml中强制推送servlet 3.1.0,以避免它使用父类加载器。但是它总是从父类加载器中获取jar。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
它与早期版本的spring boot 2.1.3 release一起工作。我们不打算在服务器中将servlet升级到3.1.0,因为它被不同的应用程序使用。请建议
这不是一个可行的方案。虽然您可以在WebSphere服务器上运行的应用程序中覆盖许多服务器提供的API,但Servlet不是其中之一—web容器必须链接到服务器中API的版本,并且应用程序无法在不发生类冲突的情况下单独使用该API。如果你没有遇到NoSuchMethodError,当web容器试图将你的应用程序的Servlet类强制转换为API的内部实例时,你会遇到ClassCastException。
WebSphere 9支持Java EE 7(包括Servlet 3.1),而Liberty支持的版本一直到最新的Jakarta EE规范,所以如果可以迁移到较新的服务器版本,这将是可行的。但是,如果您锁定在8.5.5,则必须坚持使用最新支持Servlet 3.0的Spring版本。