【问题标题】:Cannot compile all classes separately in the same package无法在同一个包中分别编译所有类
【发布时间】:2018-08-03 14:06:03
【问题描述】:

我有一个“客户端-服务器”程序,它有 3 个类和 1 个接口。 (same code but another issue)

AddServerIntf.java

import java.rmi.Remote;
import java.rmi.RemoteException;

interface AddServerIntf extends Remote {
    double add(double d1, double d2) throws RemoteException;
}

AddServerImpl.java

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

public class AddServerImpl extends UnicastRemoteObject implements AddServerIntf {

    public AddServerImpl() throws RemoteException {
    }

    public double add(double d1, double d2) throws RemoteException {
        return d1 + d2;
    }
}

AddServer.java

import java.rmi.*;

public class AddServer {
    public static void main(String args[]) {
        try {
            AddServerImpl addServerImpl = new AddServerImpl();
            Naming.rebind("AddServer", addServerImpl);
        } catch (Exception e) {
            System.out.println("Exception: " + e);
        }
    }
}

AddClient.java

import java.rmi.*;

public class AddClient {
    public static void main(String args[]) {
        try {
            String addServerURL = "rmi://" + args[0] + "/AddServer";
            AddServerIntf addServerIntf = (AddServerIntf) Naming.lookup(addServerURL);
            System.out.println("The first number is: " + args[1]);
            double d1 = Double.valueOf(args[1]).doubleValue();
            System.out.println("The second number is: " + args[2]);

            double d2 = Double.valueOf(args[2]).doubleValue();
            System.out.println("The sum is: " + addServerIntf.add(d1, d2));
        } catch (Exception e) {
            System.out.println("Exception: " + e);
        }
    }
}

在 Eclipse 中,我的结构如下:

如果我尝试使用 javac 编译每个 .java 文件,则会出现错误:

    D:\eclipse-workspace\Shildt\folder\demo>javac AddServerIntf.java
    
    D:\eclipse-workspace\Shildt\folder\demo>javac AddServerImpl.java
    AddServerImpl.java:6: error: cannot find symbol
    public class AddServerImpl extends UnicastRemoteObject implements AddServerIntf {
                                                                      ^
      symbol: class AddServerIntf
    1 error

D:\eclipse-workspace\Shildt\folder\demo>javac AddServer.java
AddServer.java:9: error: cannot find symbol
                        AddServerImpl addServerImpl = new AddServerImpl();
                        ^
  symbol:   class AddServerImpl
  location: class AddServer
AddServer.java:9: error: cannot find symbol
                        AddServerImpl addServerImpl = new AddServerImpl();
                                                          ^
  symbol:   class AddServerImpl
  location: class AddServer
2 errors

D:\eclipse-workspace\Shildt\folder\demo>javac AddClient.java
AddClient.java:9: error: cannot find symbol
                        AddServerIntf addServerIntf = (AddServerIntf) Naming.lookup(Url);
                        ^
  symbol:   class AddServerIntf
  location: class AddClient
AddClient.java:9: error: cannot find symbol
                        AddServerIntf addServerIntf = (AddServerIntf) Naming.lookup(Url);
                                                       ^
  symbol:   class AddServerIntf
  location: class AddClient
2 errors

结果是:

似乎只编译了界面,但为什么呢?我可以将所有这些类编译为一个。 (如果将代码放在一个文件 .java 中然后编译)。

或者我可以编译all the files at the same time:

D:\eclipse-workspace\Shildt\folder\demo>cd..

D:\eclipse-workspace\Shildt\folder>javac demo\*.java

D:\eclipse-workspace\Shildt\folder>

在这种情况下一切都很好。

但我无法正确理解,为什么编译器没有单独找到类。请给我解释一下。感谢您的帮助。

【问题讨论】:

    标签: java eclipse compiler-errors


    【解决方案1】:

    1) 不需要逐类编译。
    事实上,您并没有在正确的工作目录中执行命令。
    您不应从 demo 包中执行 javac,而应在包含它的父目录中执行。
    应该没问题:

    D:\eclipse-workspace\Shildt\folder\javac demo\*.java 应该没问题

    2) 当您使用javac 编译时(或者甚至在您执行java 命令时),您必须注意默认情况下是执行命令的当前目录的类路径值。

    所以这个D:\eclipse-workspace\Shildt\folder\demo>javac AddServerIntf.java 编译 但是 D:\eclipse-workspace\Shildt\folder\demo>javac AddServerImpl.java 编译失败的原因相同:你从 demo 包中执行 javac,所以这意味着只有 demo 目录的内容 会被添加到类路径中默认情况下。您需要的默认类路径是包含演示目录的类路径。
    所以同样的建议:编译你的类:

    D:\eclipse-workspace\Shildt\folder
    

    而不是来自:

    D:\eclipse-workspace\Shildt\folder\demo
    

    【讨论】:

    • 感谢大卫的详细回答!
    • @invzbl3 很高兴它可能对您有所帮助。非常欢迎你:)
    • 我的问题也很棒additional information
    猜你喜欢
    • 2013-08-02
    • 2018-05-07
    • 2015-04-20
    • 2016-04-19
    • 2020-07-14
    • 1970-01-01
    • 2021-07-25
    • 2021-01-14
    • 2022-01-09
    相关资源
    最近更新 更多