Azure DevOps パイプラインで Maven を使用して Java 17 をコンパイルする


Azure DevOps パイプラインで ubuntu-latest マシンを使用すると、現在、11 以降のバージョンはサポートされていません.そのため、Maven@3 タスクを使用して新しいバージョンを使用してコンパイルすることはできません.回避策は、コンテナー バージョンの Maven を使用することです.

jobs:
  # build uberjar
  - job: ${{ parameters.jobName }}
    pool:
      vmImage: ubuntu-latest
    container: maven:3.8.1-openjdk-17-slim
    variables:
      - name: JAVA_HOME_11_X64
        value: /usr/local/openjdk-17
    steps:
      - template: steps-prepare-maven.yml
      - task: Maven@3
        displayName: build ${{ parameters.moduleName }} uberJar 
        inputs:
          mavenPomFile: pom.xml
          mavenOptions: -Xmx3072m $(MavenOpts)
          javaHomeSelection: 'path'
          jdkDirectory: '/usr/local/openjdk-17'
          publishJUnitResults: true
          testResultsFiles: "**/surefire-reports/TEST-*.xml"
          effectivePomSkip: true
          goals: -P production -pl ${{ parameters.moduleName }} -am $(MavenOpts) -Dmaven.test.skip=${{ parameters.skipTests }} $(BuildGoal)

openjdk-17 を使用しており、明示的に javaHomeSelectionjdkDirectory を使用して、コンテナが JDK を置く場所と一致するように JAVA_HOME を設定しています.

では、なぜ環境変数 JAVA_HOME_11_X64 も定義しているのでしょうか?さて、コンテナ設定の外で使用される再利用可能なテンプレートがあります.たとえば、steps-prepare-maven.yml ファイルは、プロジェクト シークレットを使用して settings.xml ファイルを作成し、ビルド パラメーターに基づいてリビジョンを更新するテンプレートです.Windows ジョブでも使用します.このような手順では、デフォルト バージョンの Java 11 が使用されます.コンテナー内で実行する場合、JAVA_HOME_11_X64 が優先され、再利用可能なテンプレートの Maven 手順が正しく機能します.

これはテンプレート ファイルから抽出されたもので、パラメーターを必要なものに置き換えます.

クレジット: sfragata の answer から github の問題が始まりました.その後、環境変数を使用して含まれているテンプレートを修正できるようになるまで、つまずきました.