我对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”时,它给了我以下错误:
线程“main”中的异常java.lang.NoClassDefFoundError:Program(错误的名称:myProgram / Program)。
有没有什么方法可以让.class文件显示在主目录(myRepository)中而不是源代码所在的位置(myRepository / myProgram),并且能够在myRepository中执行java Program
?
答案 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