已弃用的认可标准的替代替代机制和扩展机制

  • 本文关键字:机制 扩展 标准 java java-8 java-9
  • 更新时间 :
  • 英文 :


Java 8 Update 40 (8u40) 的发行说明指出:

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

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

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

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

另一方面,在不提供替代方案的情况下弃用某些内容不是一个好的做法。

发行说明指出:"现有应用程序 [...]建议迁移不再使用这些机制"

那么如何"远离"

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

在Java SE 8中?

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

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

不幸的是,您现在似乎无能为力,例如,对于属于 JRE 的库。

如果您受到影响该怎么办

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

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

当您升级到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使用类似参数启动命令行 --添加模块 --补丁模块 -添加导出

有关具体示例,请参阅 Grzegorz Grzybek 2016 年 9 月关于 jacorb-developer 邮件的帖子 [2]。 我们必须使用 Java 9 附加命令行参数更新应用程序的 Windows 批处理文件,例如

java --add-modules "java.corba" --patch-module "java.corba=..libjacorb-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]。

现在的回退是在执行 java 实例时显式列出类路径目录和 jar 文件。

最新更新