繁体   English   中英

在 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 上使用 2.6.2 部署 spring 引导应用程序(使用 java 8)

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

请注意,我已尝试使用 javax.servlet 和 jakarta.servlet(根据 spring 引导依赖项的版本)。 我已关注此链接 [https://stackoverflow.com/questions/48156126/websphere-8-5-with-spring-5], 在 WebSphere 8.5.5 上部署 Spring Boot 2.x 应用程序

我通过从企业应用程序 > simple-boot > 管理模块 > simple-boot.war 设置我的应用程序的类加载器的方式得到以下错误

父母最后

错误:

[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

家长第一

错误:

[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 的副本。 这不是一个可用的配置,因为容器将链接到它自己的 API 副本,因此它无法成功转换链接到它们自己的 API 实例的应用程序工件。 有一些 API,您可以在应用程序中使用自己的版本,但 Servlet 不在其中。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM