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

11

Java 8 Update 40 (8u40)的发布说明中提到:

认可标准覆盖机制和扩展机制已被弃用,并可能在未来的版本中删除。没有运行时变化。建议现有使用“认可标准覆盖”或“扩展”机制的应用程序迁移到不使用这些机制。

还有一个问题需要澄清,即Jigsaw(计划用于Java SE 9,据我所知)将以某种模块化方法取代它:

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

我知道Oracle现在想弃用这些机制,因为它们不能在Java SE 9中支持它们。另一方面,不提供替代方案是不好的做法。发行说明指出:“现有应用程序建议迁移到不使用这些机制”。那么,在Java SE 8中,如何“迁移”以下两种机制:1. endorsed-standards覆盖机制;2.扩展机制?

在哪里说不能支持Java 9? - user207421
@EJB 这是我理解的。例如,在这个问题中:“从现在开始,我们期望仅以可升级模块的形式支持认可的标准和独立API,通过升级模块的概念[2]。”也许我在其他资源中也读到了一些关于这方面的内容。据我所知,Jigsaw计划用于Java SE 9。但再次强调,这至少是我目前的理解,不一定是事实。您是否有其他相关信息? - Puce
“Going forward” != Java 9. 你不必过度惊慌。他们还没有提到目标发布日期或时间表。我认为在至少有一个主要版本发布并且两种机制都存在之前,您是安全的:也许是两个或更多。 - user207421
@EJP,也许你是对的。不过,是否有方法可以像8u40版本说明中建议的那样“迁移”,以便我们可以为新情况做好准备并避免使用已弃用的功能?或者这只有在Jigsaw中才可能实现(但此时该建议至少令人困惑)? - Puce
@EJP 一些背景信息:这不仅是一个理论问题,而且我目前处于这样一种情况:我认为我必须在我正在编写的框架中使用一个已认可的库。阅读这些发布说明,我意识到我将使用已经过时的东西。所以我的问题是:现在有更好的方法吗?相关问题是:http://stackoverflow.com/questions/26769891/osgi-javax-annotation-conflict-java-se-vs-java-ee - Puce
@EJP:它们确实计划在Java SE 9中被删除。我找到了另一篇文章。请看我的回答。 - Puce
3个回答

3

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

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

很遗憾,现在似乎没有太多可以做的事情,例如对于JRE中的一部分库。

如果您受到影响该怎么办

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


2
使用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]。

-1

目前您的备选方案是在执行Java实例时显式列出类路径目录和JAR文件。


据我所知,“正常”的类路径无法替换JRE提供的类。 - Puce
JRE提供的是默认值。用户通过外部方式添加到JRE路径的扩展通常被认为是反模式。我从未使用过endorsed-dirs功能。所有外部依赖项最好都列在类路径上。你在扩展中拥有的任何东西都应该作为.jar或类目录提供,也放在类路径上。这是我的看法。 - Robert Casey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接