你的班Hello
属于包com
。所以你的班级的完全限定名称是com.Hello
。当您在命令行上使用 java 调用程序时,您应该提供包含您的类的完全限定类名main
方法并省略.class,像这样:
java com.Hello
java 程序需要这个完全限定的类名来理解您所引用的类。
但你还有另一个问题。 java 程序使用文件系统来定位包、子包以及属于它们的类。所以如果你有一个像这样的包结构com.Hello
,java程序期望找到一个名为的类文件同学们好在名为的目录中com, 像这样:com/Hello.class。事实上你可以在Exception
你看到的;你错误地使用了同学们好,java将其解释为package named Hello
, and a class named class
,并且正在寻找目录结构同学们好:
java.lang.NoClassDefFoundError:你好/类
但是编译器javacdoesn't默认设置此目录结构。请参阅javac 的文档 http://docs.oracle.com/javase/1.4.2/docs/tooldocs/windows/javac.html,但重要的是:当您进行编译时,您可以使用指定目标目录-d
flag:
-d 目录
设置类文件的目标目录。目标目录必须已经存在; javac 将不会创建目标目录。如果类是包的一部分,javac 会将类文件放入反映包名称的子目录中,并根据需要创建目录。例如,如果指定 -d c:\myclasses 并且类名为 com.mypackage.MyClass,则类文件名为 c:\myclasses\com\mypackage\MyClass.class。
如果未指定 -d,javac 将类文件放在与源文件相同的目录中。
最后一点粗体字是让初学者感到困惑的根源,也是你自己问题的一部分。
所以你有两种选择:
-
在您的情况下,如果您提供当前目录作为目标目录就可以了,就像这样(句点.
means 当前目录):
javac -d . Hello.java
如果您像这样调用编译器,它将创建com目录,并将编译后的类文件放入其中,就像 java 程序期望找到它的方式一样。然后当你像上面那样运行java时,从c:\tmpJava,你的程序应该执行。
-
您可以使用反映包结构的目录结构来设置源代码:放置源文件你好.java在一个名为的目录中com,在你的情况下:c:\tmpJava\com\Hello.java。现在,从c:\tmpJava你可以像这样运行 javac 编译:
javac com\Hello.java
您还没有提供-d
标志,但这很好,因为您自己创建了目录结构,并再次引用上面的文档:
如果未指定 -d,javac 将类文件放在与源文件相同的目录中。
同样,当您按上述方式运行 java 时,您的程序应该执行。
请注意,第二种选择是 java 程序员常用的一种选择:源代码文件以镜像包结构的目录结构进行组织。
在这个解释中我们忽略了类路径。您还需要了解编写 java 程序,但在您只是在当前目录中编译程序的情况下 - 如果您在编译类时遵循上述两种选择之一 - 您可以无需设置类路径,因为,默认情况下,java程序将当前目录作为类路径。另一段引言,来自java 的文档 http://docs.oracle.com/javase/1.4.2/docs/tooldocs/windows/java.html:
-cp 类路径
指定目录、JAR 存档和 ZIP 存档的列表以搜索类文件。类路径条目由分号 (;) 分隔。指定 -classpath 或 -cp 会覆盖 CLASSPATH 环境变量的任何设置。
如果未使用 -classpath 和 -cp 且未设置 CLASSPATH,则用户类路径由当前目录 (.) 组成。
请注意,当您使用像 Eclipse 这样的 IDE 来运行 java 代码时,这大部分已经为您处理,但您仍然会遇到类路径问题。