【问题标题】:How can I compile classes in packages, to execute them later with "java Program" (without the package name)?如何编译包中的类,以便稍后使用“java Program”(没有包名)执行它们?
【发布时间】:2011-02-06 01:40:40
【问题描述】:

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

我有一个简单的程序(我们称之为 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”时,它给了我以下错误:

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

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

【问题讨论】:

    标签: java package javac noclassdeffounderror


    【解决方案1】:

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

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

    【讨论】:

    • Nvm,我用这个方法让它工作了。我希望我可以设置它,以便我可以在主存储库目录中执行 java 程序,但我想这必须这样做。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您应该从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
      

      【讨论】:

      • 所以没有办法让我可以在源代码位于不同目录时输入“java程序”并使其在主目录中工作?
      • 除了编写一个新的java 实现之外,没有。您可能会考虑使用 IDE,只需按下按钮(或按下热键)即可编译和运行代码。
      猜你喜欢
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-22
      • 2017-02-09
      • 1970-01-01
      • 2010-11-17
      相关资源
      最近更新 更多