如何在包中编译类,以后用“java Program”(没有包名)执行它们?

时间:2011-02-06 01:40:40

标签: java package javac noclassdeffounderror

我对Java中的javac和包有一个简单的问题。

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

  • myRepository / myProgram

在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”时,它给了我以下错误:

  

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

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

3 个答案:

答案 0 :(得分:2)

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

javac source/myProgram/Program.java -d build
cd build
java myProgram/Program

答案 1 :(得分:0)

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

答案 2 :(得分: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