已弃用的认可标准的替代方案覆盖机制和扩展机制

时间:2015-03-11 10:20:09

标签: java java-8 java-9

release notes for Java 8 Update 40 (8u40)州:

  

认可标准覆盖机制和扩展机制   已弃用,可能会在将来的版本中删除。没有   运行时更改。使用'认可标准的现有应用程序   建议使用override'或'extension'机制进行迁移   使用这些机制。

还有一个问题澄清了Jigsaw(计划用于Java SE 9,AFAIK),这将以某种方式用模块化方法取代:

http://bugs.java.com/view_bug.do?bug_id=8065675

我知道Oracle现在想要弃用这些机制,因为他们不再支持Java SE 9了。

另一方面,如果不提供替代方案,弃用某些东西并不是一个好习惯。

发行说明指出:“建议现有应用程序迁移使用这些机制”

那你怎么能“远离”

  • 认可标准覆盖机制
  • 扩展机制

在Java SE 8中?

2 个答案:

答案 0 :(得分:3)

我找到了以下文章,它解释了这些机制确实计划在Java SE 9中删除:

https://blogs.oracle.com/java-platform-group/entry/planning_safe_removal_of_under

不幸的是,你现在似乎无能为力,例如对于属于JRE的图书馆而言。

  

如果您受到影响该怎么办

     

虽然大多数应用程序不使用   一些应用程序可以使用认可的标准或扩展机制。   如果您是开发人员,请考虑提供依赖项作为一部分   您的应用程序,而不是需要外部系统   配置。如果您不是开发人员,请联系   个人软件供应商的支持。

答案 1 :(得分:2)

使用Java 8,您可以继续使用已弃用的机制。 Oracle仅提供一种方法来检查您的应用程序是否使用Java 8更新40及更高版本中提供的此java.exe标志-XX:+CheckEndorsedAndExtDirs [1]的机制。

当您升级到Java 9时,为了避免Java应用程序在运行时失败,使用ClassNotFoundException引起的NoClassDefFoundError

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模块     --patch模块     -add出口

有关具体示例,请参阅Grzegorz Grzybek在jacorb-developer邮件[2]上发布的2016年9月帖子。我们必须使用Java 9附加命令行参数(如

)更新应用程序的Windows批处理文件
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]。