我的Java类组织变得有点凌乱所以我正在讨论我在Java学习中跳过的东西:类路径。我无法安静地得到心爱的类来编译我为他们创建的包。这是我的文件夹层次结构:
.
com/
david/
Greet.java
greeter/
SayHello.java
SayGoodbye.java
SayHello的构造函数只打印“hello”和SayGoodbye的打印“Goodbye”,而Greet的main方法只创建了这两个对象。在SayHello的顶部是包com.david.greeter;与SayGoodbye和Greet一样,包com.david;
在greeter文件夹中,我能够编译两个java文件但是如果我转到当前目录(保存com的目录)并执行javac -cp“com.david.greeter。*”com / david / Greet。它说它无法找到类以及说包com.david.greeter不存在。我也尝试手动设置$ CLASSPATH。
我在这里结束了,Stackoverflow(就像我在这里发布时一样)。你们有谁知道我做错了吗?
答案 0 :(得分:5)
java编译器将遍历类路径的子目录,寻找它所需的包。
因此,您的命令行应如下所示:
javac -cp "." com/david/Greet.java
当编译器在编译Greet.java时看到对com.david.greeter.SayHello的引用时,它将从类路径中的目录开始并遍历层次结构以查找它所需的包。
答案 1 :(得分:1)
首先,正如Setting the Classpath中所述,您当前设置类路径的方式是错误的。类路径条目应该是文件名或目录。所以使用com.david.greeter.*
没有任何意义。其次,默认情况下,当前目录位于类路径中:
默认类路径是当前目录。设置CLASSPATH变量或使用-classpath命令行选项会覆盖该缺省值,因此如果要在搜索路径中包含当前目录,则必须包含“。”。在新设置中。
因此,如果您从包含javac
的文件夹中执行com
(此处为man page),则无需调整任何内容,只需键入:
javac com/david/Greet.java
javac
将浏览目录树以查找引用(例如SayHello
,如果您从Greet
使用它)并编译它们。
顺便说一句,如果你必须设置类路径,不要使用$CLASSPATH
环境变量,在大多数情况下这只是一个不好的做法,更喜欢-cp
选项。 / p>
答案 2 :(得分:0)
如果您在包含com的文件夹中,请尝试以下操作:
javac -cp . com\david\Greet.java
答案 3 :(得分:0)
这是不正确的(正如编译器已经告诉过你的那样):
javac -cp“com.david.greeter。*
打开命令shell并导航到包含“com”目录的目录。
我认为你真的想要这个来编译SayHello.java和SayGoodbye.java:
javac -cp。 COM /大卫/招待员/ *。java的
这是编译Greet.java:
javac -cp。 COM /大卫/ *。java的
这要运行:
java -cp。 com.david.Greet
答案 4 :(得分:0)
“com”目录不应该是最新的,它应该是当前的子目录。您需要第一级上层并再次启动。此时不需要额外关心classpath。