Java未编译$CLASSPATH下的.class文件

Java未编译$CLASSPATH下的.class文件,java,class,packages,javac,Java,Class,Packages,Javac,我试图弄清楚如何组织源文件和类文件与包一起工作。我发现一个非常有用的方法。但我还有一些问题 据我所知,在包名和存储包元素的目录名之间具有同构性是一种很好的做法。例如,如果我有一个名为aaa.bbb.ccc的包,其中包含classddd,最好将一个名为“ddd.class”的类文件放在“$CLASSPATH/aaa/bbb/ccc/”中。我做对了吗 如果是这样,Java编译器会自动将*.class文件放入正确的目录吗 我无法得到这种行为。我将$CLASSPATH变量设置为“/home/myname

我试图弄清楚如何组织源文件和类文件与包一起工作。我发现一个非常有用的方法。但我还有一些问题

据我所知,在包名和存储包元素的目录名之间具有同构性是一种很好的做法。例如,如果我有一个名为
aaa.bbb.ccc
的包,其中包含class
ddd
,最好将一个名为“ddd.class”的类文件放在“$CLASSPATH/aaa/bbb/ccc/”中。我做对了吗

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

我无法得到这种行为。我将
$CLASSPATH
变量设置为
“/home/myname/java/classes”
。我执行了
javackeyeventdemo.java
,其中包含
包事件。我希望javac将在
/home/myname/java/classes
下创建一个子目录
events
,并将
KeyEventDemo.class
放在这个子目录中


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

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

考虑一个名为:

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

您需要使用
-d
选项来指定
.class
文件的结束位置。只需指定基本目录
javac
将创建与正确的包相对应的任何必要目录

示例(基于您的问题):

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

这不是“好的实践”——这是Sun JDK所期望的情况。否则,它将不起作用。从理论上讲,其他Java实现可能会有不同的工作方式,但我不知道有哪一种可以

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

我做错了什么


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

并澄清$CLASSPATH:它将告诉JVM在运行时在何处查找类,而不是告诉javac在何处创建类这个答案和您的体验。如果您使用
-d
选项(强烈推荐,因此二进制文件与源文件位于不同的位置),那么从理论上讲,您的源代码不必遵循这种层次结构。在java.sun.com上,我发现将*java和*class文件保存在不同的目录中是很方便的。我希望使用这种方法。正如Chris所写的,您可以使用-d选项来实现这一点。但将源文件保存在相同的目录中仍然是一个非常好的主意否则会很混乱。
javac -d ~/java/classes KeyEventDemo.java