将 java8 和 WLS 12c 迁移到 Java11 和 WLS 14c

Migration java8 and WLS 12c to Java11 and WLS 14c

我有一个 java 应用程序为 Soap xml 网络服务提供服务,在当前情况下它是 java8 应用程序和 运行 在 weblogic 12c 上。我决定升级它 java11 和 weblogic 14c。据我从 Oracle 的文档中读到,在我读过的几篇文章中,Oracle 从 JDK11 permanently.Based 中删除了 jaxwsjaxb,所有我必须在迁移前pom.xml做;

我已经完成了这些事情并且添加了依赖项,例如

        <dependency>
            <groupId>com.sun.xml.ws</groupId>
            <artifactId>jaxws-ri</artifactId>
            <version>2.3.1</version>
            <type>pom</type>
            <exclusions>
                <exclusion>
                    <groupId>org.glassfish.jaxb</groupId>
                    <artifactId>jaxb-runtime</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.xml.bind</groupId>
                    <artifactId>jaxb-xjc</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.xml.bind</groupId>
                    <artifactId>jaxb-jxc</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>eclipselink</artifactId>
            <version>2.7.6</version>
        </dependency>

我删除了旧的 jaxb 实现并添加了 MOXY 实现。在部署到 wls 14c 之前,一切都很好,编译成功,我可以在我的 war 文件中看到 jars;

当我尝试将 war 文件部署到 wls 14c 时,我在 wsl 14c 控制台日志上收到奇怪的堆栈跟踪错误;

weblogic.application.ModuleException: java.lang.VerifyError: Bad type on operand stack
Exception Details:
  Location:
    com/sun/xml/ws/db/glassfish/JAXBRIContextFactory.getContext(Ljavax/xml/bind/Marshaller;)Lcom/sun/xml/ws/spi/db/BindingContext; @8: invokevirtual
  Reason:
    Type 'com/sun/xml/bind/v2/runtime/JAXBContextImpl' (current frame, stack[1]) is not assignable to 'javax/xml/bind/JAXBContext'
  Current Frame:
    bci: @8
    flags: { }
    locals: { 'com/sun/xml/ws/db/glassfish/JAXBRIContextFactory', 'javax/xml/bind/Marshaller' }
    stack: { 'com/sun/xml/ws/db/glassfish/JAXBRIContextFactory', 'com/sun/xml/bind/v2/runtime/JAXBContextImpl' }
  Bytecode:
    0000000: 2a2b c000 34b6 0035 b600 36b0          

    at weblogic.application.internal.ExtensibleModuleWrapper.start(ExtensibleModuleWrapper.java:140)
    at weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:124)
    at weblogic.application.internal.flow.ModuleStateDriver.next(ModuleStateDriver.java:233)
    at weblogic.application.internal.flow.ModuleStateDriver.next(ModuleStateDriver.java:228)
    at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:45)
    Truncated. see log file for complete stacktrace

我无法理解错误消息,我错过了什么?你能帮忙吗

我找到了解决方案,如果你是 运行 你的应用程序在 wls14c 上,你唯一需要做的就是添加 JAX-RT 依赖 提供范围。因为在 java11 中,jax-ws 和 jaxb 被删除了,但在 wls14c 中没有。

        <dependency>
            <groupId>com.sun.xml.ws</groupId>
            <artifactId>jaxws-rt</artifactId>
            <version>2.3.3</version>
            <scope>provided</scope>
        </dependency>