我有以下简化的文件结构:
C:/red/green/black/yellow/white/pink
。我现在在文件夹'black'中的cmd。
Hello.java
文件中包含package yellow.white.pink
。在'pink'文件夹中有一个Hello.java
源文件。
首先我尝试编译文件:
javac -classpath . -encoding ISO-8859-1 yellow.white.pink.Hello.java
javac -cp . -encoding ISO-8859-1 yellow.white.pink.Hello.java
这两个给我一个错误:
File not found yellow.white.pink.Hello.java
。
然后我尝试
javac -encoding ISO-8859-1 C:/red/green/black/yellow/white/pink/Hello.java
它编译得很好。
要运行它我
java -classpath . yellow.white.pink.Hello
它运行得很好。
但在这种情况下
java C:/red/green/black/yellow/white/pink/Hello.class
不起作用 - 出现Could not find or load main class
错误。
为什么?为什么我不能在根文件夹中编译.java文件并给出一个完整的包名称,它只适用于源的整个路径,而执行程序时反之亦然?
答案 0 :(得分:3)
java
命令将类的完全限定名称作为参数(包名称加类名)。
在这两种情况下,完全限定名称必须为yellow.white.pink.Hello
且不应更改。
然而,在第二次运行中,您传递C:/red/green/black/yellow/white/pink/Hello.class
,这是编译文件的路径,但不是类的完全限定名称。
这两次运行的另一个不同之处是classpass
声明。在第一次运行中,它是当前目录的路径(可以作为.
传递)。在第二次运行中,它根本没有指定。 Java将其视为当前目录路径。
要使第二个示例正常工作,您必须指定classpath
以及类名。
java -classpath C:/red/green/black yellow.white.pink.Hello