我一直在开发一个(有点复杂)应用程序,使用 RMI 来读取文件和 JSON 其内容。我一直在 Netbeans 6.7 上编写此应用程序,因此我的文件夹结构如下:
在 C:\MyApp 下:
-构建
--- 类
-------- MyApp <--- 这是一个包。我的 .class 文件就在那里。另外,我从这里运行了 rmiregistry。
-距离
---库
--------- [一些 .jar 库]
-src
...
[一些文件]
我的应用程序使用 dist\libs 文件夹中的库,并加载单个文件以从当前目录的 [Some files] 部分中读取。
但是,每当我使用以下命令运行应用程序时:(来自 build\classes 文件夹)
java -cp .;..\..\dist\lib\gson-1.4.jar;..\..\..\MyApp -Djava.security.policy=C:\java.policy MyApp.Main
我不断收到 ClassNotFoundException 错误以及有关未找到 RMI 接口(interface)的错误列表。它运行一次时,无法找到我需要读取的文件。 (在我的应用程序中出现 NullPointerException)。
你们能告诉我我做错了什么吗?我相信这与类路径有关。
此外,如果有一种方法可以从 Netbeans 本身运行 RMI 应用程序,那就太好了,但我在四处搜索时找不到任何方法来执行此操作。
哦,rmiregistry 正在运行。我的策略文件包含一个简单的一行 grant All。
请帮忙!谢谢!
最佳答案
我认为你应该在类路径中提供 c:\MyApp\build\classes
而不是我理解的 ..\..\..\MyApp
是您的项目基目录。
至少...这样你的java就可以访问你项目的类了。
编辑:没有 RMIRegistry 的应用程序示例
如果您正常运行应用程序(服务器端),则无需 rmiregisty 工具即可发布 RMI 对象。它简单地创建自己的注册表,在您选择的某个端口中进行保留和监听。
这是我制作的应用程序的一个工作示例。
客户端应用程序只需在其类路径中包含该对象的接口(interface)(当然还有所有引用的接口(interface)和类!)。
BatchServer
是实现 RMI 接口(interface) (BatchService
) 的 RMI 对象,并且不扩展任何特定内容。
public static void publishAndRun(int port, String name, BatchServer server) throws RemoteException, AlreadyBoundException, NotBoundException
{
Registry registry = LocateRegistry.createRegistry(port);
GPRSService stub = (BatchService) UnicastRemoteObject.exportObject(server, 0);
try
{
registry.bind(name, stub);
try
{
server.run();
}
finally
{
registry.unbind(name);
}
}
finally
{
UnicastRemoteObject.unexportObject(server, true);
}
}
您的客户端应用程序必须在 machine:port 中查找您的注册表并请求 name
对象:
Registry registry = LocateRegistry.getRegistry(server, port);
BatchService gprs = (BatchService) registry.lookup(name);
关于java - 从命令提示符运行 RMI 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2068771/