使用Java 8,您仍然可以继续使用已弃用的机制。Oracle只提供了一种方法来检查您的应用程序是否使用该机制,即使用Java 8更新40及更高版本中可用的java.exe标志
-XX:+CheckEndorsedAndExtDirs
[
1]。
当您升级到Java 9时,为避免您的Java应用程序在运行时失败,导致ClassNotFoundException引起的NoClassDefFoundError等问题,您需要重新编写代码以使用Java 9中的新机制。
Exception in thread "pool-1-thread-3" java.lang.NoClassDefFoundError: javax/rmi/CORBA/Stub
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(Unknown Source)
at java.base/java.security.SecureClassLoader.defineClass(Unknown Source)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(Unknown Source)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(Unknown Source)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(Unknown Source)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
at org.jacorb.orb.ORB._getDelegate(ORB.java:541)
at org.jacorb.orb.ORB.string_to_object(ORB.java:2110)
--snip--
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: javax.rmi.CORBA.Stub
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
... 26 more
您需要更新java.exe启动命令行,添加参数,例如
--add-modules
--patch-module
-add-exports
有关具体示例,请参见Grzegorz Grzybek在jacorb-developer邮件列表中于2016年9月发布的文章[
2]。我们不得不更新应用程序的Windows批处理文件,使用Java 9的额外命令行参数。
java --add-modules "java.corba" --patch-module "java.corba=..\lib\jacorb-omgapi-3.4.jar" --add-exports=java.corba/org.omg.CONV_FRAME=ALL-UNNAMED --add-exports=java.corba/org.omg.CORBA_2_5=ALL-UNNAMED --add-exports=java.corba/org.omg.PortableGroup=ALL-UNNAMED --add-exports=java.corba/org.omg.ETF=ALL-UNNAMED --add-exports=java.corba/org.omg.GIOP=ALL-UNNAMED --add-exports=java.corba/org.omg.SSLIOP=ALL-UNNAMED --add-exports=java.corba/org.omg.CSIIOP=ALL-UNNAMED -jar ourapp.jar
与CORBA和Java有关的一个注脚是,CORBA(和JAXB)在Java 11中被计划完全删除。请参见“JEP 320:删除Java EE和CORBA模块” [
3]以及这篇博客文章[
4]。