11

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 中?

4

3 回答 3

3

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

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

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

如果你受到影响怎么办

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

于 2015-03-12T00:27:46.860 回答
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 

您需要使用 --add-modules --patch-module -add-exports 等参数更新您的 java.exe 启动命令行

有关具体示例,请参阅 Grzegorz Grzybek 在 2016 年 9 月发表的关于 jacorb-developer 邮件 [ 2 ] 的帖子。我们必须使用 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 ]。

于 2017-05-05T19:29:31.750 回答
-1

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

于 2017-02-23T22:38:43.890 回答