【问题标题】: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 Boot 应用程序时出错
【发布时间】:2022-01-10 23:29:49
【问题描述】:

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

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

请注意,我已尝试使用 javax.servlet 和 jakarta.servlet(根据 Spring Boot 依赖项的版本)。我已关注此链接 [https://stackoverflow.com/questions/48156126/websphere-8-5-with-spring-5]、Deploy Spring Boot 2.x apps on WebSphere 8.5.5

根据我的应用程序类加载器的设置方式,我收到以下错误 企业应用程序 > 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 Boot 依赖项尝试使用默认版本也得到相同的结果。

<?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>

【问题讨论】:

  • 删除sevlet-api 依赖或使其至少范围为provided。同时放弃validation-api 并使用spring-boot-starter-validation 中的默认值。它是正确的版本,仍然有旧的 javax.validation 包。

标签: spring-boot java-8 websphere-8 spring-boot-2


【解决方案1】:

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

对于 parent-first 失败,看起来 Spring 期望 javax.validation 包的版本比服务器提供的更新版本 - 它正在调用服务器版本中不存在的方法。 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 API 不够熟悉知道这是否会像 Servlet 一样导致与服务器运行时发生冲突。

【讨论】:

  • 当我删除 servlet 依赖时......我收到以下错误......00000001 ContainerHelp E WSVR0501E: Error creating component com.ibm.ws.runtime.component.CompositionUnitMgrImpl@f24b9ec6 com.ibm.ws.exception.RuntimeWarning: com.ibm.ws.exception.RuntimeWarning: com.ibm.ws.webcontainer.exception.WebAppNotLoadedException: Failed to load webapp: Failed to load webapp: Unable to start web server&amp;amp;#59&amp;#59; nested exception is java.lang.NoClassDefFoundError: javax.servlet.http.HttpSessionIdListener
  • 这与使用 Bean Validation 时遇到的依赖问题相同——在 Servlet 3.1 中添加了 HttpSessionIdListener,而 Java EE 6 包含 Servlet 3.0。
  • 贾里德 .. 谢谢!!在高层次上使用与仅与 JAVA EE6 兼容的 IBM WAS 8.X 不兼容的 JAVA EE6 的 spring boot 2.6.2 是我的问题的核心。这两者的不兼容无法解决是我所理解的。在我准备好之前,我需要升级到更高版本的 WAS 或不升级到更高版本的 spring boot :-)。基于这种理解,我认为您可能已经回答了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
  • 2020-04-26
  • 2010-10-29
相关资源
最近更新 更多