当你尝试使用 java -jar app.jar 命令运行一个 JAR 文件时,如果看到错误信息 “no main manifest attribute, in app.jar”,这意味着该 JAR 文件的清单文件(MANIFEST.MF)中缺少了 Main-Class 属性。JVM 无法确定程序的入口点,因此无法启动应用程序。
本文将全面解析此问题的原因,并提供针对不同构建工具和开发环境的详细解决方案。
每个 JAR 文件都包含一个特殊的清单文件:META-INF/MANIFEST.MF。这个文件包含了关于 JAR 包的元数据信息。
对于 Spring Boot 项目,必须使用 spring-boot-maven-plugin 来生成可执行的 JAR 文件。
正确的 pom.xml 配置:
"1.0" encoding="UTF-8"?>
"
http://maven.apache.org/POM/4.0.0
"
xmlns:xsi=
"
http://www.w3.org/2001/XMLSchema-instance
"
xsi:schemaLocation=
"
http://maven.apache.org/POM/4.0.0 http:
//
maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.
0
org.springframework.boot
spring-boot-starter-parent
2.7.
0
com.example
demo-application
1.0.
0
jar
11
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-maven-plugin
com.example.DemoApplication
org.apache.maven.plugins
maven-jar-plugin
3.2.
0
com.example.DemoApplication
true
lib/
对于非 Spring Boot 的普通 Maven 项目,需要配置 maven-jar-plugin:
org.apache.maven.plugins
maven-jar-plugin
3.2.
0
com.example.DemoApplication
true
lib/
确保使用正确的构建命令:
构建完成后,检查生成的 JAR 文件:
build.gradle 配置:
3.2 普通 Gradle 项目
如果你需要手动创建可执行 JAR 文件,可以按照以下步骤:
创建一个名为 MANIFEST.MF 的文件,内容如下:
注意: 文件末尾必须有一个空行!
在 Docker 容器中遇到此问题通常是由于构建过程不正确导致的。
对于 Spring Boot 应用:
FROM openjdk:11-jre-slim
构建和运行命令:
如果暂时无法修复 JAR 文件,可以使用以下方式运行:
确保构建过程中没有警告或错误:
如果看到类似 [INFO] Skipping repackaging 的消息,说明配置有问题。
在多模块项目中,确保在包含主类的模块中配置了 spring-boot-maven-plugin
org.springframework.boot
spring-boot-maven-plugin
如果主类名称不标准,需要显式指定:
com.example.custom.CustomStartup
有时依赖冲突会导致插件无法正常工作。可以尝试:
“no main manifest attribute, in app.jar” 错误的根本原因是 JAR 文件缺少必要的 Main-Class 清单属性。解决这个问题的关键在于:
通过本文提供的系统性解决方案,你应该能够快速诊断和解决这个常见的 Java 部署问题。记住,预防胜于治疗——在开发阶段就建立正确的构建和测试流程,可以避免在生产环境中遇到此类问题。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/261450.html