﻿# Azure Pipelines 如何指定 IBM Java SDK 8.0 為主要的 JDK 版本

雖然 Azure Pipelines 提供的 [Microsoft-hosted agents](https://learn.microsoft.com/en-us/azure/devops/pipelines/agents/hosted?view=azure-devops&tabs=yaml&WT.mc_id=DT-MVP-4015686) 大多已經內建了 Adopt OpenJDK 8.0/11.0/13.0 版本可供選擇，但是我們最近有個案子，客戶指定要用 IBM Java SDK 8.0 為主要的 JDK 版本，所以就需要額外下載與設定才能使用。本篇文章將說明完整的設定方法。

### 指定 JDK 版本的方法

由於 Azure Pipelines 提供的 [Microsoft-hosted agents](https://learn.microsoft.com/en-us/azure/devops/pipelines/agents/hosted?view=azure-devops&tabs=yaml&WT.mc_id=DT-MVP-4015686) 已經內建了三個版本的 Adopt OpenJDK，你可以從 [Microsoft-hosted agents](https://learn.microsoft.com/en-us/azure/devops/pipelines/agents/hosted?view=azure-devops&tabs=yaml&WT.mc_id=DT-MVP-4015686) 頁面得知每一個不同 Agents 的內建軟體清單：

| Image | Classic Editor Agent Specification | YAML VM Image Label | Included Software |
| --- | --- | --- | --- |
| Windows Server 2022 with Visual Studio 2022 | `windows-2022` | `windows-2022` | [Link](https://github.com/actions/runner-images/blob/main/images/windows/Windows2022-Readme.md) |
| Windows Server 2019 with Visual Studio 2019 | `windows-2019` | `windows-2019` OR `windows-latest` | [Link](https://github.com/actions/runner-images/blob/eee63d18fc0ad31ddefe99ed3a8a489bed1f4735/images/win/Windows2019-Readme.md) |
| ~~Windows Server 2016 with Visual Studio 2017~~ | `vs2017-win2016` | `vs2017-win2016` | [Link](https://github.com/actions/runner-images/blob/af8332e66d6fc43f786eba49c0d7480c5f9de1b8/images/win/Windows2016-Readme.md) |
| Ubuntu 20.04 | `ubuntu-20.04` | `ubuntu-latest` OR `ubuntu-20.04` | [Link](https://github.com/actions/runner-images/blob/bcce0b93c0814c63b3ce10a85a74f5ca9c86a273/images/linux/Ubuntu2004-README.md) |
| Ubuntu 18.04 | `ubuntu-18.04` | `ubuntu-18.04` | [Link](https://github.com/actions/runner-images/blob/f2749792079582f58ed6b69160ced9fbc4ec2f8b/images/linux/Ubuntu1804-README.md) |
| ~~Ubuntu 16.04~~ | `ubuntu-16.04` | `ubuntu-16.04` | [Link](https://github.com/actions/runner-images/blob/70582d170c511d81feb135457b90375180fd264a/images/linux/Ubuntu1604-README.md) |
| macOS 11 Big Sur | `macOS-10.14` | `macOS-11` OR `macOS-latest` | [Link](https://github.com/actions/runner-images/blob/3be6d05f1be1509cac40948609610177c9877d90/images/macos/macos-10.14-Readme.md) |
| macOS X Catalina 10.15 | `macOS-10.15` | `macOS-10.15` | [Link](https://github.com/actions/runner-images/blob/f99bf07949f0f697d7589514a7da1f9978a526d8/images/macos/macos-10.15-Readme.md) |
| ~~macOS X Mojave 10.14~~ | `macOS-10.14` | `macOS-10.14` | [Link](https://github.com/actions/runner-images/blob/3be6d05f1be1509cac40948609610177c9877d90/images/macos/macos-10.14-Readme.md) |

單就 Java 相關的軟體，`windows-2019` 就包含了以下 4 個不同版本的 OpenJDK，也設定好了三個不同的環境變數，讓你可以自由切換：

| Version | Vendor | Environment Variable |
| --- | --- | --- |
| `8.0.312+7` (default) | Eclipse Temurin | `JAVA_HOME_8_X64` |
| `11.0.13+8` | Eclipse Temurin | `JAVA_HOME_11_X64` |
| `13.0.2+8.1` | Adopt OpenJDK | `JAVA_HOME_13_X64` |
| `17.0.1+12` | Eclipse Temurin | `JAVA_HOME_17_X64` |

預設 Microsoft-hosted agents 也會幫你設定好 `JAVA_HOME` 環境變數，所以預設你的建置環境就會有 `Adopt OpenJDK 8.0.312+7` 為你主要的 JDK 環境！

要更換 JDK 版本其實很簡單，基本上就兩個條件：

1.  指定正確的 `JAVA_HOME` 環境變數
2.  設定正確的 `PATH` 環境變數可預設指向正確的 Java 工具組路徑

假設我們要在 Pipeline 執行的中間設定這兩個環境變數，你可以有以下 3 種選擇：

-   新增一個 **Windows PowerShell** 工作 (Windows)
    
    ```powershell
    echo '##vso[task.setvariable variable=JAVA_HOME]$(JAVA_HOME_17_X64)'
    echo '##vso[task.prependpath]$(JAVA_HOME_17_X64)\bin'
    ```
    
-   新增一個 **Command line** 工作 (`cmd.exe` on Windows)
    
    ```batch
    echo ##vso[task.setvariable variable=JAVA_HOME]$(JAVA_HOME_17_X64)
    echo ##vso[task.prependpath]$(JAVA_HOME_17_X64)\bin
    ```
    
    > 注意：千萬不要加上雙引號在 `echo` 後方的字串，否則路徑會有問題！我被這個細節雷到過！💥
    
-   新增一個 **Command line** 工作 (`Bash` on Linux/macOS)
    
    ```bash
    echo '##vso[task.setvariable variable=JAVA_HOME]$(JAVA_HOME_17_X64)'
    echo '##vso[task.prependpath]$(JAVA_HOME_17_X64)\bin'
    ```
    

### 指定 IBM Java SDK 8.0 版本的方法

要在 [Microsoft-hosted agents](https://learn.microsoft.com/en-us/azure/devops/pipelines/agents/hosted?view=azure-devops&tabs=yaml&WT.mc_id=DT-MVP-4015686) 安裝與設定沒有內建的 JDK 版本，就需要每次都下載 JDK 檔案，並設定好 `JAVA_HOME` 與 `PATH` 環境變數。

以下是設定的三個步驟：

1.  下載 IBM Java SDK 80
    
    我將檔案上傳到與 Azure DevOps 組織相同 **地區**(Region) 的 **Azure 儲存體帳戶** (Storage account)，如此一來才能節省頻寬支出，因為 Azure Storage 的流量費用在相同地區內是**完全免費**的，這點非常重要！🔥
    
    像我的 Azure DevOps 組織就落在 `East US 2` 這個地區，所以我就特別到 Azure 建立一個也在 `East US 2` 地區的 Storage account！
    
    ```bash
    curl.exe -s https://xxxxx.blob.core.windows.net/cicd/ibm_sdk80.zip -o "$(Agent.ToolsDirectory)\ibm_sdk80.zip"
    ```
    
2.  解壓縮 IBM Java SDK 80 到 $(Agent.ToolsDirectory) 目錄下
    
    新增 **Extract files** 工作，並設定以下參數：
    
    ```yaml
    steps:
    - task: ExtractFiles@1
      displayName: '解壓縮 IBM Java SDK 80 到 $(Agent.ToolsDirectory)'
      inputs:
        archiveFilePatterns: '$(Agent.ToolsDirectory)\ibm_sdk80.zip'
        destinationFolder: '$(Agent.ToolsDirectory)'
        cleanDestinationFolder: false
    ```
    
    > 注意：我的 `ibm_sdk80.zip` 壓縮檔中的第一層只有 `ibm_sdk80` 一個資料夾，所以解壓縮的時候可以直接輸出到 `$(Agent.ToolsDirectory)` 目錄。
    
3.  設定 JAVA\_HOME 與 PATH 環境變數
    
    ```bash
    echo ##vso[task.setvariable variable=JAVA_HOME]$(Agent.ToolsDirectory)\ibm_sdk80
    echo ##vso[task.prependpath]$(Agent.ToolsDirectory)\ibm_sdk80\bin
    ```
    

### 相關連結

-   [Java SDK downloads, version 8.0](https://www.ibm.com/support/pages/java-sdk-downloads-version-80)
-   [Microsoft-hosted agents for Azure Pipelines - Azure Pipelines | Microsoft Docs](https://learn.microsoft.com/en-us/azure/devops/pipelines/agents/hosted?view=azure-devops&tabs=yaml&WT.mc_id=DT-MVP-4015686)
