3

我有一个关于 Java 中的 javac 和包的快速问题。

我有一个简单的程序(我们称之为 Program.java),它当前位于以下目录中:

  • 我的存储库/我的程序

在 myRepository/myProgram 目录中的 Program.java 和其他 .java 文件中,我已声明package myProgram.*并包含import myProgram.*;.

所以当我输入时javac myProgram/Program.java,它编译得很好,如果我输入它运行得很好java myProgram/Program

但是,我试图在myRepository目录中生成 .class 文件,myRepository/myProgram而不是在源文件所在的目录中。我尝试javac myProgram/Program.java -d ..在 myRepository 目录中生成 .class 文件,但是当我尝试“java Program”时,它给了我以下错误:

线程“主”java.lang.NoClassDefFoundError 中的异常:程序(错误名称:myProgram/Program)。

有什么方法可以让 .class 文件显示在主目录 (myRepository) 中,而不是源代码所在的位置 (myRepository/myProgram) 并能够java Program在 myRepository 中执行?

4

3 回答 3

2

您最好将源代码放在目录 source/myProgram 并创建一个名为 build 的目录来放置 .class 文件。因此,您可以这样编译和运行:

javac source/myProgram/Program.java -d build
cd build
java myProgram/Program
于 2011-02-06T02:45:15.833 回答
0

您应该从myRepository目录中调用编译器,而不是从包目录中调用编译器,如下所示:javac myProgram/Program.java,然后java myProgram.Program.

创建的类必须在一个包结构中,以便类加载器找到它们(至少使用默认类加载器)。

您可以将它们放在另一个目录中,但是在那里它们将具有正确的结构,并且您应该将此目录提供给您的 VM:

javac -d ../classes myProgram/Program.java
java -cp ../classes myProgram.Program

没有办法(使用默认java命令)在不提及包名称的情况下执行包中的类。

您可以使用匿名包中的包装类(例如,没有任何package声明),它只是调用原始类:

class Program {
   public static void main(String[] args) {
       // delegate to real main class and method:
       myProgram.Program.main(args);
   }
}

或者,如果您使用 IDE 进行开发,通常只需单击按钮即可启动程序。

对于分发,您可以将所有类文件放在一个 jar 文件中,并在清单中定义主类。然后你可以这样调用你的程序:

java -jar myProgram.jar
于 2011-02-06T01:52:18.947 回答
0

打包的类不能存储在任何目录中。此链接可能会有所帮助: http ://www.herongyang.com/Java-Tools/javac-Option-d-Specifying-Output-Directory.html

于 2011-02-06T01:47:09.723 回答