【问题标题】:rmic error class not found找不到 rmic 错误类
【发布时间】:2023-04-05 04:49:01
【问题描述】:

我正在阅读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

【问题讨论】:

  • 这个问题的答案到底是什么?你是怎么解决的?我面临同样的问题,不想为此开一个新帖子。
  • 如果您在 Maven 项目中尝试此操作,则类将放置在目标文件夹中。从那里运行 rmic 命令。这导致了另一个问题stackoverflow.com/questions/9275782/…

标签: java rmi


【解决方案1】:

BuddingProgrammer 的 cmets 也为我工作。

例如,如果您的课程位于文件夹 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

【讨论】:

  • 仅当 Java 类位于名为 semana5 的包中时才适用。
【解决方案2】:
  1. 创建一个文件夹命名为HelloServer
  2. 在每个类的顶部添加这个包package HelloServer;,MyRemote 和MyRemoteImpl。
  3. 打开 cmd 并从包含 HelloServer 文件夹的目录中写入 javac HelloServer/MyRemote.java 和 javac HelloServer/MyRemoteImpl.java。
  4. 从包含HelloServer 文件夹的目录中写入rmic HelloServer.MyRemoteImpl。
  5. 你现在应该有一个MyRemoteImpl_stub.class,你可以度过美好的一天:)

PS:重要的是包名称不同于 RMI 或类中使用的任何对象。否则会发生物体碰撞。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      它对我有用

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 您是否编辑 CLASSPATH 环境变量以始终包含“.”与否,取决于您的使用模式。有些人喜欢避免系统范围的编译时定义,有些人则欢迎它们。再说一次,大多数人不会从命令行手动编译。我实际上认为 CLASSPATH 环境变量方法是一种“解决方法”,但这只是我的口味。
        • @Isaac 替代方案意味着必须指定 -classpath 。在每个 Java 命令行工具上? javac, java, javap, javah, keytool, jar, jarsigner, idlj, ... 不是很吸引人。其中大部分都嵌入在 IDE 中,当然,但不是全部。
        • @downvoter 请向我们解释为什么这个答案没有用。
        • 正如我所写,这取决于您的使用模式。如果是主要使用命令行来编译和执行代码,那么是的,CLASSPATH 环境变量当然很方便。如果一个人通常使用 IDE 编译和执行代码,那么 CLASSPATH 变量是另一个(大部分)无意义的设置,因此应该避免(如果没有理由,为什么要这样做?)。跨度>
        • 顺便说一句,我对您的回答投反对票的原因是您的回答涵盖了提问者并未真正提出的问题。提问者问为什么 rmic 找不到他的课程。简短的回答是这是一个类路径问题。您提到“您的 CLASSPATH 环境变量有问题”,这是不正确的。如果您对用户的编译工具的典型使用模式了解不多,如何确定用户的 CLASSPATH 环境变量是否正确?
        【解决方案6】:

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

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

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

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

            尝试添加:

            -classpath .
            

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

            【讨论】:

            • 不,不是。请参阅工具文档。默认情况下,rmic 的类路径来自 CLASSPATH 环境变量,它当然应该总是包含 '.'。
            • "当然应该总是包含 '.'"?我严重怀疑这一点。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-05-21
            • 2012-04-18
            • 2019-01-05
            • 2015-06-20
            • 2013-07-18
            • 2018-12-19
            • 2015-01-11
            相关资源
            最近更新 更多