Java OJDBC6到OJDBC7驱动程序更新导致ClassCastException

Java OJDBC6到OJDBC7驱动程序更新导致ClassCastException,java,jdbc,ojdbc,Java,Jdbc,Ojdbc,我们将应用程序中的OJDBC驱动程序从OJDBC6更新为OJDBC7。我有一种奇怪的感觉。内部日志显示: oracle.jdbc.driver.BlockSource$ThreadedCachingBlockSource$BlockReleaserListener.(BlockSource.java:348) 我们得到: java.lang.ClassCastException:sun.management.MemoryImpl不能强制转换为javax.management.Notificati

我们将应用程序中的OJDBC驱动程序从OJDBC6更新为OJDBC7。我有一种奇怪的感觉。内部日志显示:
oracle.jdbc.driver.BlockSource$ThreadedCachingBlockSource$BlockReleaserListener.(BlockSource.java:348)
我们得到:
java.lang.ClassCastException:sun.management.MemoryImpl不能强制转换为javax.management.NotificationEmitter

我们不知道为什么会出现这种异常,因为根据MemoryImpl实现NotificationEmitter

如果我们将JVM从Hotspot更改为IBM(都是JDK7),我们得到的结果是相同的:
java.lang.ClassCastException:com.ibm.lang.management.MemoryMXBeanImpl与javax.management.NotificationEmitter不兼容

同样,MemoryMXBeanImpl实现NotificationEmitter


因此,如果有人有解决办法或者知道为什么会发生这种情况,我将非常感激

javax/management/NotificationEmitter.class
是否出现在两个不同的密封罐中,或者在不同的类加载器中是否加载了它的两个版本[从文件中加载了javax.management.NotificationEmitter:/C:/development/newSRC/lib/j2ee/jars/j2ee.jar]因此,如果有任何方法可以说JVM不使用同一个接口的实例,那么我似乎必须使用同一个接口的实例?我想这描述了你的问题。解释了一些解决方案。一个没有提到的解决方案是强制父类加载器先加载该类,这样两个不同的类加载器就不会加载它,而是使用父类的。谢谢你,迈克,在我们对我们使用的jar下了一些订单之后,(实际上,现在开始使用没有javax.management包的j2ee.jar版本),一切都很好!!!很高兴听到这个消息。类加载愉快。