Running Java on Linux with Error: Could not find or load main class

Running Java on Linux with Error: Could not find or load main class

我收到上述错误,答案 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

时,我没有看到我做错了什么

你的class的第一行是

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)

作为切入点。

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

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

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

当你说,

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

因为你的 class 有这样的包声明

package model.MARK_II.vision;

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

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

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

所以我建议你 cd 到那个目录,然后调用上面的命令,然后就可以了:)

看看这个 类似的问题。

您需要将编译命令从

更改为
javac -cp <the jars>:. HowMARK_II_FitsInToBrainAnatomy.java

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

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

您的 class HowMARK_II_FitsInToBrainAnatomy 不是正常的可执行文件 class,而是 JUnit 测试用例。要从命令行 运行 JUnit 测试用例,您可以使用 org.junit.runner.JUnitCore class.

编译

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

您的第一个命令行提示要编译的 class 在当前目录中。编译它会在同一目录中生成一个 .class 文件。

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

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

要找到您的 class,您必须将当前目录设置为 model 的父目录,仍然将 . 添加到您的 class 路径(如它将用作查找子目录的根)并保持命令行不变(可能根据需要调整其他 jar 的路径)。