GitHub Actions缓存Java17后显示1.8,如何正确缓存指定版本?
解决GitHub Actions中Java缓存后版本不匹配的问题
问题现象
脚本第二次运行触发缓存后,缓存的是Java 17版本,但执行java -version显示为1.8:
openjdk version "1.8.0_352" OpenJDK Runtime Environment (Temurin)(build 1.8.0_352-b08) OpenJDK 64-Bit Server VM (Temurin)(build 25.352-b08, mixed mode)
问题根源
- PATH配置错误:手动设置PATH时仅添加了JAVA_HOME根目录,未添加
\bin子目录——Java可执行文件(如java.exe)存放在JAVA_HOME\bin下,系统找不到该路径时会使用默认的Java 1.8。 - 环境变量配置不完整:缓存命中时跳过了
setup-java步骤,而手动硬编码的JAVA_HOME未配合setup-java的自动环境变量配置逻辑,导致Java 17的路径未被正确加入PATH优先级。
解决方案
方案一:使用actions/setup-java自动管理(推荐)
actions/setup-java会自动处理JAVA_HOME和PATH的配置,即使缓存恢复后也能正确识别已安装的JDK,无需手动设置环境变量:
name: dotnet-pipeline on: [push] jobs: build: name: Build-run-analysis runs-on: windows-2022 steps: - name: Cache Microsoft JDK id: cache-jdk uses: actions/cache@v3 with: # 缓存整个Microsoft JDK目录,兼容同大版本的不同小版本 path: C:\hostedtoolcache\windows\Java_Microsoft_jdk # 缓存key包含具体版本,避免不同版本混淆 key: ${{ runner.os }}-microsoft-jdk-17.0.3 restore-keys: | ${{ runner.os }}-microsoft-jdk-17- ${{ runner.os }}-microsoft-jdk- - name: Setup Java 17 uses: actions/setup-java@v3 with: distribution: 'microsoft' java-version: '17' check-latest: false # setup-java会自动检测缓存中的JDK,存在则直接配置环境变量,无需重新下载 - name: Check Java version run: java -version
方案二:修复手动PATH配置(仅作参考)
如果坚持手动管理缓存和环境变量,需修正PATH的配置路径:
name: dotnet-pipeline on: [push] jobs: build: name: Build-run-analysis runs-on: windows-2022 env: JAVA_HOME: 'C:\hostedtoolcache\windows\Java_Microsoft_jdk\17.0.3\x64' JAVA_HOME_17_X64: 'C:\hostedtoolcache\windows\Java_Microsoft_jdk\17.0.3\x64' steps: - name: Cache JDK id: cache-jdk uses: actions/cache@v3 with: path: ${{ env.JAVA_HOME }} key: ${{ runner.os }}-jdk-17 restore-keys: | ${{ runner.os }}-jdk- - name: Install Java if: steps.cache-jdk.outputs.cache-hit != 'true' uses: actions/setup-java@v3 with: distribution: 'microsoft' java-version: '17' check-latest: false - name: Set PATH with Java bin directory run: | # 需添加JAVA_HOME\bin路径,而非根目录 echo "${{ env.JAVA_HOME }}\bin" | Out-File -FilePath $ENV:GITHUB_PATH -Encoding utf8 -Append - name: check version run: java -version
内容的提问来源于stack exchange,提问作者Abubakar Riaz
相关产品推荐
相关产品推荐

