“No main manifest attribute”:为什么Java找不到JAR的入口点以及如何修复

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:认识这个吓唬新手的错误



您用Java编写了一个程序,编译了它,打包成JAR文件,然后自豪地双击尝试运行——但看到的不是应用程序窗口,而是一个带有可怕提示的黑白终端窗口:Can't execute jar- file: "no main manifest attribute"。熟悉吗?如果不熟悉——算您幸运(暂时)。



这个错误是Stack Overflow上最热门的问题之一。想象一下:成千上万的开发者,从学生到经验丰富的工程师,都至少有一次遇到过他们的JAR文件“拒绝”运行的情况。为什么会这样?原因在于,Java不仅仅是“打包就能运行”。虚拟机必须清楚地知道:哪个类包含入口点?没有这个信息,JAR文件就只是一个普通的归档文件,而不是一个可执行程序。



在本文中,我们将详细解释什么是清单文件,它与入口点有什么关系,以及——最重要的是——如何让您的JAR文件无错误地运行。我们将由浅入深:从命令行手动构建到IDE配置。开始吧!



什么是清单文件,为什么需要它?



每个JAR文件(Java Archive)内部都包含一个META-INF文件夹,其中有一个MANIFEST.MF文件。这不仅仅是一个技术产物,而是Java虚拟机真正的“使用说明书”。



想象一本没有目录的书。您知道里面有章节,但不知道从哪一页开始读。JAR文件没有指定主类的情况大致相同。虚拟机看到许多类,但不知道哪个类包含public static void main(String[] args)方法。



一个典型的MANIFEST.MF文件看起来像这样:



Manifest-Version: 1.0Created-By: 17.0.2 (Oracle Corporation)Main-Class: com.example.Main


这里最重要的行是Main-Class。它指定了Java应该运行的类的完整名称(包含包名)。如果这一行缺失或指定错误——您就会遇到那个“no main manifest attribute”错误。



为什么清单文件可能为空或不正确?



  • 通过jar命令手动构建——如果您没有指定-e标志或没有创建自己的清单文件。
  • 在IDE中构建而未配置——某些开发环境(尤其是旧版本)不会自动添加Main-Class。
  • 命名疏忽——例如,您将main写成了小写,或者忘记指定包名。
  • 编码和格式问题——清单文件中,文件末尾的每个空行都很重要。


如何创建可执行的JAR文件:三种方法



方法1. 命令行(手动控制)



这种方法能让您完全理解整个过程。假设我们有一个简单的类HelloWorld.java:



package com.example;

public class HelloWorld { public static void main(String[] args) { System.out.println("你好,世界!JAR运行成功!"); }}


步骤1. 编译类

javac -d . HelloWorld.java

-d .标志会创建包结构(com/example/HelloWorld.class)。



步骤2. 手动创建清单文件

创建一个MANIFEST.MF文件(例如,在记事本中),内容如下:

Manifest-Version: 1.0Main-Class: com.example.HelloWorld

重要:最后一行之后必须有一个空行!否则JAR文件可能无法读取清单文件。



步骤3. 创建JAR

jar cfm HelloWorld.jar MANIFEST.MF com/example/HelloWorld.class

标志

博客

书籍推荐