Java没有在$ CLASSPATH下编译.class文件

时间:2010-01-26 15:10:00

标签: java class packages javac

我正在试图弄清楚如何组织使用包的源文件和类文件。我找到了一个非常有用的tutorial。但我还是有一些问题。

据我所知,在包名称和存储包元素的目录名称之间存在同构是一种好习惯。例如,如果我有一个名为aaa.bbb.ccc的包,其中包含类ddd,那么最好有一个名为“ddd.class”的类文件并位于“$ CLASSPATH / aaa / bbb / ccc / ”。我做对了吗?

如果是这种情况,Java编译器会自动将* .class文件放入正确的目录吗?

我无法得到这种行为。我将$CLASSPATH变量设置为"/home/myname/java/classes"。我执行了包含javac KeyEventDemo.java的{​​{1}}。我希望javac会在package events;下创建一个子目录events,并将/home/myname/java/classes放在此子目录中。

没有发生。我试图帮助javac并自己创建“events”子目录。我再次使用KeyEventDemo.class但它不想将类文件放在“/ home / myname / java / classes / events”下。我做错了什么?

3 个答案:

答案 0 :(得分:6)

您需要使用-d选项指定您希望.class文件的结束位置。只需指定基目录; javac将创建对应正确包的必要目录。

示例(基于您的问题):

javac -d ~/java/classes KeyEventDemo.java

答案 1 :(得分:4)

  

例如,如果我有一个名为的包   “aaa.bbb.ccc”,其中包含类   “ddd”这是一个很好的做法   类文件名为“ddd.class”和   位于“$ CLASSPATH / aaa / bbb / ccc /”。   我做对了吗?

这不是“良好实践” - 这就是Sun JDK 期望事情的方式。否则,它将无法正常工作。从理论上讲,其他Java实现可能有不同的工作方式,但我不知道有什么用。

  

如果是这样的话,将是Java编译器   将* .class文件放入正确的文件中   目录自动?

  

我做错了什么?

源代码必须已遵循此结构,即KeyEventDemo.java必须位于名为“events”的子目录中。然后你做“javac events / KeyEventDemo.java”,它应该可以工作。

答案 2 :(得分:2)

在大多数情况下,这不仅是良好的做法,而且必须

考虑一个名为:

的Java类
com.example.Hello

如果将它存储在文件系统上,则必须

/path/to/my/classes/com/example/Hello.java

编译器(或至少绝大多数)将在

创建类文件
/path/to/my/classes/com/example/Hello.class

我个人不会使用CLASSPATH变量来设置路径,而是使用java上的-cp选项。可以通过以下方式调用上述“应用程序”:

java -cp /path/to/my/classes com.example.Hello