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

时间:2017-06-27 07:20:18

标签: java java-8

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

  

Caller.main:com.sun.xml.internal.messaging.saaj.soap.ver1_1.Message1_1Impl无法强制转换为com.sun.xml.messaging.saaj.soap.MessageImpl

旧服务器使用 jre 1.5 ,新服务器使用较新的1.8 。在 jre 1.5 ,我们分别有 saaj jars

java 6 开始,ja本身提供了saaj实现,我们不需要单独的jar。 因此,我得到了classcast异常。我想通过强制类路径从外部获取saaj jar而不是jre本身的那个来解决这个问题。

2 个答案:

答案 0 :(得分:2)

嗯......我在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解决了我的问题,但我不允许更改生产服务器的启动脚本。

答案 1 :(得分:0)

最后,我找到了一个解决方案及其工作原理。 使用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:需要对此进行更多研究,以确保此选项是否安全可靠。