0

Java 不需要包名称和源代码文件结构之间的关联。但是大多数 IDE 都需要包名称的每个部分的子文件夹。

上述说法是否属实?

为了尝试这一点,我在~/Temp文件夹中编写了一个简单的类。

package com.gnrcs.lab;

public class Main {
    public static void main (String... args) {
        System.out.println("Homo Sapiens");
    }
}

然后从命令行,

~$ cd ~/Temp/
~$ javac Main.java // it does produce a Main.class file in ~/Temp
~$ java Main
Error: Could not find or load main class Main
~$ java com.gnrcs.lab.Main
Error: Could not find or load main class com.gnrcs.lab.Main
~$ java -cp . com.gnrcs.lab.Main
Error: Could not find or load main class com.gnrcs.lab.Main

我做错了什么?任何帮助表示赞赏。谢谢!

4

1 回答 1

2

使用包的一个结果是类或接口的字节码必须出现在与其包名称匹配的目录结构中。如果您没有将字节码放在正确的目录结构中,编译器或 JVM 将无法找到您的类。编译后的字节码文件必须出现在文件系统上与包名称匹配的目录结构中。例如,包.class中任何类或接口的文件com.gnrcs.lab必须出现在匹配的目录结构中\com\gnrcs\lab\。您可以自己创建此目录结构,也可以-d在编译期间使用该标志,编译器将为您创建必要的目录结构并将字节码放置在该目录中。

要运行程序,您需要-classpath在执行时添加标志java。示例:如果您在 Temp 目录中,则可以使用java -classpath .\ com.gnrcs.lab.Main.

简而言之,请执行以下操作:

  1. javac -d .\ Main.java. 这将根据您的包名称创建目录并将字节码放在该目录中。在你的情况下,~/Temp/com/gnrcs/lab/Main.class.

  2. java -classpath .\ com.gnrcs.lab.Main. 您必须在此处提供完全限定名称。您也可以使用-cpflag 作为-classpath.

(注:即兴为 linux 机器)

于 2017-08-11T16:49:50.370 回答