【问题标题】:Java not compiling .class files under $CLASSPATHJava 没有在 $CLASSPATH 下编译 .class 文件
【发布时间】:2011-01-09 13:27:48
【问题描述】:

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

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

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

我无法获得这种行为。我将$CLASSPATH 变量设置为"/home/myname/java/classes"。我执行了javac KeyEventDemo.java,其中包含package events;。我预计javac会在/home/myname/java/classes下创建一个子目录events,并将KeyEventDemo.class放在这个子目录中。

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

【问题讨论】:

    标签: java class packages javac


    【解决方案1】:

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

    考虑一个名为:

    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
    

    【讨论】:

      【解决方案2】:

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

      示例(基于您的问题):

      javac -d ~/java/classes KeyEventDemo.java
      

      【讨论】:

      • 并澄清 $CLASSPATH:它将告诉 JVM 在运行时在哪里寻找类,而不是告诉 javac 在哪里创建类这个答案和你的经验表明。
      【解决方案3】:

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

      这不是“好的做法”——这就是 Sun JDK 期望的样子。否则,它将无法正常工作。从理论上讲,其他 Java 实现可能会以不同的方式工作,但我不知道有什么效果。

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

      是的

      我做错了什么?

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

      【讨论】:

      • 如果您使用-d 选项(强烈推荐,因此二进制文件位于与源不同的位置),那么理论上,您的源不必遵循该层次结构。
      • 在java.sun.com上我发现将*java和*class文件放在不同的目录可以很方便。我想使用这种方法。
      • 正如 Chris 所写,您可以为此使用 -d 选项。但是将源文件保持在同一目录层次结构中仍然是一个非常好的主意,否则会非常混乱。
      猜你喜欢
      • 2012-11-17
      • 1970-01-01
      • 1970-01-01
      • 2013-09-01
      • 2014-05-28
      • 2015-01-05
      • 2020-03-01
      • 1970-01-01
      • 2016-04-18
      相关资源
      最近更新 更多