我有“ Client-Server”程序,该程序具有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中,我的结构类似于:
如果我尝试使用.java
编译每个javac
文件,则会出现错误:
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>
在这种情况下,一切都很好。
但是我无法正确理解,为什么编译器没有单独找到类。请给我解释一下。感谢您的帮助。
答案 0 :(得分:2)
1)不需要按类编译。
实际上,您没有在正确的工作目录中执行命令。
您不应从javac
包中执行demo
,而应在包含它的父目录中执行。
而且应该没问题:
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
出于相同的原因而无法编译:您从javac
包中执行demo
,因此这意味着只有演示目录的内容将默认添加到类路径中。您需要的默认类路径是包含演示目录的类路径。
因此建议:从以下位置编译您的类:
D:\eclipse-workspace\Shildt\folder
而不是:
D:\eclipse-workspace\Shildt\folder\demo