
方法一:环境变量配置(部分配置)
setx JAVA_HOME "C:Program FilesJavajdk1.8.0_201"
setx PATH "%PATH%;%JAVA_HOME%in"
# 验证配置
java -version
javac -version
方法二:注册表配置(企业部署)(部分配置)
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerEnvironment]
"JAVA_HOME"="C:Program FilesJavajdk1.8.0_201"
"PATH"="%JAVA_HOME%in;%PATH%"
方法三:批处理文件临时配置(部分配置)
@echo off
set JAVA_HOME=C:Program FilesJavajdk1.8.0_201
set PATH=%JAVA_HOME%in;%PATH%
echo Java环境已配置
cmd /k
全局配置(/etc/profile)
# 编辑全局配置文件
sudo vi /etc/profile
# 添加以下内容
export JAVA_HOME=/usr/java/jdk1.8.0_201
export JRE_HOME=/usr/java/jre1.8.0_201
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
# 使配置生效
source /etc/profile
用户级配置(/.bashrc或/.bash_profile)
# 编辑用户配置文件
vi ~/.bashrc
# 添加Java配置
export JAVA_HOME=$HOME/java/jdk1.8.0_201
export PATH=$JAVA_HOME/bin:$PATH
# 立即生效
source ~/.bashrc
使用alternatives
# 注册Java到alternatives系统
sudo alternatives --install /usr/bin/java java /usr/java/jdk1.8.0_201/bin/java 1
sudo alternatives --install /usr/bin/javac javac /usr/java/jdk1.8.0_201/bin/javac 1
# 切换Java版本
sudo alternatives --config java
sudo alternatives --config javac
alternatives 是一个在 Linux 系统(特别是 RHEL、CentOS、Fedora 等) 中的命令和工具。
它的全名通常是
update-alternatives(在 Debian/Ubuntu 上)或
alternatives(在 RHEL/CentOS 上)。
您的电脑上可能同时安装了:
OpenJDK 8OpenJDK 11Oracle JDK 17
# 1. 注册Java到alternatives系统
sudo alternatives --install /usr/bin/java java /usr/java/jdk1.8.0_201/bin/java 1
--install:表示要向
alternatives 系统注册一个新的候选程序。
/usr/bin/java:这是一个符号链接。这是系统真正查找命令的地方(在
PATH 环境变量里)。
alternatives 会创建并管理这个链接,让它指向你选择的那个实际版本。
java:这是主控名称。
alternatives 用它来分组管理同一类程序的所有候选版本。
/usr/java/jdk1.8.0_201/bin/java:这是候选程序的实际路径,即 JDK 8 的
java 可执行文件位置。
1:这是优先级。数字越大,优先级越高。在自动模式下,
alternatives 会选择优先级最高的版本。
# 2. 切换Java版本
sudo alternatives --config java
--config:这个命令会交互式地列出所有已注册的、主控名称为
java 的候选版本。执行后,终端会显示一个列表,让你输入数字来选择当前要使用的版本。
例如,执行后可能显示:
There are 3 programs which provide 'java'.
Selection Command
-----------------------------------------------
*+ 1 /usr/java/jdk1.8.0_201/bin/java
2 /usr/java/jdk11.0.15/bin/java
3 /usr/lib/jvm/java-17-oracle/bin/java
Enter to keep the current selection[+], or type selection number:
你只需输入
2 然后回车,系统默认的 Java 版本就会切换到 JDK 11。
alternatives 工具的作用:
/usr/bin 目录下的符号链接(如
/usr/bin/java),来控制系统默认使用的版本。方便切换:用户无需手动修改环境变量(如
PATH)或创建复杂的软链接,只需一个简单的
alternatives --config <程序名> 命令即可在不同版本间轻松切换。维持系统一致性:确保所有用户和系统服务在调用某个命令时,使用的是同一个预期的版本。
JDK 1.8.0_201/
├── bin/ # 开发工具
│ ├── javac.exe # 编译器
│ ├── java.exe # 启动器
│ ├── jar.exe # 打包工具
│ └── javadoc.exe # 文档生成
├── lib/ # 工具库
│ ├── tools.jar # 工具类库
│ └── ...
├── jre/ # 内置JRE
│ ├── bin/ # JRE可执行文件
│ │ ├── java.exe
│ │ └── ...
│ ├── lib/ # 运行时库
│ │ ├── rt.jar # 核心运行时
│ │ ├── ext/ # 扩展库
│ │ └── ...
│ └── ...
└── include/ # 本地头文件
独立JRE/
├── bin/
│ ├── java.exe
│ └── ...
└── lib/
├── rt.jar
├── charsets.jar
└── ...
基础编译运行
# 编译Java文件
javac -d classes -sourcepath src src/com/example/Main.java
# 运行程序
java -cp classes com.example.Main
# 打包JAR文件
jar cvf myapp.jar -C classes .
# 运行JAR文件
java -jar myapp.jar
类路径详细配置
# 复杂类路径配置
java -cp "lib/*:classes:config" com.example.Main
# 设置系统属性
java -Ddatabase.url=jdbc:mysql://localhost:3306/app
-Dlog.level=DEBUG
-cp myapp.jar com.example.Main
# 内存配置
java -Xms512m -Xmx1024m -XX:MaxPermSize=256m -jar myapp.jar
# 基础环境变量(与之前类似)
export JAVA_HOME=/opt/jdk-11.0.2
export PATH=$JAVA_HOME/bin:$PATH
# 模块路径配置
export MODULE_PATH=/opt/app/modules
模块化编译和运行
# 编译模块
javac -d mods/com.example
--module-source-path src
src/com.example/module-info.java
src/com.example/com/example/Main.java
# 运行模块
java --module-path mods -m com.example/com.example.Main
# 打包模块化JAR
jar --create --file=lib/com.example.jar
--main-class=com.example.Main
-C mods/com.example .
# 分析依赖
jdeps --ignore-missing-deps --module-path libs -s myapp.jar
# 创建最小运行时
jlink --verbose
--add-modules java.base,java.sql,java.xml,java.logging
--compress=2
--strip-debug
--no-header-files
--no-man-pages
--output /opt/myapp-runtime
# 使用自定义运行时运行
/opt/myapp-runtime/bin/java -m com.example
# 安装SDKMAN
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
# 列出可用版本
sdk list java
# 安装多个版本
sdk install java 8.0.392-tem
sdk install java 11.0.21-tem
sdk install java 17.0.9-tem
sdk install java 21.0.1-tem
# 切换版本
sdk use java 11.0.21-tem
sdk default java 17.0.9-tem # 设置默认版本
# 多阶段构建示例
FROM eclipse-temurin:17-jdk as builder
WORKDIR /app
COPY . .
RUN ./gradlew build
FROM eclipse-temurin:17-jre as runtime
WORKDIR /app
COPY --from=builder /app/build/libs/myapp.jar .
USER nobody
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app/myapp.jar"]
# 创建应用镜像
jpackage --name MyApplication
--module-path mods
--module com.example/com.example.Main
--type app-image
--output dist
# 创建安装包
jpackage --name MyApplication
--app-image dist/MyApplication
--type msi # Windows
--type dmg # macOS
--type deb # Linux Debian
--output installers
推荐版本:JDK 17 LTS 或 JDK 21 LTS
理由:
TensorFlow、PyTorch Java API对LTS版本支持最好稳定的GC和性能特性容器化支持完善配置示例:
# AI环境专用配置
export JAVA_OPTS="-Xmx8g -Xms4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
export JAVA_TOOL_OPTIONS="-Dai.model.path=/models -Dpreload.models=true"
# 深度学习应用启动
java $JAVA_OPTS
-Dai.framework=tensorflow
-Dcuda.visible.devices=0,1
-jar ai-service.jar
推荐版本:JDK 8u392 或 JDK 11 LTS
理由:
大量遗留系统基于JDK 8稳定性经过长期验证第三方库兼容性最好配置示例:
# 电商系统JVM配置
export CATALINA_OPTS="-server -Xmx4096m -Xms4096m
-XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly -XX:+DisableExplicitGC
-Dfile.encoding=UTF-8 -Duser.timezone=Asia/Shanghai"
# 传统Web应用部署
java $CATALINA_OPTS
-Dspring.profiles.active=production
-Ddubbo.registry.address=zookeeper://127.0.0.1:2181
-jar ecommerce-app.jar
推荐版本:JDK 17 LTS 或 JDK 21 LTS
理由:
更好的容器支持更小的内存占用更快的启动速度配置示例:
# 云原生JVM配置
export JAVA_OPTS="-XX:+UseContainerSupport
-XX:MaxRAMPercentage=75.0
-XX:+UseG1GC
-XX:MaxGCPauseMillis=100
-XshowSettings:vm
-Djava.security.egd=file:/dev/./urandom"
# 使用jlink创建最小运行时
jlink --add-modules java.base,java.logging,java.sql,java.naming
--output /opt/service-runtime
--strip-debug
--no-man-pages
--compress=2
推荐版本:JDK 8u392 或 JDK 11 LTS
理由:
极致的稳定性要求低延迟GC调优经验丰富监管合规要求配置示例:
# 低延迟交易系统配置
export JAVA_OPTS="-server -Xmx2g -Xms2g
-XX:+UseParallelGC -XX:ParallelGCThreads=4
-XX:+UseLargePages -XX:LargePageSizeInBytes=2m
-XX:+DisableExplicitGC -Djava.awt.headless=true
-XX:+PrintGC -XX:+PrintGCDetails -Xloggc:/logs/gc.log"
java $JAVA_OPTS
-Dtrading.env=production
-Drisk.check.enabled=true
-jar trading-engine.jar
# 云原生微服务配置示例
JAVA_OPTS: >
-XX:+UseContainerSupport
-XX:MaxRAMPercentage=75.0
-XX:+UseG1GC
-XX:MaxGCPauseMillis=100
-XX:+UnlockExperimentalVMOptions
-XshowSettings:vm
-Djava.security.egd=file:/dev/./urandom
-Dspring.profiles.active=cloud
-Dmanagement.endpoints.web.exposure.include=health,metrics,info
FROM eclipse-temurin:17-jre
WORKDIR /app
COPY target/*.jar app.jar
USER 1001:1001
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=3s
CMD curl -f http://localhost:8080/actuator/health || exit 1
ENTRYPOINT ["java", "-jar", "/app/app.jar"]
# 大数据作业JVM配置
export HADOOP_OPTS="-Xmx8g -Xms8g -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
export SPARK_DRIVER_OPTS="-Xmx4g -XX:+UseG1GC -Dspark.serializer=org.apache.spark.serializer.KryoSerializer"
export SPARK_EXECUTOR_OPTS="-Xmx8g -XX:+UseG1GC -XX:InitiatingHeapOccupancyPercent=35"
# Flink作业配置
java -Xmx16g -Xms16g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=150
-Dtaskmanager.memory.process.size=16g
-Dparallelism.default=32
-jar flink-job.jar
<!-- server.xml 连接器配置 -->
<Connector port="8080" protocol="HTTP/1.1"
maxThreads="1000"
minSpareThreads="100"
maxConnections="10000"
connectionTimeout="20000"
acceptorThreadCount="2"
processorCache="2000"/>
<!-- setenv.sh JVM配置 -->
export CATALINA_OPTS="-server -Xmx4g -Xms4g
-XX:+UseG1GC -XX:MaxGCPauseMillis=100
-XX:+ParallelRefProcEnabled
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/logs/heapdump.hprof
-Djava.awt.headless=true
-Dfile.encoding=UTF-8"
# application-production.properties
server.tomcat.max-threads=1000
server.tomcat.min-spare-threads=100
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=10
# JVM参数
-Dspring.jmx.enabled=false
-Dspring.main.lazy-initialization=true
-Dmanagement.metrics.export.prometheus.enabled=true
# GPU加速的AI服务配置
export JAVA_OPTS="-Xmx12g -Xms4g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:MaxDirectMemorySize=4g
-Dai.gpu.enabled=true
-Dcuda.visible.devices=0,1
-Dtensorflow.parallel.inference=true
-Dmodel.cache.size=2000"
# 启动AI推理服务
java $JAVA_OPTS
-Dmodel.path=/models/ensemble
-Dpreprocessing.threads=8
-Dpostprocessing.batch.size=64
-jar ai-inference-service.jar
# 交易引擎JVM配置
export TRADING_OPTS="-server -Xmx2g -Xms2g
-XX:+UseParallelGC
-XX:ParallelGCThreads=4
-XX:+UseLargePages
-XX:LargePageSizeInBytes=2m
-XX:+DisableExplicitGC
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:/logs/gc_trading.log
-Djava.net.preferIPv4Stack=true
-Dtrading.engine.mode=latency
-Dorder.process.batch.size=1000"
# 风险控制系统配置
export RISK_OPTS="-Xmx8g -Xms8g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=50
-XX:InitiatingHeapOccupancyPercent=35
-Drisk.calculation.parallel=true
-Dmarket.data.cache.size=100000"
# 适用于移动应用的配置
JAVA_OPTS: >
-Xmx1g
-Xms512m
-XX:+UseG1GC
-XX:MaxGCPauseMillis=150
-Dserver.compression.enabled=true
-Dserver.compression.mime-types=application/json,text/html,application/javascript
-Dspring.resources.cache.cachecontrol.max-age=3600
-Dapi.rate.limit.enabled=true
-Dmobile.response.size.limit=100kb
# 移动API专用配置
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
spring.resources.chain.compressed=true
spring.jackson.default-property-inclusion=non_null
# 安全配置
security.jwt.token.expire-length=3600000
security.cors.allowed-origins=https://app.example.com
# 创建最小化运行时
jlink --add-modules java.base,java.logging,java.net.http,java.sql
--strip-debug
--no-man-pages
--no-header-files
--compress=2
--output /opt/edge-runtime
# 边缘应用JVM配置
export EDGE_OPTS="-Xmx256m -Xms128m
-XX:+UseSerialGC
-XX:MaxRAM=512m
-Dedge.device.id=DEVICE_001
-Dsensor.data.batch.size=100
-Dnetwork.reconnect.interval=30"
# 区块链节点JVM配置
export BLOCKCHAIN_OPTS="-Xmx4g -Xms2g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:MaxDirectMemorySize=1g
-Dblockchain.encryption.provider=BC
-Dweb3j.http.timeout=30000
-Dfabric.chaincode.verbose=true
-Dcrypto.secure.random.algorithm=NativePRNG"
# 游戏服务器优化配置
export GAME_OPTS="-Xmx8g -Xms4g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=50
-XX:G1NewSizePercent=30
-XX:G1MaxNewSizePercent=40
-XX:G1HeapRegionSize=16m
-Dgame.tick.rate=60
-Dnetwork.io.threads=8
-Dplayer.session.timeout=300
-Dworld.save.interval=300"
# 企业应用服务器配置
export ERP_OPTS="-Xmx12g -Xms4g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:InitiatingHeapOccupancyPercent=45
-Doracle.jdbc.fanEnabled=false
-Dsap.jco.thread_safe=true
-Dreport.generation.memory=2g
-Dbatch.processing.chunk.size=1000"
| 特性 | JDK 8 | JDK 11 LTS | JDK 17 LTS | JDK 21 LTS |
|---|---|---|---|---|
| 支持截止 | 2030* | 2026* | 2029* | 2031* |
| 模块化 | ❌ | ✅ | ✅ | ✅ |
| JRE独立 | ✅ | ❌ | ❌ | ❌ |
| 容器支持 | ⚠️ 基础 | ✅ 良好 | ✅ 优秀 | ✅ 优秀 |
| 性能 | 基准 | +15% | +30% | +40% |
| 内存占用 | 高 | 中 | 低 | 很低 |
| 启动速度 | 慢 | 中 | 快 | 很快 |
| AI场景 | ⚠️ 兼容 | ✅ 推荐 | ✅ 最佳 | ✅ 最新 |
| 传统电商 | ✅ 最佳 | ✅ 推荐 | ⚠️ 迁移 | ⚠️ 迁移 |
| 云原生 | ❌ 不推荐 | ✅ 可用 | ✅ 推荐 | ✅ 最佳 |
| 金融系统 | ✅ 稳定 | ✅ 推荐 | ⚠️ 测试 | ⚠️ 评估 |
*注:具体支持时间因供应商而异
#!/bin/bash
# java-environment-check.sh
echo "=== Java环境完整性检查 ==="
# 检查Java安装
if command -v java &> /dev/null; then
echo "✓ Java已安装: $(java -version 2>&1 | head -n1)"
else
echo "✗ Java未安装"
exit 1
fi
# 检查JAVA_HOME
if [ -n "$JAVA_HOME" ]; then
echo "✓ JAVA_HOME: $JAVA_HOME"
else
echo "✗ JAVA_HOME未设置"
fi
# 检查编译器
if command -v javac &> /dev/null; then
echo "✓ Java编译器可用"
else
echo "✗ Java编译器不可用"
fi
# 检查关键目录
if [ -d "$JAVA_HOME/jre" ]; then
echo "✓ 传统JRE结构存在"
else
echo "ℹ 现代JDK结构"
fi
echo "=== 检查完成 ==="
# 兼容性检查工具使用
jdeps --jdk-version 11 --ignore-missing-deps -s legacy-app.jar
# 检查废弃API使用
javac -Xlint:deprecation src/**/*.java
# 模块化兼容性检查
jdeps --multi-release 11 --print-module-deps legacy-app.jar
JAVA_HOME:JDK(Java开发工具包)安装在哪里。
JRE_HOME:JRE(Java运行时环境)安装在哪里。
CLASSPATH:当Java虚拟机(JVM)需要执行一个类时,应该去哪些目录和Jar包里寻找。
JAVA_HOME=D:ApplicationJavajdk8u411
JAVA_HOME变量值:
D:ApplicationJavajdk8u411
javac,
java,
jar)和库。为其他工具提供基础路径:
很多基于Java开发的应用程序(如Apache Tomcat, Maven, Gradle, IntelliJ IDEA)在启动时都需要知道JDK的位置。它们会通过读取
JAVA_HOME 变量来定位。例如,Tomcat启动脚本会使用
%JAVA_HOME%injava.exe 来启动JVM。
简化命令行操作:
虽然不直接依赖它,但设置了
JAVA_HOME 后,可以在命令行中方便地引用其子目录。例如,
%JAVA_HOME%injavac。
方便管理多版本JDK:
当你需要切换不同版本的JDK时,只需修改
JAVA_HOME 的值指向新的路径即可,而无需改动系统的
PATH 变量。
JRE_HOME=D:ApplicationJavajre8u411
JRE_HOME变量值:
D:ApplicationJavajre8u411
javac)等开发工具。为某些特定应用服务:
一些只需要运行Java程序而不需要开发功能的应用程序,可能会优先查找
JRE_HOME 而不是
JAVA_HOME。在一些旧的或者特定的服务器配置中(如某些版本的Tomcat),可能会明确要求设置
JRE_HOME。
与JDK分离:从JDK 9开始,Oracle不再提供独立的JRE安装包,JDK本身就包含了完整的JRE,因此只设置
JAVA_HOME 指向JDK即可。
CLASSPATH=.;%JAVA_HOME%lib ools.jar;%JAVA_HOME%libdt.jar;%JRE_HOME%lib
t.jar;%JRE_HOME%libplugin.jar
. (英文句点):
java MyClass 时,JVM会首先在当前你所在的目录下寻找
MyClass.class 文件。
%JAVA_HOME%lib ools.jar:
javac(编译器)、
javadoc(文档生成器)、
javap(反编译器)等。在编译时,
javac 需要这个jar包。现代情况:从JDK 9开始,由于模块化的引入,
tools.jar 已被移除。其内容被整合到了JDK的模块中。所以这个配置对JDK 9及以上版本无效。
%JAVA_HOME%libdt.jar:
dt.jar 是 “DesignTime” 的缩写,它包含了Swing GUI组件的BeanInfo文件,用于IDE(如Eclipse)在图形化设计界面时获取组件的属性、事件等信息。现代情况:对于普通的Java程序运行和编译,通常不需要它。它主要用于开发环境。同样,在JDK 9+ 中已被移除。
%JRE_HOME%lib
t.jar:
rt.jar 是 “Runtime” 的缩写,它是Java基础类库(Java SE API)的核心。包含了
java.lang,
java.util,
java.io,
java.net,
java.sql 等所有核心包。重要性:在JDK 8及以前,这是最关键的jar包,没有它,任何Java程序都无法运行。JVM会自动加载它。现代情况:从JDK 9开始,
rt.jar 也被移除了,类库被模块化到了
jmods 目录中。
%JRE_HOME%libplugin.jar:
PATH 环境变量的这个设置。
PATH=%PATH%;%JAVA_HOME%in;%JRE_HOME%in
%PATH%
PATH 环境变量的作用,是告诉操作系统,当你在命令行(如CMD、PowerShell)或终端中输入一个命令(如
javac,
java,
notepad,
python)时,应该去哪些目录下寻找这个命令对应的可执行文件(
.exe,
.bat,
.com 等)。
%PATH% 是一个变量引用,它代表了当前系统PATH变量中已有的所有路径。在设置新值时,首先写上
%PATH%,意味着将旧有的所有路径列表包含进来。如果你不这样做,而是直接设置为
%JAVA_HOME%in...,那么系统之前所有配置的路径(比如Python、Git、Node.js的命令路径)都会丢失,导致那些命令无法在命令行中直接运行。这是一个常见的错误。
%JAVA_HOME%in
%JAVA_HOME% 引用了你之前设置的JDK根目录,比如
D:ApplicationJavajdk8u411。
bin 是 “binary”(二进制)的缩写,这个目录包含了JDK所有的核心开发工具和可执行文件。将这个路径(例如
D:ApplicationJavajdk8u411in)加入
PATH 后,你就可以在任何目录下的命令行中直接使用这些工具,而无需输入它们的完整路径。关键命令包括:
javac:Java编译器,用于将
.java 源文件编译成
.class 字节码文件。
java:Java应用程序启动器,用于运行编译后的
.class 文件。
jar:用于创建和管理JAR(Java Archive)文件的工具。
javadoc:根据源代码生成API文档。
jdb:Java调试器。
示例:
未设置前:你必须在
D:ApplicationJavajdk8u411in 目录下才能执行
javac 命令,或者输入完整路径
D:ApplicationJavajdk8u411injavac MyClass.java。设置后:你可以在
C:UsersYourName 或
D:MyProject 等任何目录下,直接输入
javac MyClass.java。
%JRE_HOME%in
%JRE_HOME% 引用了你之前设置的JRE根目录,比如
D:ApplicationJavajre8u411。这个目录下的
bin 文件夹主要包含 Java运行时环境 的核心可执行文件,最重要的是
java.exe(和
javaw.exe,用于启动不带控制台的GUI程序)。
为什么有时需要它?
在某些配置下,如果系统或应用程序(如Tomcat)没有正确找到
JAVA_HOME 下的
java 命令,它会尝试从
JRE_HOME 的
bin 目录中寻找。它确保了最基本的Java运行命令(
java)在系统的任何位置都可用。
现代情况与最佳实践:
对于JDK 8及以前:这个设置是合理的,因为JDK和JRE是分开安装的。JDK自带的JRE在
%JAVA_HOME%jrein 目录下。对于JDK 9及以后:这个路径通常不再需要。因为:
JDK和JRE不再分离,JDK本身就是一个完整的运行时环境。JDK的
bin 目录(即
%JAVA_HOME%in)已经包含了所有必要的可执行文件,包括
java 命令。因此,在现代Java开发中,通常只需将
%JAVA_HOME%in 加入
PATH 即可。