如何告诉 java8 使用我自己的库而不是内部库?

How to tell java 8 to use my own library instead of the internal one?

确切问题: 我有一个应用程序 运行 in Windows 2003 (jre 1.5) 现在它已经迁移到 Windows 2012 (jre 1.8) 服务器。在执行以下操作时发生异常,

Caller.main: com.sun.xml.internal.messaging.saaj.soap.ver1_1.Message1_1Impl cannot be cast to com.sun.xml.messaging.saaj.soap.MessageImpl

旧服务器使用jre 1.5,新服务器使用更新的1.8。在 jre 1.5 中,我们有单独的 saaj jars

来自 java6 saaj 实现在 jre 本身中提供,我们不需要单独的 jar。 因此,我得到了类广播异常。我想通过强制类路径从外部获取 saaj 罐子而不是 jre 本身中的罐子来解决这个问题。

嗯...我在 weblogic 中遇到问题,不得不更改 SAAJ 的默认实现(默认实现已损坏!)

为了在 weblogic 中实现这一点,我将其添加到启动 weblogic 的命令行中:

-Djavax.xml.soap.MessageFactory=com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl

所以,对你来说,它应该是这样的:

-Djavax.xml.soap.MessageFactory=com.sun.xml.messaging.saaj.soap.MessageFactoryImpl

应该可以。通过这种方式,您可以告诉 JVM 哪个将是 SAAJ 消息的默认工厂。

PS:老实说,他们有更多方法可以在不触及启动脚本的情况下在 weblogic 中更改它,我结束了更改代码并手动实例化未损坏的 MessageFactoryImpl 版本。我发现 -Djavax.xml.soap.MessageFactory 解决了我的问题,但不允许我更改生产服务器的启动脚本。

我终于找到了一个解决方案并且它起作用了。 使用 java 选项 -Xbootclasspath 我们可以做到这一点。

解法:

java -Xbootclasspath/p:.\jaxrpc16\saaj-api.jar;.\jaxrpc16\saaj-impl.jar -classpath <myClasses> <myMainClass>

参考: https://docs.oracle.com/javase/8/docs/technotes/tools/windows/javac.html

P.S:需要对此进行更多研究以确保此选项是否安全可靠。