为什么 javac 在同一个包中找不到我的 class 文件?

Why does javac not find my class file in the same package?

我正在尝试了解 Java 个包。

我在同一个包中有两个 class,A.java 和 B.java。 Class A 引用 class B.

两者都有封装语句package world.example;并保存在目录.../world/example/.

B 编译正常,但是当尝试编译 A 时,javac 找不到 B 的 class 文件。

我尝试了 运行 来自 /world/example 父级的 javac。我在这里和其他地方搜索了很多答案,但无济于事。大多数关于类似主题的问题似乎都有很多无关的代码和信息,所以我试图将我的问题提炼成最基本的内容,但仍然看不出我遗漏了什么。

附录:如果我删除包语句,如果我在编译 A 时指定 class 路径,那么两个 classes 都可以编译,因此:javac -classpath . A.java.

代码如下:

package world.example;

public class A {    
  public static void main(String[] args) {
    String msg = B.getMessage();
    System.out.println(msg);
  }     
}

...和...

package world.example;

public class B {    
    protected static String getMessage() {
        return "Hello world!";
    }       
}

...以及 javac 的输出...

17-04-17◆23:03 example »javac B.java 
17-04-17◆23:04 example »javac A.java 
A.java:5: error: cannot find symbol
        String msg = B.getMessage();
                     ^
  symbol:   variable B
  location: class A
1 error
17-04-17◆23:04 example »javac -classpath . A.java
A.java:5: error: cannot find symbol
        String msg = B.getMessage();
                     ^
  symbol:   variable B
  location: class A
1 error
I have two classes, A.java and B.java, in the same package. Class A references class B

您必须采用实用的分离方法将您的 .java 文件与 .class 文件分开。

和我一起重复整个编译过程。

首先,在CMD中编译.java文件时使用此命令,以便将.java文件与.class文件分开,避免混淆。

javac -d Target_Location Filename.java  >>>> Spaces are important

Target_location = C:\blah\blah << 您希望 packages/classes 目录所在的位置。

编译后,您将在您之前选择的 Target_Location 上获得 class 文件。因此,现在您必须将 classpath 环境变量更改为该目标位置,因为您提供了第三方包。

执行看看。

如何在 CMD 中设置 class路径。

set classpath = c:\blah\blah;