Azure DevOps JDK17配置问题:JavaToolInstaller报错与运行环境不兼容
Azure DevOps流水线JDK17配置问题解决方案
问题概述
- 手动安装JDK17后,后续Bash任务仍默认使用JDK11,运行Spring Boot Jar时触发
UnsupportedClassVersionError(类文件版本61.0对应JDK17,当前JDK11仅支持到55.0) - 使用JavaToolInstaller安装JDK17时,提示“指定的JDK源文件扩展名不被支持”,版本更新操作无效
Bash任务错误日志
Starting: Bash ============================================================================== Task : Bash Description : Run a Bash script on macOS, Linux, or Windows Version : 3.244.1 Author : Microsoft Corporation Help : https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/bash ============================================================================== Generating script. ========================== Starting Command Output =========================== /usr/bin/bash /home/vsts/work/_temp/96124f0c-8298-4b37-815e-c653e4b5db03.sh openjdk version "11.0.24" 2024-07-16 OpenJDK Runtime Environment Temurin-11.0.24+8 (build 11.0.24+8) OpenJDK 64-Bit Server VM Temurin-11.0.24+8 (build 11.0.24+8, mixed mode) Listing files in target directory: total 32756 drwxr-xr-x 2 vsts docker 4096 Sep 5 12:23 . drwxr-xr-x 3 vsts docker 4096 Sep 5 12:23 .. -rw-r--r-- 1 vsts docker 33533344 Sep 5 12:23 ASD-0.0.1-SNAPSHOT.jar Running the Spring Boot application... Error: LinkageError occurred while loading main class org.springframework.boot.loader.launch.JarLauncher java.lang.UnsupportedClassVersionError: org/springframework/boot/loader/launch/JarLauncher has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0 ##[error]Bash exited with code '1'. Finishing: Bash
JavaToolInstaller错误日志
Starting: JavaToolInstaller ============================================================================== Task : Java tool installer Description : Acquire a specific version of Java from a user-supplied Azure blob or the tool cache and sets JAVA_HOME Version : 0.245.3 Author : Microsoft Corporation Help : https://docs.microsoft.com/azure/devops/pipelines/tasks/tool/java-tool-installer ============================================================================== Cleaning destination folder before extraction: /home/vsts/work/1/s Retrieving the JDK from local path. ##[error]Specified JDK source file does not have a supported file extension. ##[error]Specified JDK source file does not have a supported file extension. Finishing: JavaToolInstaller
解决方案
手动安装JDK17后后续任务不生效的问题
Azure DevOps每个任务都是独立进程,手动安装JDK17后,需在后续任务中显式指定JDK路径或更新环境变量:
- 直接使用JDK17绝对路径执行命令:
/usr/lib/jvm/java-17-openjdk-amd64/bin/java -version /usr/lib/jvm/java-17-openjdk-amd64/bin/java -jar $(Build.ArtifactStagingDirectory)/target/ASD-0.0.1-SNAPSHOT.jar
- 临时更新PATH环境变量:
export PATH=/usr/lib/jvm/java-17-openjdk-amd64/bin:$PATH java -version java -jar $(Build.ArtifactStagingDirectory)/target/ASD-0.0.1-SNAPSHOT.jar
更规范的做法是用JavaToolInstaller统一管理JDK版本,避免环境隔离问题。
JavaToolInstaller报错的问题
报错原因是指定的JDK源文件格式不被支持,该任务仅支持.zip、.tar.gz、.tar.bz2等压缩格式JDK包,推荐使用工具缓存安装:
- task: JavaToolInstaller@0 inputs: versionSpec: '17' jdkArchitectureOption: 'x64' jdkSourceOption: 'PreInstalled'
若需自定义源安装,确保路径指向正确的压缩包文件:
- task: JavaToolInstaller@0 inputs: versionSpec: '17' jdkArchitectureOption: 'x64' jdkSourceOption: 'AzureStorage' azureResourceManagerEndpoint: '<你的ARM服务连接>' azureStorageAccountName: '<存储账户名>' azureContainerName: '<容器名>' azureCommonVirtualFile: '<JDK压缩包路径,如jdk-17.tar.gz>'
修正后的完整流水线YAML
trigger: - master pool: vmImage: 'ubuntu-latest' steps: # 使用JavaToolInstaller安装JDK17并配置环境变量 - task: JavaToolInstaller@0 inputs: versionSpec: '17' jdkArchitectureOption: 'x64' jdkSourceOption: 'PreInstalled' - task: Maven@4 inputs: mavenPomFile: 'pom.xml' mavenOptions: '-Xmx1024m' javaHomeOption: 'JDKVersion' jdkVersionOption: '1.17' goals: 'clean package' # 复制JAR到 staging 目录 - task: CopyFiles@2 inputs: contents: '**/target/*.jar' targetFolder: '$(Build.ArtifactStagingDirectory)' # 发布构建产物 - task: PublishBuildArtifacts@1 inputs: pathToPublish: '$(Build.ArtifactStagingDirectory)' artifactName: 'drop' # 运行Spring Boot应用 - task: Bash@3 inputs: targetType: 'inline' script: | java -version echo "列出target目录文件:" ls -al $(Build.ArtifactStagingDirectory)/target echo "启动Spring Boot应用..." java -jar $(Build.ArtifactStagingDirectory)/target/ASD-0.0.1-SNAPSHOT.jar
内容的提问来源于stack exchange,提问作者plasma pup
相关产品推荐
相关产品推荐

