语境
这是一个使用Java RMI的应用程序,具有:
对于服务器和客户端应用程序:
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
更改为true
useCodebaseOnly
设置为true
可防止JVM从任何位置动态加载类,使用java在本地定义的位置除外。马绍尔群岛共和国。服务器代码库
。这意味着,如果服务器useCodebaseOnly
为true
,则会忽略客户端JVM在编组WorkRequestSquare
参数时设置的代码基值。
当服务器上的useCodebaseOnly
设置为false
,并且从服务器类路径中删除WorkRequestSquare
类时,服务器现在从HTTP服务器获取类定义。这是一个有效的旁路。
问题
由于客户端和服务器的codebase
属性值相同,因此仍然存在异常。
当useCodebaseOnly
被默认为true
时,服务器JVM应该忽略添加到RMI流中的客户端codebase
,但无论如何,它应该使用自己的codebase
来检索WorkRequestSquare
类。
无论如何,这应该是成功的,因为客户端和服务器的代码库值是相同的。
有人能解释一下那件事吗?
类路径中需要的最小类集是什么?
在客户端代码中按名称实际使用的类。例如,远程接口、形式参数和结果的类型、远程方法签名中命名的异常类型。
/如果使用代码库服务器可以使用,那么类路径中可能缺少哪些类?
实现上述类或接口且在客户端代码中不按名称使用的类。
是否有一个工具来调试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注册表,它启动没有问题。