如何在 Azure-pipeline Ubuntu 代理上安装 java 13 并在 Maven 构建期间使用它?

问题描述

我正在尝试构建一个 Java Maven 应用程序并针对 Postgres 数据库运行一些测试。

但是,Java 应用程序使用 JDK 13,而 Azure 托管代理 ubuntu 没有安装此认设置。因此,我使用脚本任务来安装它,然后在 Maven 构建期间使用它。

但是,我尝试了几个配置,并且在所有 Maven 中一直抱怨它找不到任何安装的 JDK 13。

我尝试的最后一个配置列在下面,我通过脚本安装它,然后使用 JavaToolInstaller 任务使其可用(确保设置了 Java_home 并且可以在路径中找到 java。 然后我得到错误

##[error]Java 13 is not preinstalled on this agent

我也试过没有 JavaToolInstaller 任务,然后导出 JAVA_HOME 并修改脚本中的 PATH,但随后 Maven 抱怨它找不到 JDK 13...

请帮助如何在 maven 构建期间在 ubuntu 代理上使用 JDK 13?

Azure 管道片段:

    variables:
    MAVEN_CACHE_FOLDER: $(Pipeline.Workspace)/.m2/repository
    MAVEN_OPTS: "-Dmaven.repo.local=$(MAVEN_CACHE_FOLDER)"
    JAVA_HOME : "/usr/lib/jvm/openjdk-13-jdk"
    PATH: $(JAVA_HOME)/bin:$(PATH)
    service_name: backend
    mygetUsername: myUserName
    mygetpassword: myPassword

resources:
    containers:
        - container: postgres
          image: postgres:11.6-alpine
          ports:
              - 5432:5432
          env:
              POSTGRES_DB: default
              POSTGRES_USER: default
              POSTGRES_PASSWORD: default
              POSTGRES_HOST_AUTH_METHOD: trust


stages:
    - stage: create_artifact
      displayName: Create artifact
      jobs:
          - job: build
            displayName: Build,test and publish artifact
            services:
                postgres: postgres
            steps:
                - script: |
                    sudo apt-get install openjdk-13-jdk  
                  displayName: Installing JDK 13

                - task: JavaToolInstaller@0
                  displayName: Using JDK 13
                  inputs:
                    versionSpec: "13"
                    jdkArchitectureOption: x64
                    jdkSourceOption: "PreInstalled"

                - task: Cache@2
                  displayName: Cache Maven local repo
                  inputs:
                      key: 'maven | "$(Agent.OS)" | backend/pom.xml'
                      restoreKeys: |
                          maven | "$(Agent.OS)"
                          maven
                      path: $(MAVEN_CACHE_FOLDER)
                - task: Maven@3
                  name: maven_package
                  displayName: Maven package
                  inputs:
                      goals: "package"
                      mavenPomFile: "backend/pom.xml"
                      options: '--settings backend/.mvn/settings.xml -DmygetUsername=$(mygetUsername) -Dmygetpassword=$(mygetpassword)'
                      mavenoptions: "-Xmx3072m $(MAVEN_OPTS)"
                      javaHomeOption: "JDKVersion"
                      jdkVersionoption: "1.13"
                      mavenAuthenticateFeed: true

解决方法

“预安装”功能允许您使用预安装在 Microsoft 托管代理上的 Java 版本。您可以在 Software section 中找到可用的 Java 预安装版本:

enter image description here

我认为您的脚本无法在托管机器上运行。而且,您指定的 JDK 版本不在您的主机上。我建议您按照上表设置您的主机(按照安装的预定义 JDK)。

因此,可以利用其他两个选项:

这是从 Linux 上的本地目录获取存档文件的示例。该文件应该是 .zip 目录的存档(.gzJAVA_HOME),以便它包含 binlibincludejre 等目录。

 - task: JavaToolInstaller@0
    inputs:
      versionSpec: "11"
      jdkArchitectureOption: x64
      jdkSourceOption: LocalDirectory
      jdkFile: "/builds/openjdk-11.0.2_linux-x64_bin.tar.gz"
      jdkDestinationDirectory: "/builds/binaries/externals"
      cleanDestinationDirectory: true

以下是从 Azure 存储下载存档文件的示例。该文件应该是 .zip 目录的存档(.gzJAVA_HOME),以便它包含 binlibincludejre 等目录。

- task: JavaToolInstaller@0
  inputs:
    versionSpec: '6'
    jdkArchitectureOption: 'x64'
    jdkSourceOption: AzureStorage
    azureResourceManagerEndpoint: myARMServiceConnection
    azureStorageAccountName: myAzureStorageAccountName
    azureContainerName: myAzureStorageContainerName
    azureCommonVirtualFile: 'jdk1.6.0_45.zip'
    jdkDestinationDirectory: '$(agent.toolsDirectory)/jdk6'
    cleanDestinationDirectory: false
,

问题是我指向了错误的安装目录。 上面的JAVA_HOME位置是我在网上找到的,在输出/usrl/lib/jvm的树内容后我改了一下,把它加到变量部分,maven找到了jdk并使用了?

JAVA_HOME_13_X64 : "/usr/lib/jvm/java-13-openjdk-amd64"