在实际开发工作中,我们经常会遇到同时维护多个Java项目的情况,有的老项目需要Java 8才能正常运行,有的新项目则要求Java 17及以上版本,全局固定一个Java版本显然无法适配所有场景,因此需要掌握项目级Java版本的管理方法。

方案一:通过环境变量临时切换
这种方式适合临时启动单个项目,不需要修改全局配置。我们可以在项目的启动脚本中先设置JAVA_HOME指向对应版本的Java目录,再执行启动命令。
以Linux或macOS系统为例,假设我们有两个不同版本的Java安装路径:
- Java 8路径:/usr/lib/jvm/java-8-openjdk
- Java 17路径:/usr/lib/jvm/java-17-openjdk
项目启动脚本可以这样编写:
#!/bin/bash # 指定当前项目使用的Java版本为Java 8 export JAVA_HOME=/usr/lib/jvm/java-8-openjdk export PATH=$JAVA_HOME/bin:$PATH # 验证Java版本 java -version # 启动项目 java -jar your_project.jar
如果是Windows系统,对应的bat脚本如下:
@echo off REM 指定当前项目使用的Java版本为Java 17 set JAVA_HOME=C:Program FilesJavajdk-17 set PATH=%JAVA_HOME%bin;%PATH% REM 验证Java版本 java -version REM 启动项目 java -jar your_project.jar
方案二:使用sdkman管理多版本
sdkman是一款流行的多版本SDK管理工具,支持Java、Gradle、Maven等多种开发工具的多版本管理,能够很方便地在不同项目间切换Java版本。
安装sdkman
在Linux或macOS系统中执行以下命令安装:
curl -s "https://get.sdkman.io" | bash source "$HOME/.sdkman/bin/sdkman-init.sh"
Windows系统需要先安装Cygwin或WSL,再执行上述安装命令。
安装和切换Java版本
首先列出所有可用的Java版本:
sdk list java
安装指定版本的Java,比如安装Java 8和Java 17:
sdk install java 8.0.392-open sdk install java 17.0.9-open
可以为当前项目指定默认使用的Java版本,在项目根目录下创建.sdkmanrc文件,内容如下:
java=8.0.392-open
进入该目录后执行sdk env install命令,sdkman会自动安装并使用该文件指定的Java版本,执行sdk env可以查看当前生效的版本配置。
方案三:Maven/Gradle项目指定编译运行版本
如果使用Maven或Gradle构建项目,可以在构建配置文件中指定项目使用的Java版本,这种方式不需要手动切换系统环境变量,构建工具会自动使用对应版本的Java。
Maven项目配置
在pom.xml中添加maven-compiler-plugin插件配置,指定源码和目标字节码版本:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<!-- 指定Java源码版本 -->
<source>8</source>
<!-- 指定编译后的字节码版本 -->
<target>8</target>
<!-- 指定使用的Java版本,需要本地已安装对应版本 -->
<release>8</release>
</configuration>
</plugin>
</plugins>
</build>
Gradle项目配置
在build.gradle中添加Java版本配置:
plugins {
id 'java'
}
java {
// 指定Java版本为11
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
tasks.withType(JavaCompile) {
options.release = 11
}
如果使用Gradle 7.0及以上版本,还可以通过toolchain指定自动下载对应版本的Java:
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
各方案对比
我们可以通过下表对比不同方案的适用场景:
| 方案 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 环境变量临时切换 | 临时启动单个项目,不需要频繁切换 | 无需额外安装工具,配置简单 | 每次启动都需要执行脚本,多项目同时运行时容易冲突 |
| sdkman管理 | 多个项目频繁切换版本,需要管理多种SDK | 版本管理方便,支持项目级配置,自动切换 | Windows系统支持不够友好,需要额外安装工具 |
| 构建工具指定 | 使用Maven/Gradle构建的项目,需要统一构建环境 | 配置跟随项目,团队协作时无需额外配置环境 | 仅影响编译和运行,系统全局Java版本仍需要单独管理 |
注意事项
1. 无论使用哪种方案,都需要确保本地已经安装了对应版本的Java,否则会提示找不到Java命令。
2. 如果使用IDE开发,还需要在IDE中配置项目的SDK路径,比如在IntelliJ IDEA中,可以在项目结构设置里指定项目使用的JDK版本,避免IDE编译运行使用的版本和配置的不一致。
3. 不要将JAVA_HOME等环境变量硬编码到系统全局配置中,否则会影响其他项目的运行。
JavaJava_version项目级环境管理sdkman修改时间:2026-06-19 16:57:22