杰瑞科技汇

Linux下Java命令怎么运行?

目录

  1. 前提条件:安装 Java 开发工具包
  2. 核心概念:JAVA_HOMEPATH
  3. 基础 Java 命令详解
    • java:运行 Java 程序
    • javac:编译 Java 源代码
    • jar:打包/解包 Java 归档文件
    • jps:查看当前运行的 Java 进程
    • jstat:监控 JVM 性能
  4. 实战演练:从编写到运行一个 Java 程序
  5. 高级用法与技巧
    • 设置 JVM 堆内存大小 (-Xms, -Xmx)
    • 指定类路径 (-cp-classpath)
    • 使用外部 Jar 包
    • 生成和分析堆转储文件 (-XX:+HeapDumpOnOutOfMemoryError)
  6. 常见问题与解决方案
    • 'java: command not found' 错误
    • Error: Could not find or load main class 错误
    • OutOfMemoryError: Java heap space 错误

前提条件:安装 Java 开发工具包

在运行 Java 命令之前,你的 Linux 系统上必须安装 JDK (Java Development Kit),JDK 包含了运行 Java 程序所需的 JRE (Java Runtime Environment) 以及开发工具(如 javac, jar 等)。

Linux下Java命令怎么运行?-图1
(图片来源网络,侵删)

如何检查是否已安装 JDK?

打开终端,输入以下命令:

java -version
javac -version

如果两个命令都返回了版本号,说明你已经安装了 JDK,如果提示 command not found,则需要进行安装。

如何安装 JDK?(以 Ubuntu/Debian 为例)

使用 APT 包管理器(推荐)

这是最简单的方法,会自动处理依赖关系。

Linux下Java命令怎么运行?-图2
(图片来源网络,侵删)
# 更新软件包列表
sudo apt update
# 安装 OpenJDK 11 (LTS 版本,非常稳定)
sudo apt install openjdk-11-jdk
# 或者安装最新的 LTS 版本 OpenJDK 17
sudo apt install openjdk-17-jdk

手动下载安装

  1. Oracle 官网Adoptium (Eclipse Temurin) 下载对应 Linux 系统的 JDK 压缩包(如 .tar.gz)。
  2. 将下载的文件移动到 /opt 目录(通常用于存放第三方软件)。
    sudo tar -xzf jdk-11.0.12_linux-x64_bin.tar.gz -C /opt/
  3. 设置环境变量(见下一节)。

核心概念:JAVA_HOMEPATH

为了让系统和 Java 工具找到 JDK,需要设置两个关键的环境变量。

JAVA_HOME

指向 JDK 的安装根目录,许多 Java 应用服务器(如 Tomcat, Jetty)和构建工具(如 Maven, Gradle)都需要这个变量来定位 JDK。

PATH

一个包含多个目录的列表,当你在终端输入一个命令时,系统会按顺序在这些目录中查找对应的可执行文件。必须将 JDK 的 bin 目录添加到 PATH,这样你才能在任何位置直接使用 java, javac 等命令。

Linux下Java命令怎么运行?-图3
(图片来源网络,侵删)

如何设置环境变量?

临时设置(仅当前终端会话有效)

# 假设 JDK 11 安装在 /usr/lib/jvm/java-11-openjdk-amd64
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
# 验证设置
echo $JAVA_HOME
echo $PATH

永久设置(推荐)

编辑你的 shell 配置文件(通常是 ~/.bashrc~/.zshrc,取决于你使用的 Shell)。

# 使用 vim 或 nano 打开配置文件
vim ~/.bashrc

在文件末尾添加以下内容:

# Set Java environment variables
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64  # <--- 务必修改为你的实际安装路径
export PATH=$JAVA_HOME/bin:$PATH

保存并退出(在 vim 中是 wq),然后让配置文件立即生效:

source ~/.bashrc

提示:如何找到 JAVA_HOME? 运行 ls /usr/lib/jvm/ 查看已安装的 JDK 版本,选择其中一个路径即可。


基础 Java 命令详解

java:运行 Java 程序

这是运行编译后的 .class 文件的核心命令。

语法: java [options] class [args...]java [options] -jar jar-file [args...]

javac:编译 Java 源代码

.java 源文件编译成 .class 字节码文件。

语法: javac [options] source-files...

jar:打包/解包 Java 归档文件

将多个 .class 文件和资源文件打包成一个 .jar 文件,便于分发和执行。

语法: 创建 JAR 包: jar cvf my-app.jar com/

解压 JAR 包: jar xvf my-app.jar

查看 JAR 包内容: jar tf my-app.jar

jps:查看当前运行的 Java 进程

一个轻量级工具,类似于 Linux 的 ps 命令,但只显示 Java 进程。

语法: jps [options] [hostid]

示例:

$ jps
1234 Jps
5678 Main

这里 1234jps 进程本身,5678 是一个名为 Main 的 Java 进程。

jstat:监控 JVM 性能

一个强大的性能分析工具,可以实时查看 JVM 的内存使用、垃圾回收情况等。

语法: jstat [options] vmid [interval] [count]

示例: 每 1 秒打印一次 PID 为 5678 的 Java 进程的垃圾回收统计信息:

$ jstat -gc 5678 1s
 S0C    S1C    ...   GC     GCT    ...
512.0   512.0  ...     2      0.150 ...

实战演练:从编写到运行一个 Java 程序

让我们走一遍完整的流程。

步骤 1:创建项目目录和源文件

mkdir my-java-project
cd my-java-project
# 创建一个简单的 Hello World 程序
vim HelloWorld.java

HelloWorld.java 中输入以下代码:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, Linux!");
        System.out.println("The first argument is: " + args[0]);
    }
}

步骤 2:编译源代码

使用 javac 命令编译 .java 文件。

javac HelloWorld.java

如果成功,当前目录下会生成一个 HelloWorld.class 文件。

步骤 3:运行程序

使用 java 命令运行。

# 基本运行
java HelloWorld
# 输出:
# Hello, Linux!
# Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0

程序报错了,因为我们没有传递参数,让我们重新运行,并传递一个参数:

# 运行并传递参数 "LinuxUser"
java HelloWorld LinuxUser
# 输出:
# Hello, Linux!
# The first argument is: LinuxUser

注意java 命令后面跟的是类名 HelloWorld,而不是文件名 HelloWorld.class,并且不要加 .class 后缀。


高级用法与技巧

设置 JVM 堆内存大小

当程序处理大量数据时,可能会遇到内存不足的错误,可以通过 -Xms (初始堆大小) 和 -Xmx (最大堆大小) 来调整。

# 初始堆大小设为 512MB,最大堆大小设为 2GB
java -Xms512m -Xmx2g HelloWorld

指定类路径 (-cp-classpath)

如果你的类文件不在当前目录,或者需要引用其他目录的类,就需要使用 -cp 来指定类搜索路径。

示例: 假设你的项目结构如下:

my-project/
├── bin/
│   └── HelloWorld.class
└── lib/
    └── some-library.jar

你需要运行 bin 目录下的 HelloWorld 类,并且它依赖于 lib 下的 some-library.jar

# 使用冒号 : 分隔多个路径
java -cp ./bin:./lib/some-library.jar HelloWorld

在 Windows 中,路径分隔符是分号 ,但在 Linux 和 macOS 中是冒号 。

使用外部 Jar 包

这是 -cp 的一个典型应用场景,许多项目都依赖第三方库(如 Spring, MySQL Connector 等)。

# 假设你有一个 my-app.jar 和两个依赖库
java -cp my-app.jar:lib/library1.jar:lib/library2.jar com.example.MainClass

生成和分析堆转储文件

当程序因 OutOfMemoryError 崩溃时,可以生成一个堆转储文件(.hprof),这个文件包含了崩溃时 JVM 中所有对象的信息,是分析内存泄漏的关键。

步骤 1:运行时启用堆转储

在运行 Java 程序时添加以下 JVM 参数:

java -Xms512m -Xmx1g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dumps/heapdump.hpo MyApplication
  • -XX:+HeapDumpOnOutOfMemoryError:当发生 OOM 时自动生成堆转储。
  • -XX:HeapDumpPath:指定堆转储文件的保存路径。

步骤 2:分析堆转储文件

可以使用 Eclipse MAT (Memory Analyzer Tool) 或 VisualVM 等工具来打开 .hprof 文件,分析哪个对象占用了过多内存,从而定位内存泄漏的根源。


常见问题与解决方案

问题 1:'java: command not found' 错误

原因:系统找不到 java 命令,通常是因为 JDK 的 bin 目录没有添加到系统的 PATH 环境变量中。

解决方案

  1. 确认 JDK 已正确安装(ls /usr/lib/jvm/)。
  2. 按照 第 2 节 的说明,正确设置并永久生效 JAVA_HOMEPATH
  3. 重启终端或重新 source 你的配置文件 (source ~/.bashrc)。

问题 2:Error: Could not find or load main class 错误

这是最常见的运行时错误,原因有多种:

原因 1:在错误的目录下运行 你必须在包含 .class 文件(或包含该类的包目录)的目录下运行,或者通过 -cp 指定正确的路径。

原因 2:类名与文件名不匹配 确保文件名(不含扩展名)与 public 类的名称完全一致,包括大小写。

原因 3:类在包中 如果类位于一个包(package)中,package com.example;,那么编译后的 .class 文件会在 com/example/ 目录下,运行时,你必须指定完整的类名(包含包路径),-cp 必须指向包含 com 目录的父目录。

# 假设结构为 ./src/com/example/HelloWorld.class
# 类名是 com.example.HelloWorld
# -cp 指向 ./src
java -cp ./src com.example.HelloWorld

原因 4:使用 -jar 参数时,Main-Class 未正确指定 当你使用 java -jar my-app.jar 运行时,JVM 会忽略 -cp 中的类路径,并且只在 JAR 文件的 META-INF/MANIFEST.MF 文件中查找 Main-Class 属性。

  • 手动创建 MANIFEST.MF: vim MANIFEST.MF

    Main-Class: com.example.HelloWorld

    然后打包: jar cvfm my-app.jar MANIFEST.MF com/

  • Maven/Gradle 自动处理:现代构建工具会自动处理这个步骤。

问题 3:OutOfMemoryError: Java heap space 错误

原因:JVM 的堆内存分配不足,无法容纳程序运行时创建的所有对象。

解决方案

  1. 增加堆内存:使用 -Xmx 参数增加最大堆内存。
    java -Xmx2g MyApplication # 将最大堆内存增加到 2GB
  2. 分析内存泄漏:如果增加内存后问题依旧,说明代码中可能存在内存泄漏(对象不再被使用,但无法被垃圾回收),使用 第 5 节 中介绍的 -XX:+HeapDumpOnOutOfMemoryError 生成堆转储文件,并用工具分析。
  3. 优化代码:检查代码,确保及时释放不再需要的资源(如关闭数据库连接、文件流等),避免不必要的静态集合类等。

希望这份详细的指南能帮助你在 Linux 上顺利地运行和管理 Java 程序!

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