在 IBM Websphere 8.5.5.20 上使用 2.6.2 部署 Spring 引导应用程序时出错

Error Deploying Spring Boot App using 2.6.2 on IBM Websphere 8.5.5.20

我正在尝试在 IBM Websphere 8.5.5.20(使用 java 8)上使用 2.6.2 部署 spring 引导应用程序

为了测试这个问题,我尝试部署一个简单的 Hello World restcontroller 并遇到下面提到的问题。我能够在 Websphere 8.5.5.20 上使用 Spring Boot 1.5 部署应用程序,但在移动到 spring-boot 2.6.2.

时遇到困难

请注意,我已尝试使用 javax.servlet 和 jakarta.servlet(根据 spring 启动依赖项的版本)。我已经关注了这个 Link [ Deploy Spring Boot 2.x apps on WebSphere 8.5.5

根据我的应用程序类加载器的设置方式,我收到以下错误 企业应用程序 > simple-boot > 管理模块 > simple-boot.war

Parent 最后一个

错误:

[1/7/22 16:39:57:407 EST] 00000001 ContainerHelp E   WSVR0501E: Error creating component com.ibm.ws.runtime.component.CompositionUnitMgrImpl@c412fa58
com.ibm.ws.exception.RuntimeWarning: com.ibm.ws.exception.RuntimeWarning: com.ibm.ws.webcontainer.exception.WebAppNotLoadedException: Failed to load webapp: Failed to load webapp: javax.servlet.ServletContainerInitializer: Provider ch.qos.logback.classic.servlet.LogbackServletContainerInitializer not a subtype

Parent 第一

错误:

[1/7/22 16:42:17:173 EST] 00000047 SystemOut     O 2022-01-07 16:42:17.173  WARN 31546 --- [ver.startup : 1] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'defaultValidator' defined in class path resource [org/springframework/boot/autoconfigure/validation/ValidationAutoConfiguration.class]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: javax/validation/Configuration.getDefaultParameterNameProvider()Ljavax/validation/ParameterNameProvider; (loaded from file:/xxxxxxx/was/INSTANCE1/plugins/javax.j2ee.validation.jar by org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader@25be5b0d) called from class org.springframework.validation.beanvalidation.LocalValidatorFactoryBean (loaded from file:xxxx/simple-boot.ear/simple-boot.war/WEB-INF/lib/spring-context-5.3.14.jar by
com.ibm.ws.classloader.CompoundClassLoader@24768f5e[war:simple-boot/simple-boot.war]

我的pom.xml

注意:在此 pom.xml 中,我 javax.servlet 使用 3.1.0 进行测试,但如上所述,根据 spring 启动依赖项尝试使用默认版本,结果也相同。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.my.testApp</groupId>
    <artifactId>simple-webapp</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>simple-boot</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>jakarta.validation</groupId>
                    <artifactId>jakarta.validation-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>javax.el</groupId>
            <artifactId>javax.el-api</artifactId>
            <version>3.0.0</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>simple-boot</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

根据错误消息,最后一个父版本似乎失败了,因为在您的应用程序中打包了 Servlet API 的副本。这不是一个可用的配置,因为容器将 link 到它自己的 API 副本,因此它无法成功地将应用程序工件 link 转换为他们自己的 API 实例。有一些 API 可以在应用程序中引入自己的版本,但 Servlet 不在其中。

对于父优先失败,看起来 Spring 需要一个比服务器提供的更新版本的 javax.validation 包 - 它正在调用一个不存在的方法服务器的版本。 WebSphere 8.5.5 实现 Java EE 6,其中包括 Bean Validation 1.0,并且该方法直到 Bean Validation 1.1 才被添加。您需要一个 Spring 版本,该版本可与 Java EE 6 一起使用,或者可配置以避免更高版本的依赖性。也可以通过 运行 parent-last 解决这个问题,并包括一个单独的实现以及 API (显然,删除上一段中引用的 Servlet API ),尽管我对 Bean Validation API 还不够熟悉,不知道这是否会像 Servlet 一样导致与服务器运行时的冲突。