繁体   English   中英

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

[英]Running an RMI application from Command Prompt

我一直在使用RMI开发一个(有点复杂)的应用程序来读取文件并对其内容进行JSON。 我已经在Netbeans 6.7上对该应用程序进行了编码,因此我的文件夹结构如下:

在C:\\ MyApp下:

-建立

---班

------- MyApp <---这是一个包。 我的.class文件在其中。 另外,我从这里运行rmiregistry。

-dist

--- LIB

--------- [一些.jar库]

-src

...

[一些文件]

我的应用程序使用dist \\ libs文件夹中的库,并在[某些文件]部分中加载一个文件以从当前目录读取。

但是,每当我使用以下命令运行应用程序时(从build \\ classes文件夹中)

java -cp .;..\..\dist\lib\gson-1.4.jar;..\..\..\MyApp -Djava.security.policy=C:\java.policy MyApp.Main

我不断收到ClassNotFoundException错误,并且找不到与我的RMI接口有关的错误列表。 一次运行,它找不到我需要读取的文件。 (在我的应用程序中得到了NullPointerException)。

你们能告诉我我做错了吗? 我相信这与类路径有关。

另外,如果有一种方法可以从Netbeans本身运行RMI应用程序,那就太好了,但是在搜索时我一直找不到任何方法可以做到这一点。

哦,rmiregistry正在运行。 我的策略文件包含一个简单的单行授予All。

请帮忙! 谢谢!

我认为您应该在类路径中提供c:\\MyApp\\build\\classes ,而不是我理解的..\\..\\..\\MyApp东西是您的项目基础目录。

至少...这样,您的java将可以访问您的项目的类。

编辑:不带RMIRegistry的应用程序示例

如果正常运行应用程序(服务器端),则可以发布没有rmiregisty工具的RMI对象。 它可以简单地创建自己的注册表,并在您选择的某些端口中进行监听。

这是我编写的应用程序中的一个有效示例。

客户端应用程序只需在其类路径中具有对象的接口(当然还有所有引用的接口和类!)。

BatchServer是实现RMI接口( 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);

谢谢Helios。 您的答案是有益的。 我已将其保存起来,以备将来参考。

无论如何,我在发布答案之前设法解决了这个问题。 我不想使用复杂的东西,例如代码库和Web服务器等。

首先,我转到build \\ classes文件夹并从那里运行rmiregistry。 我知道,如果它检测到类路径中的类,它将忽略codebase参数。 那就是我想要的。

然后,我将该classpath参数更改为更简单的参数。 我进入了项目根目录,然后从那里引用了必要的库,例如

-classpath .;dist\lib <the jar files I needed>;build\classes

最后,对于客户端,我直接在主项目包中具有RMI接口文件。 事实证明,它应该与服务器上的软件包位于同一软件包中。 因此,我在客户端上创建了必要的程序包,并将RMI接口放置在那里。 我在客户端上使用CodeBase作为开始,但始终收到“无法强制转换$ Proxy0”错误,这给了我有关软件包问题的解决方案。

现在,一切似乎都正常了。 客户端可以与服务器通信。 我现在仅在localhost上进行了测试,无法确定它是否可以在网络上的计算机上运行。 我相信ClassNotFound异常是由于RMI注册中心未正确启动(未找到类)。

希望我的解决方案实际上是合适的。 我不明白该代码库的事情。 如何动态下载类或其他内容。 我仍然是Java / RMI学生/菜鸟。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM