在Linux系统中,运行JAR包是Java开发者和运维人员的常见操作,掌握正确的命令和参数对于确保程序稳定运行至关重要,JAR(Java Archive)文件是一种归档格式,包含了Java类的字节码、资源文件(如配置文件、图片等)以及元数据(如MANIFEST.MF),通过Java虚拟机(JVM)即可执行,以下是Linux环境下运行JAR包的详细方法及注意事项。

基本运行命令
最基础的JAR包运行命令是通过java -jar指令实现的,假设有一个名为app.jar的JAR包,且该包已正确配置了Main-Class属性(在MANIFEST.MF中指定),则执行命令为:
java -jar app.jar
执行后,JVM会加载JAR包中的类并启动主类定义的入口方法,若JAR包未配置Main-Class,则需要通过-cp(或-classpath)参数指定主类全名,
java -cp app.jar com.example.MainClass
常用运行参数
为了优化JAR包的运行性能或调试问题,通常需要结合JVM参数使用,以下是常用参数及其作用:
| 参数类型 | 示例参数 | 说明 |
|---|---|---|
| 内存设置 | -Xms512m -Xmx1024m |
设置JVM初始堆内存(Xms)和最大堆内存(Xmx),单位为m/g,避免内存溢出 |
| 日志配置 | -Dlog.level=DEBUG |
通过系统属性(-D)自定义日志级别,需配合日志框架(如Log4j)使用 |
| 类路径扩展 | -cp /lib/*.jar |
指定依赖的JAR包路径,多个路径用冒号(:)分隔,如-cp lib/*:app.jar |
| 后台运行 | nohup java -jar app.jar & |
使用nohup让程序在后台运行,输出默认写入nohup.out文件 |
| GC调优 | -XX:+UseG1GC |
指定垃圾回收器,G1GC适合大内存场景,可替代默认的ParallelGC |
| 调试模式 | -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 |
启用JDWP调试,允许远程IDE(如IntelliJ)连接调试 |
结合内存设置和后台运行的完整命令为:

nohup java -Xms512m -Xmx1024m -jar app.jar > app.log 2>&1 &
其中> app.log 2>&1将标准输出和错误输出重定向到app.log文件,便于后续排查问题。
处理依赖问题
若JAR包依赖外部库(非Maven/Gradle自动管理的依赖),需确保所有依赖JAR包已存在于类路径中,可通过以下方式解决:
- 将依赖JAR包与主JAR放在同一目录,并使用通配符加载:
java -jar -cp "lib/*:app.jar" com.example.MainClass
- 使用Maven/Gradle构建可执行JAR(如Spring Boot的
fat jar),将依赖打包进主JAR,避免手动管理类路径。
常见问题排查
- “找不到主类”错误:检查
MANIFEST.MF中的Main-Class是否正确,或通过jar tf app.jar查看JAR内容。 - 内存溢出:通过
jmap -heap <pid>查看堆内存使用情况,适当调整-Xmx参数。 - 端口冲突:若程序监听固定端口,使用
netstat -tlnp | grep :端口号检查端口占用情况。
高级技巧:使用java -jar与java -cp的区别
java -jar:严格遵循JAR包的Main-Class属性,适合独立可执行程序。java -cp:灵活性更高,可动态指定主类和依赖路径,适合调试或模块化场景。
相关问答FAQs
Q1: 如何查看JAR包的Main-Class属性?
A1: 可通过以下两种方式查看:
- 使用
jar命令:jar tf app.jar | grep META-INF/MANIFEST.MF,然后jar xf app.jar META-INF/MANIFEST.MF并查看文件内容。 - 使用
unzip命令:unzip -p app.jar META-INF/MANIFEST.MF | grep Main-Class。
Q2: 运行JAR包时如何设置系统环境变量(如数据库连接配置)?
A2: 通过-D参数传递自定义系统属性,

java -Dspring.datasource.url=jdbc:mysql://localhost:3306/test -Dserver.port=8080 -jar app.jar
这些属性可在代码中通过System.getProperty("spring.datasource.url")获取,常用于覆盖配置文件中的默认值。
