杰瑞科技汇

linux shell调用java

java 命令

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

linux shell调用java-图1
(图片来源网络,侵删)

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 并且环境变量配置正确。

  1. 检查 Java 是否已安装

    linux shell调用java-图2
    (图片来源网络,侵删)
    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)
  2. 检查 JAVA_HOMEPATH 环境变量JAVA_HOME 应该指向你的 JDK 安装根目录。PATH 环境变量需要包含 $JAVA_HOME/bin 目录,这样 Shell 才能找到 java, javac 等命令。

    检查 JAVA_HOME

    echo $JAVA_HOME

    检查 PATH

    linux shell调用java-图3
    (图片来源网络,侵删)
    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.jarMETA-INF/MANIFEST.MF 文件会自动包含 Main-Class: com.example.HelloWorld 信息。

Shell 调用 JAR 文件

  1. 直接使用 -jar 参数: 这是调用可执行 JAR 的标准方式。

    java -jar my-app.jar
    # 传递参数给 Java 程序
    java -jar my-app.jar "This is from JAR"
  2. 通过 -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

如何使用脚本

  1. 将上述代码保存为 start_app.sh
  2. 赋予执行权限:chmod +x start_app.sh
  3. 启动应用:./start_app.sh start
  4. 停止应用:./start_app.sh stop
  5. 重启应用:./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 应用程序了。

分享:
扫描分享到社交APP
上一篇
下一篇