在Linux系统中,运行JAR文件是Java开发者和运维人员常见的操作,涉及多种命令行参数和环境配置,以下是关于Linux命令运行JAR文件的详细说明,包括基础命令、高级参数、常见问题及解决方案。

基础运行命令
在Linux终端中,运行JAR文件最基础的命令是使用java命令结合-jar参数,基本语法如下:
java -jar jar文件名.jar
若有一个名为app.jar的文件,可直接执行:
java -jar app.jar
此命令会启动JAR文件中的主类(在MANIFEST.MF文件中通过Main-Class属性指定的类),并默认使用当前目录下的类路径和系统环境变量。
命令参数详解
指定JVM参数
运行JAR文件时,可能需要调整JVM的内存分配、垃圾回收策略等参数,可通过-X系列参数实现,

java -Xms512m -Xmx2g -jar app.jar
-Xms:设置JVM堆内存初始大小,如512m表示512MB。-Xmx:设置JVM堆内存最大大小,如2g表示2GB。- 其他常用参数包括
-XX:+UseG1GC(使用G1垃圾回收器)、-Dfile.encoding=UTF-8(设置文件编码)等。
指定类路径(Classpath)
若JAR文件依赖外部库(如.jar文件或目录),需通过-cp或-classpath参数指定类路径:
java -cp ".:lib/*" -jar app.jar
- 表示当前目录,
lib/*表示lib目录下的所有JAR文件(Linux/Unix使用冒号分隔路径,Windows使用分号)。 - 若使用
-jar参数,类路径通常由JAR文件的MANIFEST.MF中的Class-Path属性定义,但-cp会覆盖该配置。
后台运行与日志管理
在服务器环境中,通常需要将JAR程序置于后台运行,并输出日志到文件,可通过nohup和&组合实现:
nohup java -jar app.jar > app.log 2>&1 &
nohup:使进程在终端关闭后继续运行。>:将标准输出重定向到app.log。2>&1:将错误输出重定向到标准输出。&:将命令放入后台执行。
指定主类
若JAR文件未正确配置Main-Class,可通过-cp和主类名手动指定:
java -cp app.jar com.example.MainClass
高级场景配置
使用系统服务(Systemd)
对于长期运行的Java应用,可将其配置为系统服务,创建服务文件/etc/systemd/system/myapp.service:

[Unit] Description=My Java Application After=network.target [Service] User=javauser Group=javauser WorkingDirectory=/opt/myapp ExecStart=/usr/bin/java -jar app.jar SuccessExitStatus=143 Restart=on-failure [Install] WantedBy=multi-user.target
通过systemctl start myapp启动服务,并设置开机自启systemctl enable myapp。
多环境配置
通过-D参数传递自定义属性,实现不同环境(开发/测试/生产)的配置切换:
java -Dspring.profiles.active=prod -jar app.jar
性能调优工具
使用jps查看Java进程:
jps -l
通过jstat监控JVM内存和GC情况:
jstat -gcutil <进程ID> 1s
常见问题与解决方案
"Failed to configure a DataSource"错误
原因:未正确配置数据库连接参数或依赖缺失。
解决:检查application.properties或application.yml中的数据库配置,并确保pom.xml或build.gradle中包含相关驱动依赖(如mysql-connector-java)。
"OutOfMemoryError: Java heap space"
原因:JVM堆内存不足。
解决:增加-Xmx参数值,如java -Xmx4g -jar app.jar,或通过jmap分析内存泄漏:
jmap -dump:format=b,file=heapdump.hprof <进程ID>
相关问答FAQs
Q1: 如何查看JAR文件的依赖信息?
A1: 使用jar tf命令查看JAR内容,或通过javap -v反编译主类查看依赖,对于Maven/Gradle项目,可执行mvn dependency:tree或gradle dependencies生成依赖树。
Q2: 如何停止后台运行的JAR进程?
A2: 首先ps aux | grep java找到进程ID,然后通过kill <进程ID>终止进程,若进程无响应,可使用kill -9 <进程ID>强制终止,对于通过systemd启动的服务,需执行systemctl stop myapp。
