将 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 中删除了 jaxws 和 jaxb,所有我必须在迁移前pom.xml做;
- 设置java版本=>11
- 设置 maven-compiler-plugin 最小版本 => 3.8.0
- 显式放置 jaxws 和 jaxb 依赖项
我已经完成了这些事情并且添加了依赖项,例如
<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;
- jaxb-api-2.3.1.jar
- jaxws-api-2.3.1.jar
- jaxws-rt-2.3.1.jar
- eclipselink-2.7.6.jar
当我尝试将 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>
我有一个 java 应用程序为 Soap xml 网络服务提供服务,在当前情况下它是 java8 应用程序和 运行 在 weblogic 12c 上。我决定升级它 java11 和 weblogic 14c。据我从 Oracle 的文档中读到,在我读过的几篇文章中,Oracle 从 JDK11 permanently.Based 中删除了 jaxws 和 jaxb,所有我必须在迁移前pom.xml做;
- 设置java版本=>11
- 设置 maven-compiler-plugin 最小版本 => 3.8.0
- 显式放置 jaxws 和 jaxb 依赖项
我已经完成了这些事情并且添加了依赖项,例如
<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;
- jaxb-api-2.3.1.jar
- jaxws-api-2.3.1.jar
- jaxws-rt-2.3.1.jar
- eclipselink-2.7.6.jar
当我尝试将 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>