2011-02-06 100 views
3

我有一个关于javac和Java包的快速问题。如何在软件包中编译类,稍后用“java程序”(不带软件包名称)执行它们?

我有一个简单的程序(我们就叫它Program.java),这是目前在以下目录:

  • myRepository/myProgram

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

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

但是,我试图让目录中生成.class文件,而不是myRepository/myProgram,这是源文件所在的位置。我试图javac myProgram/Program.java -d ..产生在myRepository目录下的.class文件,但是当我尝试“Java程序”,它给了我下面的错误:

Exception in thread "main" java.lang.NoClassDefFoundError: Program (wrong name: myProgram/Program).

有什么办法办法,我能得到的.class文件现身在主目录(myRepository)中,而不是源代码的位置(myRepository/myProgram),并且能够在myRepository中执行java Program

回答

0

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

创建的类必须位于类加载器的包结构中才能找到它们(至少使用默认的类加载器)。

你可以把它们放在另一个目录中,但随后他们将有权结构那里,你应该给这个目录添加到您的虚拟机:

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 
+0

那么有没有办法让这个我可以只输入“JAVA程序”,并使其从主目录中工作时,源代码是不同的目录? – FlamesPuck12 2011-02-06 02:40:59

+1

除了编写一个新的`java`实现,没有。您可以考虑使用IDE,您只需按下按钮(或点击热键)即可编译并运行您的代码。 – 2011-02-06 02:46:34

2

你最好穿上目录源/ myProgram的源代码,并创建一个名为build目录把.class文件。因此,你可以编译和运行这样:

javac source/myProgram/Program.java -d build 
cd build 
java myProgram/Program 
相关问题