java 命令
无论在哪种 Shell 中调用 Java,最终都是通过执行 java 命令来运行的,这个命令是 Java 运行时环境的一部分。

java 命令的基本语法是:
java [options] class [args...]
或者对于 JAR 文件:
java [options] -jar jarfile [args...]
options: JVM 的启动参数,-Xmx(设置最大堆内存),-D(设置系统属性) 等。class: 要执行的 Java 类的全限定名(com.example.MainApp)。jarfile: 要执行的 JAR 文件的路径。args...: 传递给 Java 程序main方法的命令行参数。
第一步:确保环境正确
在开始之前,请确保你的系统已经正确安装了 Java 并且环境变量配置正确。
-
检查 Java 是否已安装:
(图片来源网络,侵删)java -version
如果看到类似下面的输出,说明已安装:
openjdk version "17.0.8" 2025-07-18 OpenJDK Runtime Environment (build 17.0.8+7-Ubuntu-0ubuntu122.04) OpenJDK 64-Bit Server VM (build 17.0.8+7-Ubuntu-0ubuntu122.04, mixed mode, sharing) -
检查
JAVA_HOME和PATH环境变量:JAVA_HOME应该指向你的 JDK 安装根目录。PATH环境变量需要包含$JAVA_HOME/bin目录,这样 Shell 才能找到java,javac等命令。检查
JAVA_HOME:echo $JAVA_HOME
检查
PATH:
(图片来源网络,侵删)echo $PATH | grep java
如果这些变量没有设置或设置错误,你需要根据你使用的 Shell(如 Bash 或 Zsh)来配置它们,通常在
~/.bashrc,~/.profile或~/.zshrc文件中添加以下内容:# 设置 JAVA_HOME (请根据你的实际安装路径修改) export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 # 将 $JAVA_HOME/bin 添加到 PATH export PATH=$PATH:$JAVA_HOME/bin
添加后,执行
source ~/.bashrc(或对应的配置文件) 使其生效。
第二步:在 Shell 中调用 Java 类
假设你有一个简单的 Java 项目,编译后生成了 .class 文件。
Java 代码示例 (HelloWorld.java)
// src/com/example/HelloWorld.java
package com.example;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, from Java!");
if (args.length > 0) {
System.out.println("First argument: " + args[0]);
}
}
}
编译和准备
# 1. 创建目录结构 mkdir -p com/example # 2. 将代码保存到 HelloWorld.java # (或者使用 javac src/com/example/HelloWorld.java -d . 来编译) # 3. 编译 Java 文件 javac com/example/HelloWorld.java # 现在你应该有一个 com/example/HelloWorld.class 文件
Shell 调用方法
方法1:直接调用(不推荐用于复杂项目)
这种方式要求你在包含 com/example/HelloWorld.class 文件的目录下执行,CLASSPATH 包含当前目录。
# 在包含 com/ 目录的路径下执行 java com.example.HelloWorld
如果不在当前目录,需要指定类路径:
java -cp /path/to/your/project com.example.HelloWorld
方法2:使用 CLASSPATH 环境变量(推荐用于旧项目)
CLASSPATH 环境变量告诉 Java 虚拟机去哪里查找 .class 文件。
# 设置 CLASSPATH 为当前目录 (.) export CLASSPATH=. # 现在可以在任何地方调用(只要类文件在当前目录下) java com.example.HelloWorld # 传递参数 java com.example.HelloWorld "This is a test" # 取消设置 unset CLASSPATH
方法3:使用 -cp 或 -classpath 参数(最灵活、最推荐)
这是最常用和最灵活的方式,因为它不依赖于环境变量,每次调用都可以精确指定类路径。
# -cp 指定类路径为当前目录 "." java -cp . com.example.HelloWorld # 类路径可以包含多个路径,用冒号 ":" 分隔 java -cp .:/path/to/libs/* com.example.HelloWorld # 传递参数 java -cp . com.example.HelloWorld "Argument 1" "Argument 2"
第三步:在 Shell 中调用 JAR 文件
将你的 Java 项目打包成 JAR 文件是更常见的部署方式。
打包 JAR 文件
# 创建一个包含所有 .class 文件的 JAR 文件 # com.example.HelloWorld 是主类的全限定名 jar cvfe my-app.jar com.example.HelloWorld com/ # 或者使用构建工具(如 Maven/Gradle)来生成可执行的 JAR
my-app.jar 的 META-INF/MANIFEST.MF 文件会自动包含 Main-Class: com.example.HelloWorld 信息。
Shell 调用 JAR 文件
-
直接使用
-jar参数: 这是调用可执行 JAR 的标准方式。java -jar my-app.jar # 传递参数给 Java 程序 java -jar my-app.jar "This is from JAR"
-
通过
-cp参数调用(不常见): JAR 文件不是“可执行的”(即没有Main-Class清单),或者你想覆盖主类,可以使用这种方式。java -cp my-app.jar com.example.HelloWorld
第四步:高级技巧与最佳实践
设置 JVM 内存
在 Shell 脚本中,为 Java 应用分配足够的内存至关重要。
# 设置最大堆内存为 2G,初始堆内存为 512M java -Xms512m -Xmx2g -jar my-app.jar # 设置元空间大小(Java 8+) java -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -jar my-app.jar
在后台运行 (&)
如果你想让 Java 程序在后台运行,可以在命令末尾加上 &。
nohup java -jar my-app.jar > app.log 2>&1 &
nohup: 表示 "no hang up",即使用户退出终端,程序也会继续运行。> app.log: 将标准输出重定向到app.log文件。2>&1: 将标准错误也重定向到标准输出(也就是app.log)。&: 在后台执行。
使用 Shell 脚本封装
创建一个 .sh 脚本来管理你的 Java 应用,是专业做法。
start_app.sh 脚本示例
#!/bin/bash
# 脚本所在目录
APP_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
# JAR 文件名
JAR_FILE="my-app.jar"
# JVM 参数
JAVA_OPTS="-Xms512m -Xmx2g -Dapp.name=MyApp"
# 日志文件
LOG_FILE="$APP_DIR/app.log"
PID_FILE="$APP_DIR/app.pid"
# 检查 JAR 文件是否存在
if [ ! -f "$APP_DIR/$JAR_FILE" ]; then
echo "Error: JAR file not found at $APP_DIR/$JAR_FILE"
exit 1
fi
# 启动函数
start() {
if [ -f "$PID_FILE" ]; then
PID=$(cat "$PID_FILE")
if ps -p $PID > /dev/null 2>&1; then
echo "Application is already running with PID $PID"
return 1
else
rm -f "$PID_FILE"
fi
fi
echo "Starting application..."
nohup java $JAVA_OPTS -jar "$APP_DIR/$JAR_FILE" > "$LOG_FILE" 2>&1 &
echo $! > "$PID_FILE"
echo "Application started with PID $! (see $LOG_FILE for logs)"
}
# 停止函数
stop() {
if [ -f "$PID_FILE" ]; then
PID=$(cat "$PID_FILE")
if ps -p $PID > /dev/null 2>&1; then
echo "Stopping application with PID $PID..."
kill $PID
# 等待进程优雅退出
for i in {1..10}; do
if ! ps -p $PID > /dev/null 2>&1; then
break
fi
sleep 1
done
# 如果还在运行,则强制杀死
if ps -p $PID > /dev/null 2>&1; then
echo "Force killing application..."
kill -9 $PID
fi
rm -f "$PID_FILE"
echo "Application stopped."
else
echo "Application is not running."
rm -f "$PID_FILE"
fi
else
echo "PID file not found. Application may not be running."
fi
}
# 根据第一个参数执行相应操作
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 2
start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac
exit 0
如何使用脚本
- 将上述代码保存为
start_app.sh。 - 赋予执行权限:
chmod +x start_app.sh。 - 启动应用:
./start_app.sh start。 - 停止应用:
./start_app.sh stop。 - 重启应用:
./start_app.sh restart。
| 场景 | 推荐方法 | 示例 |
|---|---|---|
| 快速测试/简单脚本 | 使用 -cp 参数 |
java -cp . com.example.Main |
| 开发/旧项目 | 设置 CLASSPATH 环境变量 |
export CLASSPATH=. |
| 生产部署 | 打包成可执行 JAR 并使用 -jar |
java -Xmx1g -jar my-app.jar |
| 长期运行服务 | 使用 Shell 脚本封装,配合 nohup |
./start_app.sh start |
掌握这些方法,你就可以在 Linux Shell 中灵活、高效地管理和运行你的 Java 应用程序了。
