首页 > 解决方案 > sun.rmi.server 和 sun.rmi.transport - Java 10 不支持 jdk 内部 API

问题描述

我目前正在使用 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))";
}

谢谢。

标签: javarmijava-10java-11

解决方案


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


推荐阅读