当前位置: 首页 > 知识库问答 >
问题:

RMI服务器不会从其HTTP代码库服务器动态加载缺少的类

娄学文
2023-03-14

语境

这是一个使用Java RMI的应用程序,具有:

  • 主机A上的客户端和主机B上的服务器
  • 主机A上的HTTP服务器,它保存客户端和服务器使用的所有类的副本。
  • RMI注册表是从服务器代码创建的,它共享服务器JVM和CLASSPATH。

对于服务器和客户端应用程序:

  • java。马绍尔群岛共和国。服务器codebase属性(在代码中)设置为HTTP服务器URL
  • 安全管理器具有适当的策略
  • java。马绍尔群岛共和国。服务器主机名设置为LAN地址

方法调用:

  • 服务器方法是用类型为WorkRequest(抽象类)的参数定义的。
  • 客户端使用一个子类调用此方法。
  • 工作请求广场在服务器代码中从未被提及

服务器代码

Object execute(WorkRequest work) throws RemoteException { return work.execute(); }

客户端代码:

try { servant.execute(new WorkRequestSquare(123)); }
catch (RemoteException e) {
    System.out.println("Error while submitting work request:");
    e.printStackTrace();
}

当服务器在CLASSPATH中拥有所有相关的类并且不需要动态加载时,此代码可以工作。

问题

从服务器端的类路径中删除WorkRequestSquare会在客户端引发异常(服务器端不会引发任何异常):

Error while submitting work request:
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: WorkRequestSquare
    at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
    ...

WorkRequestSquare服务器代码中从未明确提到过它,它应该是可动态加载的,但这不会发生。

旁路

Stuart Marks让我意识到,属性java.rmi.server.useCodebasOnly应该设置为false

在JDK 7u21中,此属性的默认值已从false更改为trueuseCodebaseOnly设置为true可防止JVM从任何位置动态加载类,使用java在本地定义的位置除外。马绍尔群岛共和国。服务器代码库。这意味着,如果服务器useCodebaseOnlytrue,则会忽略客户端JVM在编组WorkRequestSquare参数时设置的代码基值。

当服务器上的useCodebaseOnly设置为false,并且从服务器类路径中删除WorkRequestSquare类时,服务器现在从HTTP服务器获取类定义。这是一个有效的旁路。

问题

由于客户端和服务器的codebase属性值相同,因此仍然存在异常。

useCodebaseOnly被默认为true时,服务器JVM应该忽略添加到RMI流中的客户端codebase,但无论如何,它应该使用自己的codebase来检索WorkRequestSquare类。

无论如何,这应该是成功的,因为客户端和服务器的代码库值是相同的。

有人能解释一下那件事吗?

共有1个答案

朱啸
2023-03-14

类路径中需要的最小类集是什么?

在客户端代码中按名称实际使用的类。例如,远程接口、形式参数和结果的类型、远程方法签名中命名的异常类型。

/如果使用代码库服务器可以使用,那么类路径中可能缺少哪些类?

实现上述类或接口且在客户端代码中不按名称使用的类。

是否有一个工具来调试RMI通信(例如RMI通信)。Eclipse插件)并避免使用网络嗅探器?

确实有一个eclipse插件,我很多年前就看到了,但我从来没有真正需要过。

 类似资料:
  • 我在服务器上下载了oracle WebLogic Server 12c并创建了一个域。weblogic服务器已启动并正在运行,但当我进入deployments部分时,它是空的,没有安装库。 在JDeveloper中创建本地WebLogic服务器时,默认情况下会在服务器上安装和部署一些基本库。但是在服务器端单独安装WebLogic服务器的情况下,部署部分是空的,并且缺少一些关键库,如adf。神谕域(

  • 我试图用JavaFX替换JSP、HTML和JavaScript,所以我在webserver中保留了FXML文件和业务逻辑。我可以从服务器加载FXML,并通过简单的JavaFX(java)代码在客户端显示它们,但我不能动态加载事件处理程序(控制器)。我想使客户端应用程序成为轻量级应用程序。 有人能建议一个更好的方法来做到这一点吗? 已编辑:我们必须在fxml文件中指定事件处理程序类名。事件处理程序的

  • 操作系统: Windows 7 JDK: 1.8.0_05 我正在学习一些简单的RMI教程,包括Oracle的“计算”示例(Compute)。启动我的服务器不需要代码库,对类似问题的回答是“代码库是可选的”然而,我的服务器无法注册远程对象,除非它的接口位于某个代码库中。 我确保我的计算接口是可用的Web服务器上运行localhost,启动注册表服务器像这样: 一切正常: 但是如果我从Web服务器的

  • 如何将JBoss或JBoss EAP库添加到Eclipse中项目的Java构建路径? 我的平台:带有WindowsXPSP3、JDK7和JRE7的虚拟机、面向Web开发人员的EclipseJavaEEIDE(版本:开普勒服务发行版2)、Eclipse中新的干净工作区 我所做的: 从市场上为开普勒安装了JBoss工具 文件夹与解压缩的JBoss EAP-我尝试与jboss-eap-6.2.0.zip

  • 问题内容: 在Windows中使用Java代码,我需要从放置在服务器中的目录中下载几个文件。服务器中的那些文件是分别生成的。所以我不知道这些文件的名称。有什么方法可以使用JAVA下载它并将其保存在特定的文件夹中。 我正在使用apache tomcat。 我阅读了与Java文件下载相关的所有其他线程。但是他们都不满足我的要求。 问题答案: 使用和分类。

  • 问题内容: 我正在学习Java RMI,并且创建了一个非常简单的服务器来计算斐波那契数。服务器(FibonacciServer)创建一个负责计算序列的对象(Fibonacci),并且该对象实现接口(IFibonacci): FibonacciServer.java: 斐波那契 IFibonacci: 如您所见,这是一个非常基本的示例。我正在使用命令在Linux上启动RMI注册表,它启动没有问题。