java - 从命令提示符运行 RMI 应用程序

标签 java rmi distributed-computing

我一直在开发一个(有点复杂)应用程序,使用 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/

相关文章:

java - 小服务程序 3.0 : How to off-load Async processing to a different JVM?

java - Linux 平台上的 Desktop#browse 是否仅支持 Gnome 桌面?

java RMI 和/或 JNDI : binding for objects that are not singletons

spring - RMIServiceExporter 不工作,不连接到端口 1099 的 RMI localhost

java - 无法使用 VisualVM 连接到 JMX/RMI 服务器,原因不明

database - 在高性能应用程序上缓存数据库表

java - 不在 Servlet 容器中时 StackHunter 远程错误日志记录

java - 在 Gson 中使用泛型类型

java - 从 play framework 2.0.8 迁移到 2.1.0 错误 : cache play already exists

java - 坏元素的映射