【问题标题】:Running Java on Linux with Error: Could not find or load main class在 Linux 上运行 Java 时出现错误:无法找到或加载主类
【发布时间】:2015-06-12 21:13:51
【问题描述】:

我收到上述错误,答案 here 没有帮助。

基本上,我似乎无法运行用 Java 编译的文件。我尝试运行的文件 HowMARK_II_FitsInBrainAnatomy.java 是 here

我正在使用以下命令来编译所有需要的 .jars 和当前目录,并在最后的 -cp 参数中使用 :.

javac -cp /home/ugrads/majors/quinnliu/workspace/WalnutiQ/build/libs/WalnutiQ.jar:/home/ugrads/majors/quinnliu/workspace/WalnutiQ/referencedLibraries/gson-2.2.4.jar:. HowMARK_II_FitsInToBrainAnatomy.java

所以在我使用上述命令后,我创建了编译文件HowMARK_II_FitsInToBrainAnatomy.class,但是运行该文件的以下命令给了我这个问题标题中的错误:

java -cp /home/ugrads/majors/quinnliu/workspace/WalnutiQ/build/libs/WalnutiQ.jar:/home/ugrads/majors/quinnliu/workspace/WalnutiQ/referencedLibraries/gson-2.2.4.jar:. model.MARK_II.vision.HowMARK_II_FitsInToBrainAnatomy

当我将:. 添加到我的-cp 时,我看不出我做错了什么

【问题讨论】:

  • 请发帖HowMARK_II_FitsInToBrainAnatomy.java
  • 您的代码的链接已损坏...
  • 是的.. 链接已损坏,但我刚刚发布了解释问题的答案。希望有帮助:)
  • 包名不只是漂亮;它们是 java 寻找类的地方。如果您的类名为model.MARK_II.vision.HowMARK_II_FitsInToBrainAnatomy,它必须位于类路径目录或JAR 文件中的model/MARK_II/vision/。如果没有,您需要重新构建源目录或使用 -d 选项构建以将类放置在预期位置。
  • 请奖励赏金,这样这个问题就不会出现在Featured Questions下。

标签: java classpath command-line-arguments jvm-arguments


【解决方案1】:

当你说,

java -cp jars-to-add:. model.MARK_II.vision.HowMARK_II_FitsInToBrainAnatomy

因为你的班级有这样的包声明

package model.MARK_II.vision;

您需要使用完全限定的类名来调用您已经在执行的该类中的main(),但还需要从正确的目录执行命令。

当你调用这个javac 命令时,我认为你已经在你的model/MARK_II/vision 目录中,你需要离开这个目录并从一个包含所有这些目录的目录中执行命令,如下所示

DirectoryToExecute
    --model
       --MARK_II
        --vision
          --HowMARK_II_FitsInToBrainAnatomy.class

所以我建议你 cd 到那个目录然后调用上面的命令,然后它会工作:)

查看answer 的类似问题。

【讨论】:

    【解决方案2】:

    您的类HowMARK_II_FitsInToBrainAnatomy 不是普通的可执行类,而是一个JUnit 测试用例。要从命令行运行 JUnit 测试用例,您可以使用 org.junit.runner.JUnitCore 类。

    编译

    javac -cp build/libs/WalnutiQ-master.jar:referencedLibraries/junit-4.12.jar:referencedLibraries/gson-2.2.4.jar:. experiments/model/MARK_II/vision/HowMARK_II_FitsInToBrainAnatomy.java
    

    然后运行

    java -cp build/libs/WalnutiQ-master.jar:referencedLibraries/junit-4.12.jar:referencedLibraries/hamcrest-all-1.3.jar:referencedLibraries/gson-2.2.4.jar:experiments/ org.junit.runner.JUnitCore model.MARK_II.vision.HowMARK_II_FitsInToBrainAnatomy
    

    我从 GitHub 的项目根目录运行这些。我必须手动下载 JUnit 和 Hamcrest

    【讨论】:

      【解决方案3】:

      如果HowMARK_II_FitsInToBrainAnatomymodel.MARK_II.vision 包中,则文件HowMARK_II_FitsInToBrainAnatomy.class 必须在文件系统的model/MARK_II/vision 目录中。

      【讨论】:

        【解决方案4】:

        你班级的第一行是

        package model.MARK_II.vision;
        

        这意味着您必须指定完全限定名称才能运行它。

        java -cp /home/ugrads/majors/quinnliu/workspace/WalnutiQ/build/libs/WalnutiQ.jar:/home/ugrads/majors/quinnliu/workspace/WalnutiQ/referencedLibraries/gson-2.2.4.jar:/home/ugrads/majors/quinnliu/workspace/WalnutiQ/experiments/model/MARK_II/vision/junit-4.11.jar:. model.MARK_II.vision.HowMARK_II_FitsInToBrainAnatomy
        

        当然,它也需要一个方法

        public static void main(String[] args)
        

        作为入口点。

        【讨论】:

        • 感谢您的帮助,但我刚刚收到Error: Could not find or load main class model.MARK_II.vision.HowMARK_II_FitsInToBrainAnatomy
        • 添加main 方法,否则它不会是main 类。
        • 阅读您的回答后,我确实这样做了,您可以在第 30 行看到 here
        • 你重新编译了吗?并重新创建你的罐子?
        • 好主意,但我重新编译了我的 jar,但仍然收到错误
        【解决方案5】:

        当使用java 运行时,您必须指定完全限定名称(即,与包一起)。所以如果你要运行的类是HowMARK_II_FitsInToBrainAnatomy,它的包是model.MARK_II.vision,那么你就必须运行:

        java -cp <...> model.MARK_II.vision.HowMARK_II_FitsInToBrainAnatomy
        

        【讨论】:

        • 感谢您的帮助,但我刚刚收到Error: Could not find or load main class model.MARK_II.vision.HowMARK_II_FitsInToBrainAnatomy
        • 你有签名public static void main(String[] args)的方法吗?
        • 是的,我在第 30 行有它here
        【解决方案6】:

        你需要改变你的编译命令

        javac -cp <the jars>:. HowMARK_II_FitsInToBrainAnatomy.java
        

        javac -cp <the jars>:. -d . HowMARK_II_FitsInToBrainAnatomy.java
        

        这将在正确的目录中创建HowMARK_II_FitsInToBrainAnatomy.class

        【讨论】:

          【解决方案7】:

          您的第一个命令行建议要编译的类在当前目录中。编译它将在同一目录中生成一个 .class 文件。

          现在,当您尝试运行程序时,传递要运行的类的全名(包+类名)是完全正确的;但是为了找到该类,java 应用了一个约定,即包的每个段必须对应于硬盘驱动器上的一个物理目录,从当前目录开始。

          因此,它不会在当前目录中查找您的类,而是会尝试查找 model/MARK_II/vision/ 目录树,并在那里查找名为 HowMARK_II_FitsInToBrainAnatomy.class 的文件。

          为了找到你的类,你必须将你的当前目录设置为model的父目录,仍然将.添加到你的类路径中(因为它将被用作查找子目录的根目录)并保留你的命令按原样行(可能根据需要调整其他 jar 的路径)。

          【讨论】:

            猜你喜欢
            • 2019-05-01
            • 1970-01-01
            • 2013-07-18
            • 1970-01-01
            • 1970-01-01
            • 2015-06-05
            • 2017-07-31
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多