在Linux系统中运行JAR包是Java应用部署的常见操作,涉及Java环境准备、运行方式配置、参数调优及问题排查等多个环节,以下是详细步骤和注意事项,帮助您顺利在Linux环境下运行JAR包。

运行JAR包前的准备工作
确认Java环境已安装
JAR包依赖Java虚拟机(JVM)运行,需确保系统已安装Java开发工具包(JDK)或Java运行时环境(JRE),可通过以下命令检查Java版本:
java -version # 查看Java版本 javac -version # 查看JDK编译器版本(若仅需运行JAR,JRE即可)
若提示“命令未找到”,需安装Java,主流Linux发行版的安装命令如下:
- Ubuntu/Debian:sudo apt update && sudo apt install openjdk-11-jdk(以OpenJDK 11为例)
- CentOS/RHEL:sudo yum install java-11-openjdk-devel(需先配置EPEL源)
- 手动安装JDK:从Oracle或OpenJDK官网下载tar.gz包,解压后配置JAVA_HOME环境变量(如export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64,并添加到~/.bashrc或/etc/profile)。
安装完成后,再次执行java -version确认输出Java版本信息,表示环境配置成功。
确认JAR包存在且有执行权限
假设JAR包位于当前目录(如app.jar),先用ls -l检查文件权限:  
ls -l app.jar
若权限中无执行权限(即无x标志),需通过chmod命令添加:  
chmod +x app.jar # 添加执行权限
若JAR包不在当前目录,需使用绝对路径或相对路径,例如/opt/app/app.jar或../app.jar。
运行JAR包的常用方式
前台运行(适合调试)
直接使用java -jar命令运行JAR包,终端会阻塞并显示程序输出(日志或错误信息):  
java -jar app.jar
特点:关闭终端或按Ctrl+C会终止程序,适合临时调试或测试。
后台运行(适合生产环境)
为避免终端关闭导致程序终止,可使用以下方式让JAR包在后台运行:
- 
使用 &符号 java -jar app.jar & 特点:程序在后台运行,但终端关闭后进程会被终止(受终端会话组控制)。 
- 
使用 nohup命令(推荐)nohup(no hang up)能让程序在用户退出终端后继续运行,默认将输出重定向到nohup.out文件:nohup java -jar app.jar & 若需指定日志文件路径(如 /var/log/app.log),可结合重定向:nohup java -jar app.jar > /var/log/app.log 2>&1 & 参数说明: - > /var/log/app.log:标准输出重定向到指定文件;
- 2>&1:错误输出重定向到标准输出(即合并日志);
- &:让命令在后台执行。
 特点:程序长期运行,适合服务部署,可通过 ps或jobs命令查看进程状态。
指定JVM参数运行
运行JAR包时可通过JVM参数优化性能,例如设置堆内存、垃圾回收策略等,常用参数如下:
| 参数 | 作用说明 | 示例 | 
|---|---|---|
| -Xms | 设置JVM初始堆内存大小 | -Xms512m(初始堆512MB) | 
| -Xmx | 设置JVM最大堆内存大小 | -Xmx1024m(最大堆1GB) | 
| -Xss | 设置线程栈大小 | -Xss256k(线程栈256KB) | 
| -XX:+UseG1GC | 使用G1垃圾回收器 | -XX:+UseG1GC | 
| -Dfile.encoding | 设置文件编码(如UTF-8) | -Dfile.encoding=UTF-8 | 
| -cp/-classpath | 指定类路径(若JAR依赖外部jar包) | -cp /lib/*:app.jar | 
示例:设置堆内存为1GB~2GB,使用G1垃圾回收器,并指定日志编码:
nohup java -Xms1024m -Xmx2048m -XX:+UseG1GC -Dfile.encoding=UTF-8 -jar app.jar > /var/log/app.log 2>&1 &
常见问题排查
错误:“无法加载主类”或“Main manifest attribute, not found”
原因:JAR包未正确指定Main-Class(入口类),或MANIFEST.MF文件配置缺失。
解决:  
- 检查JAR包的MANIFEST.MF文件(位于META-INF/目录下),确认包含Main-Class: com.example.Main(入口类全限定名);
- 若MANIFEST.MF缺失,需重新打包JAR(使用Maven/Gradle的maven-jar-plugin或jar命令指定Main-Class);
- 若无法修改JAR包,可通过-cp参数手动指定入口类:java -cp app.jar com.example.Main 
错误:“内存溢出”(OutOfMemoryError: Java heap space)
原因:JVM堆内存设置过小,或程序存在内存泄漏。
解决:  
- 增加堆内存大小(如-Xmx4096m);
- 使用内存分析工具(如MAT、JProfiler)分析内存泄漏;
- 若为短期任务,可使用-XX:+HeapDumpOnOutOfMemoryError生成堆转储文件(java_pid<pid>.hprof),用于后续分析。
端口冲突错误(Address already in use)
原因:JAR绑定的端口已被其他进程占用。
解决:  

- 查看端口占用情况:netstat -tuln | grep 8080(假设端口为8080);
- 终止占用进程:kill -9 <PID>(PID为进程ID);
- 或修改JAR配置的端口(如-Dserver.port=8081)。
相关问答FAQs
问题1:如何让JAR包开机自启?
解答:可通过Linux的systemd服务实现开机自启,步骤如下:  
- 
创建服务文件(如 /etc/systemd/system/myapp.service):sudo vim /etc/systemd/system/myapp.service 
- 
添加以下内容(根据实际路径修改): [Unit] Description=My Java Application After=network.target [Service] User=root WorkingDirectory=/opt/app ExecStart=/usr/bin/java -jar app.jar ExecStop=/bin/kill -15 $MAINPID SuccessExitStatus=143 Restart=always RestartSec=10 [Install] WantedBy=multi-user.target 
- 
启用并启动服务: sudo systemctl daemon-reload # 重新加载systemd配置 sudo systemctl enable myapp # 开机自启 sudo systemctl start myapp # 启动服务 
- 
查看服务状态: sudo systemctl status myapp。
问题2:如何实时查看JAR包的运行日志?
解答:根据运行方式选择合适的日志查看方法:
- nohup或日志重定向:使用- tail -f命令实时跟踪日志文件,- tail -f /var/log/app.log # 实时查看日志末尾内容 
- systemd服务:使用- journalctl命令查看服务日志,- journalctl -u myapp -f # 实时查看myapp服务的日志 journalctl -u myapp --since today # 查看今日日志 
- 过滤关键字:若需查看特定关键字(如“ERROR”)的日志,可通过grep过滤:tail -f /var/log/app.log | grep "ERROR" 
通过以上步骤和配置,您可在Linux系统中稳定运行JAR包,并根据实际需求调整运行方式和参数,若遇到复杂问题,可结合JVM工具(如jstat、jstack)进一步分析性能和异常。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/21964.html
 
                