Java -jar 运行jar包终极指南:从入门到精通,一篇搞定所有!
** 还在为java -jar命令报错而烦恼?本文详细解析命令参数、常见问题与高级技巧,助你轻松掌握Java应用程序的启动与部署。

引言:为什么“java -jar”是Java开发者的必备技能?
在Java的世界里,将应用程序打包成可执行的JAR(Java Archive)文件是一种非常普遍的部署方式,无论是Spring Boot的“fat jar”,还是传统的多模块项目打包,最终都离不开一个核心命令:java -jar。
你是否也曾遇到过以下困惑:
java -jar myapp.jar提示“找不到主清单属性”?- 如何在后台运行jar包,关闭终端后程序依然存活?
- 怎样给jar包传递自定义的启动参数?
- 如何查看一个jar包内部依赖和版本信息?
如果你对这些问题点头,那么恭喜你,你已经来到了正确的页面,本文将作为你的“导航仪”,带你彻底搞懂java -jar的方方面面,让你从“只会用”到“精通用”,真正解决实际工作中的痛点。
第一部分:基础篇 - “java -jar”命令详解
1 核心命令格式
最基本、最常用的java -jar命令格式如下:

java -jar <jar-file-path> [args...]
java: 这是Java虚拟机命令行工具,确保你的系统已经安装了JDK或JRE,并且JAVA_HOME环境变量配置正确。-jar: 这是一个关键的命令行选项,它告诉JVM:“我要从这个JAR文件中运行一个程序”,使用此选项时,JVM会自动在JAR文件的META-INF/MANIFEST.MF文件中寻找Main-Class属性,并执行该类的主方法。<jar-file-path>: 你要运行的JAR文件的完整路径或相对路径。[args...]: 这是传递给主程序的命令行参数,如果你的程序需要接收外部输入,这部分就派上用场了。
示例:
假设你的JAR包名为my-app-1.0.0.jar,位于当前目录下,运行它:
java -jar my-app-1.0.0.jar
如果你想传递参数,比如--env=prod和--port=8081:
java -jar my-app-1.0.0.jar --env=prod --port=8081
2 JAR包的“灵魂”:MANIFEST.MF 文件
-jar选项能正常工作的前提是,你的JAR包必须包含一个正确的MANIFEST.MF文件,它通常位于JAR根目录/META-INF/下。
这个文件的核心作用是定义JAR包的元数据,其中最重要的就是Main-Class属性。

MANIFEST.MF 示例:
Manifest-Version: 1.0
Created-By: Apache Maven 3.8.1
Build-Jdk: 1.8.0_312
Main-Class: com.example.MyApplication
Main-Class: com.example.MyApplication:这行指定了程序的入口点,即包含public static void main(String[] args)方法的类。注意:这里的类名不需要包含.class后缀,并且路径使用点分隔。
如果你在打包时遇到“no main manifest attribute, in my-app.jar”错误,几乎可以肯定是MANIFEST.MF文件中缺少或错误定义了Main-Class属性,对于Maven或Gradle用户,通常有专门的插件来帮你自动生成这个文件。
第二部分:进阶篇 - 常用参数与技巧
掌握了基础命令,我们来看看如何通过参数来控制JVM和应用程序的行为,这往往是区分新手和老手的关键。
1 JVM参数:优化性能与调试
在-jar之前添加的参数是传递给JVM的,用于控制内存分配、垃圾回收、日志级别等。
-
设置堆内存大小 (最常用)
-Xms: 初始化堆内存大小。-Xmx: 最大堆内存大小。- 示例: 给JAR分配2GB的初始堆和4GB的最大堆。
java -Xms2g -Xmx4g -jar my-app.jar
-
设置元空间/永久代 (PermGen/Metaspace)
-XX:MetaspaceSize: 元空间初始大小。-XX:MaxMetaspaceSize: 元空间最大大小。(在Java 8及以后版本推荐使用Metaspace替代PermGen)- 示例:
java -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -jar my-app.jar
-
启用GC日志 (排查内存问题的利器)
-Xloggc:gc.log: 将GC日志输出到指定文件。- 示例:
java -Xms2g -Xmx2g -Xloggc:./logs/gc.log -jar my-app.jar
2 应用程序参数:动态配置
在-jar之后添加的参数是传递给主方法main(String[] args)的,你的程序需要自己解析这些参数。
最佳实践: 使用成熟的命令行参数解析库,如:
- Apache Commons CLI
- JCommander
- Picocli (现代Java项目中的热门选择)
3 后台运行:让程序“脱机”执行
在Linux或macOS系统上,最简单的方式是在命令末尾加上&符号。
nohup java -jar my-app.jar > app.log 2>&1 &
我们来分解这个强大的命令:
nohup: "No Hang Up"的缩写,意思是“不挂断”,它使得你的进程在退出终端后仍然可以继续运行。> app.log: 将标准输出重定向到app.log文件。2>&1: 将标准错误输出重定向到标准输出,也就是和标准输出一起写入app.log。&: 让命令在后台执行,并立即返回一个进程ID。
Windows系统:
可以使用start命令,或者更推荐使用第三方工具如NSSM (Non-Sucking Service Manager)来将jar包注册为Windows服务,实现真正的后台和自启动。
第三部分:实战篇 - 常见问题与解决方案
问题1:'main' manifest attribute is missing
- 原因分析: JAR包的
MANIFEST.MF文件中没有定义Main-Class属性,或者定义错误。 - 解决方案:
- 使用
jar tf your-file.jar | grep MANIFEST检查是否存在META-INF/MANIFEST.MF。 - 使用
jar xf your-file.jar META-INF/MANIFEST.MF解压出来查看内容。 - 如果是Maven项目,检查
pom.xml中的maven-jar-plugin配置是否正确指定了Main-Class。 - 如果是Spring Boot项目,检查
spring-boot-maven-plugin或spring-boot-gradle-plugin是否正确配置。
- 使用
问题2:Error: Could not find or load main class
- 原因分析:
- 你可能没有使用
-jar选项,而是直接用java -cp <jar-path> <main-class>,并且-cp路径或类名有误。 - 即使使用了
-jar,但JAR包依赖了其他外部JAR包,而这些依赖没有被正确包含进来。
- 你可能没有使用
- 解决方案:
- 确保使用
-jar选项,这是最规范的启动方式。 - 如果是依赖问题,确保你的JAR是一个“uber/fat jar”(包含所有依赖),或者在启动时通过
-classpath或-cp选项显式指定所有依赖的路径。java -cp "my-app.jar:lib/*.jar" com.example.MyApplication
(注意:Windows系统下路径分隔符是)
- 确保使用
问题3:如何查看一个JAR包的依赖?
- 使用IDEA/Eclipse等IDE 直接用IDE打开JAR文件,就能清晰地看到其内部结构。
- 使用命令行工具
jar tf: 查看JAR包中的所有文件列表。jar tf my-app.jar
jdeps(JDK自带): 分析JAR包的类级依赖。jdeps my-app.jar
第四部分:高级篇 - 超越java -jar
对于生产环境,仅仅java -jar可能还不够。
1 使用进程管理工具:PM2
虽然PM2主要用于Node.js,但它也可以管理任何进程,包括Java应用,它提供了进程守护、日志管理、负载均衡、重启策略等强大功能。
安装PM2:
npm install pm2 -g
启动Java应用:
pm2 start "java -Xmx512m -jar my-app.jar" --name "my-java-app"
常用PM2命令:
pm2 list # 查看所有进程 pm2 logs my-java-app # 查看日志 pm2 restart my-java-app # 重启应用 pm2 stop my-java-app # 停止应用
2 使用Docker容器化部署
这是目前最主流的部署方式之一,将你的JAR包打包进一个轻量级的Docker镜像中,可以实现环境一致性、可移植性和易于扩展。
Dockerfile示例:
# 使用官方的OpenJDK 8镜像作为基础镜像 FROM openjdk:8-jre-alpine # 将JAR包复制到容器内 COPY target/my-app-1.0.0.jar app.jar # 声明容器监听的端口 EXPOSE 8080 # 设置JVM参数并启动应用 ENTRYPOINT ["java", "-jar", "/app.jar"]
构建与运行:
# 构建镜像 docker build -t my-java-app . # 运行容器 docker run -d -p 8080:8080 --name my-running-app my-java-app
java -jar命令看似简单,但其背后蕴含着Java应用打包、启动和部署的精髓,从基础的命令格式,到JVM参数的精细调优,再到后台运行和高级部署方案,每一步都值得我们去学习和掌握。
希望这篇“终极指南”能够成为你解决java -jar相关问题的“案头手册”,最好的学习方式是实践,现在就打开你的终端,动手尝试一下吧!
如果你觉得这篇文章对你有帮助,请别忘了点赞、收藏和分享!你的支持是我们持续创作高质量内容的最大动力!
