【问题标题】:sun.rmi.server and sun.rmi.transport - jdk internal APIs not supported from Java 10sun.rmi.server 和 sun.rmi.transport - Java 10 不支持 jdk 内部 API
【发布时间】:2018-06-12 11:18:47
【问题描述】:

我目前正在使用 Java 8,并希望迁移到 Java 11。

下面列出的 jdeps -P -jdkinternals ... 命令在 Java 10 中不受支持。

sun.rmi.server.UnicastRef
sun.rmi.server.UnicastRef2 
sun.rmi.transport.Endpoint 
sun.rmi.transport.LiveRef 
sun.rmi.transport.tcp.TCPEndpoint 

有人可以帮我寻找上述课程的替代品吗?

JDK 11 中 JDEPS 的输出:

digraph "AppCore.jar" {
// Path: D:\jdeps\srclib\AppCore.jar
   "com.util.RMIServer"                                -> "sun.rmi.server.UnicastRef (JDK internal API (java.rmi))";
   "com.util.RMIServer"                                -> "sun.rmi.server.UnicastRef2 (JDK internal API (java.rmi))";
   "com.util.RMIServer"                                -> "sun.rmi.transport.Endpoint (JDK internal API (java.rmi))";
   "com.util.RMIServer"                                -> "sun.rmi.transport.LiveRef (JDK internal API (java.rmi))";
   "com.util.RMIServer"                                -> "sun.rmi.transport.tcp.TCPEndpoint (JDK internal API (java.rmi))";
   "com.util.WrappedPostlessSocket"                    -> "sun.rmi.transport.proxy.RMISocketInfo (JDK internal API (JDK removed internal API))";
}

谢谢。

【问题讨论】:

  • 如果您的应用程序直接使用这些类,它有问题,你需要修复它。 Java 本身可以使用这些类。
  • @Tschallacka 是的,我查看了包名,它是java.rmi.registry,并且在该页面上特别提到它从 Java 1.1 开始就存在,这不是包之一OP提到的,你提到的包java.rmi.server从Java 1.1开始也存在,你发明的包java.rmi.transportjava.rmi.transport.tcp根本不存在于任何版本的Java中。你的观点?
  • 直接使用sun.* 类是总是错误的,二十多年来一直有关于这个问题的具体警告。发布相关代码,我们会告诉你如何修复它。
  • 你必须修复它。看起来它仅限于几个类。

标签: java rmi java-10 java-11


【解决方案1】:

JDK 11 允许我们通过将模块导出到带有 警告 的项目中来使用少量内部 API,如下所示:

warning: UnicastRef is internal proprietary API and may be removed in a future release.

警告清楚地说明了将要发生的事情。

命令:

javac --add-exports java.rmi/sun.rmi.server=ALL-UNNAMED RMIServer.java  

Where, java.rmi -> is a module name,
       sun.rmi.server -> is the package name,
       RMIServer.java -> Class in which package sun.rmi.server is imported.

在 java 9 中很少有其他内部 API 被移动到 jdk.internal...* 包中,可以在没有任何警告的情况下访问它们,如下所示:

javac --add -exports jdk.management.agent/jdk.internal.agent=ALL-UNNAMED HelloWorld.java  

注意:这个问题与是否直接在你的应用程序代码中使用内部API无关。因为有 15 多年前使用内部 API 开发的软件产品,它们仍然存在于 java 8 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-30
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 2023-03-16
    • 2019-01-23
    相关资源
    最近更新 更多