1

我正在阅读head first java,我将尝试展示如何使用RMI的现成代码。这些是类:

远程接口

import java.rmi.*;

public interface MyRemote extends Remote {

    public String sayHello() throws RemoteException;
}

远程实现

import java.rmi.*;
import java.rmi.server.*;

public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote {

    public String sayHello() {
        return "Server Says,Hello";
    }

    public MyRemoteImpl() throws RemoteException { }

    public static void main(String[] args) {

        try {
            MyRemote service = new MyRemoteImpl();
            Naming.rebind("Remote Hello", service);
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

然后我将 .java 和 .class 文件放在 c:\RMI 中。运行它时,它说 MyRemoteImpl 类未找到,即使我从同一目录运行。我怎样才能解决这个问题?谢谢。

编辑:当我尝试运行此命令时出现错误

rmic MyRemoteImpl
4

9 回答 9

2

BuddingProgrammer 的评论也对我有用。

例如,如果您的类位于文件夹 C:\users\renato\workspace\ADI\src\semana5 中,则应转到上一层: C:\users\renato\workspace\ADI\src 并且应该像这样编译:javac semana5\Calculadora.java

要运行 RMI,您应该在 中键入以下命令C:\users\renato\workspace\ADI\src

 rmic semana5.CalculadoraImp
于 2016-08-29T23:31:04.450 回答
0
  1. 创建一个文件夹命名它HelloServer
  2. package HelloServer;在每个类的顶部添加一个 this 包,MyRemote然后MyRemoteImpl.
  3. 打开 cmd 并从包含该文件夹的目录中写入javac HelloServer/MyRemote.java和。javac HelloServer/MyRemoteImpl.javaHelloServer
  4. rmic HelloServer.MyRemoteImpl从包含该文件夹的目录写入HelloServer
  5. 你现在应该有一个MyRemoteImpl_stub.class,你可以有一个美好的一天:)

PS:包名与 RMI 或类中使用的任何对象不同,这一点很重要。否则你会发生物体碰撞。

于 2013-05-14T11:58:57.283 回答
0

由于我遇到了同样的问题并且这些答案都没有帮助我,我将添加对我有用的内容。我在包含 MyRemoteImpl.java 的目录中运行 rmic MyRemoteImpl 并得到了同样的错误。当我在包含 MyRemoteImpl.class 的目录中运行 rmic MyRemoteImpl 时,它工作并创建了 MyRemoteImpl_Stub.class。我不需要设置 CLASSPATH。

于 2013-12-17T04:08:50.970 回答
0

如果您没有从包含 .class 文件的目录中运行此命令,则应该是,假设您发布的内容没有 package 语句。如果有包语句,您应该从包含最高级别包的目录中运行此命令。

否则你的 CLASSPATH 环境变量有问题。它至少应该包含“。”,可能还有一些其他的东西。作为一种解决方法,您可以采用 Isaac 的建议,但是当您开始编译和执行时,您只会遇到同样的问题。

于 2012-09-09T05:22:40.760 回答
0
  • 当您尝试运行CLASSPATH文件时,JVM 将在其中查找要执行的文件,有一个名为路径变量。

  • CLASSPATH描述了应用程序中使用的所有必需文件可用的位置。

  • Java 编译器和 JVM(Java 虚拟机)使用CLASSPATH来定位所需的文件。

  • 如果没有设置CLASSPATH,Java 编译器将无法找到所需的文件,因此会抛出错误。

  • 如果您不知道当前路径在哪里,请echo "%CLASSPATH%"在命令提示符下键入。

  • 或者,您也可以CLASSPATH环境变量中添加/删除/编辑变量

  • 确保已将Java添加到路径中。

  • 要添加文件所在的当前路径,.class有三种方法。

    1. 使用环境变量-参考
    2. 使用命令提示符-set PATH = .
    3. -classpath执行时使用参数指定类路径。
  • 分号 ( ;)用作分隔符,点 ( .)CLASSPATH-classpath的默认值,同时使用参数指定类路径。

rmic -classpath . <Class Name>
rmic -classpath "C:\Example\Demo" <Class Name>
  • 这里.代表当前目录,您可以在那里指定任何路径。
于 2022-02-08T13:33:27.417 回答
0

我有相同的代码,但在一个 Maven 项目中。第一步是用mvn compile. 请注意,所有已编译的类(例如本例中的 MyRemoteImpl)都存储在 maven 项目的目标文件夹中。

下一步是cd to \target\classes文件夹。

最后,使用目标类的完全限定名称运行 rmic 命令,即使用类的包 - rmic my_package1.my_sub_package.MyRemoteImpl

于 2020-05-14T22:46:42.173 回答
0

如果该类位于 C:/../src/Assign/implement.class 那么

  1. 通过输入以下命令更改您在 cmd 中的目录:- cd C:/....../src
  2. 运行命令:- rmic Assign.implement.class

它对我有用

于 2016-03-10T23:58:43.183 回答
0

我知道我已经晚了大约 8 年,但对于未来可能遇到同样问题的其他人来说,以下内容对我有用:

在包含您的文件的文件夹中,首先开始javac *.java,然后继续执行该rmic class_name步骤。这应该生成存根。

于 2021-06-02T19:55:33.577 回答
-1

尝试添加:

-classpath .

默认情况下,rmic 的类路径源自 CLASSPATH 环境变量(感谢 EJP 的更正)。

于 2012-09-09T03:52:01.073 回答