无法运行 jar 文件:找不到或加载主类 Hello。

3

我在IDEA的Build>Build Artifacts中创建了jar文件。但是无法使用java -jar jarname.jar运行它-Error: Could not find or load main class Hello。MANIFEST.MF文件位于/resources/META-INF/文件夹中。这是启动器类:

public class Hello {

    public static void main(String[] args) {
        System.out.println("Hello World!");
    }

}

MANIFEST.MF:

Manifest-Version: 1.0
Main-Class: Hello

在这里输入图片描述


编辑:添加了工件设置截图

在这里输入图片描述


你的清单文件里有什么? - RaGe
检查您的 jar 文件以查看是否已包含类文件。当您使用 IntelliJ 配置构件时,必须指定要包括类、源码或两者都要包括。 - Brion
请仔细阅读我的问题。它显示了MANIFEST文件的内容。 - Mansur Nashaev
@Brion,你能详细解释一下如何做吗? - Mansur Nashaev
@MansurNashaev 我添加了一张带有说明的截图答案。 - Brion
3个回答

9

enter image description here

您需要进入项目结构,然后从左侧选项卡中选择"Artifacts"。添加一个新的artifact,如您所见,尽管我已经选择了一个清单和一个主类,但左侧显示它将添加到jar文件中的内容。右侧显示可用的内容(未添加)。然而,由于我还没有将任何内容添加到我的jar文件中,因此它只会添加清单而不是实际代码。

您需要指定要将编译输出添加到jar文件中,否则它将仅包含清单而不包含实际类。您可以通过双击它来完成这个操作。如果您指定编译输出上面的目录,它将添加src文件夹。

更新:添加外部依赖项

enter image description here

enter image description here


1
它可以工作。但是当我为测试添加了apache io库并启动了.jar文件时,出现了一个错误: java.lang.NoClassDefFoundError: org/apache/commons/io/FileUtils at Hello.main(Hello.java:10)我理解包含库的问题,但不知道如何包含它们。 - Mansur Nashaev
org.apache.commons.io.FileUtils不是标准库,因此程序正在从中提取依赖项。当使用带有绿色+图标的新构件时,请指定您要创建带有依赖项而不是空的构件。我稍后会更新另一个屏幕截图以提供帮助。 - Brion
值得注意的是,截至2020年4月,IDEA自己的HelloWorld Java教程(https://www.jetbrains.com/help/idea/creating-and-running-your-first-java-application.html)没有包括将编译输出添加到目标JAR的步骤。所以感谢您! - MandisaW
仍然无法添加外部依赖项,即使按照指示双击添加它们 :( - Andrea Gorrieri

1
我相信你的清单文件必须说明主类,如果您希望它自动执行。

Main-Class: Hello

否则,当尝试执行jar时,您需要在命令行上指定它。至于如何在IntelliJ中执行此操作,我无法帮助您。

java -cp hello.jar Hello

请注意,具有主方法的类的引用是完全限定位置(package.classname),但由于您的类具有默认包,因此不必要。

使用 java -cp hello.jar Hello 命令时,我得到了 错误: 找不到或无法加载主类Hello 的错误信息。 - Mansur Nashaev
然后您需要验证您的jar文件是否正确创建,也就是说,Hello.class是否在您的jar文件中。 - loesak

-2
如果您的jar文件已正确构建。 请尝试运行 java -jar hello.jar Hello

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接