制作java包

时间:2010-02-12 01:29:14

标签: java classpath

我的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(就像我在这里发布时一样)。你们有谁知道我做错了吗?

5 个答案:

答案 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。