无法在同一包中单独编译所有类 [英] Cannot compile all classes separately in the same package

查看:79
本文介绍了无法在同一包中单独编译所有类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有 Client-Server程序,该程序具有3个类和1个接口。 (





如果我尝试使用<$ c $编译每个 .java 文件c> javac 然后出现错误:

  D:\eclipse-workspace\Shildt\ \文件夹演示emojavac AddServerIntf.java 

D:\eclipse-workspace\Shildt\文件夹演示\javac AddServerImpl.java
AddServerImpl.java:6:错误:找不到符号
公共类AddServerImpl扩展了UnicastRemoteObject实现AddServerIntf {
^
符号:类AddServerIntf
1错误

D:eclipse-workspace\ Shildt\folder\demo> javac AddServer.java
AddServer.java:9:错误:找不到符号
AddServerImpl addServerImpl = new AddServerImpl();
^
符号:类AddServerImpl
位置:类AddServer
AddServer.java:9:错误:找不到符号
AddServerImpl addServerImpl = new AddServerImpl();
^
符号:class AddServerImpl
位置:class AddServer
2错误

D:\eclipse-workspace\Shildt\folder\演示> javac AddClient.java
AddClient.java:9:错误:找不到符号
AddServerIntf addServerIntf =(AddServerIntf)Naming.lookup(Url);
^
符号:类AddServerIntf
位置:类AddClient
AddClient.java:9:错误:找不到符号
AddServerIntf addServerIntf =(AddServerIntf)Naming.lookup(网址);
^
符号:class AddServerIntf
位置:class AddClient
2错误

结果是:





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



或者我可以编译



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

解决方案

1)不需要按类编译类。

实际上,不要在正确的工作目录中执行命令。

您不应从 demo javac $ c>包,但在包含它的父目录中。

应该没问题:



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



2)编译时使用 javac (甚至在执行 java 命令时),您还必须知道类路径值default是执行命令的当前目录。



因此,此 D:\eclipse-workspace\Shildt\folder\demo> javac AddServerIntf.java 编译
,但是 D:eclipse-workspace\Shildt\folder\demo> javac AddServerImpl.java 出于相同原因未编译:您从 demo 包中执行 javac ,所以这意味着只有演示目录的内容将默认添加到类路径中。您需要的默认类路径是包含 demo目录的类路径。

同样的建议:从以下位置编译类:

  D:Eclipse工作区\ Shiltt文件夹

而不是来自:

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


I have the "Client-server" programm which has 3 classes and 1 interface. (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);
        }
    }
}

In Eclipse I have the structure like:

If I'm trying to compile each .java file using javac then getting the errors:

    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

The result is:

Seems like only interface compiled, but why? I can compile all these classes as one. (if putting the code in one file .java and then compile).

Or I can compile 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>

And in this case is everything fine.

But I can't properly understand, why compiler didn't find classes separately. Explain me, please. I appreciate any help.

解决方案

1) Compiling class by class is not required.
In fact you don't execute the command in the correct working directory.
You should not execute javac from the demo package but rather in the parent dir that contains it.
And it should be fine :

D:\eclipse-workspace\Shildt\folder\javac demo\*.java should be fine

2) As you compile with javac (or even as you execute the java command), you have to be aware of the classpath value that by default is the current directory where the command is executed.

So this D:\eclipse-workspace\Shildt\folder\demo>javac AddServerIntf.java compiles but that D:\eclipse-workspace\Shildt\folder\demo>javac AddServerImpl.java doesn't compile for the same reason : you execute javac from the demo package, so it means that only the content of the demo directory will be added in the classpath by default. The default classpath you need is a classpath that contains the demo directory.
So identical advise : compile your classes from :

D:\eclipse-workspace\Shildt\folder

and not from :

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

这篇关于无法在同一包中单独编译所有类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆