Java 如何在VSCode IDE中为JRE使用docker容器?

Java 如何在VSCode IDE中为JRE使用docker容器?,java,docker,visual-studio-code,Java,Docker,Visual Studio Code,在我的IDE VSCode中,我用一个“Java”docker容器配置扩展。到目前为止,我已经能够设置运行时,但是我没有将IDE指向docker容器的Java主目录 根据扩展的页面,这是我需要实现的,以便使扩展工作: 此JDK将用于启动Java语言服务器。默认情况下,也将用于编译项目 Java开发工具包的路径可以通过VS代码设置(工作区/用户设置)中的Java.home设置来指定。如果未指定,则按以下顺序搜索,直到JDK满足当前的最低要求 JDK_HOME环境变量 JAVA\u HOME环境变

在我的IDE VSCode中,我用一个“Java”docker容器配置扩展。到目前为止,我已经能够设置运行时,但是我没有将IDE指向docker容器的Java主目录

根据扩展的页面,这是我需要实现的,以便使扩展工作:

此JDK将用于启动Java语言服务器。默认情况下,也将用于编译项目

Java开发工具包的路径可以通过VS代码设置(工作区/用户设置)中的
Java.home
设置来指定。如果未指定,则按以下顺序搜索,直到JDK满足当前的最低要求

  • JDK_HOME
    环境变量
  • JAVA\u HOME
    环境变量
  • 在当前系统路径上
如何设置运行时 正如我已经说过的,我设法设置了一个运行时。我就是这样做的:

  • 为docker容器添加了一个
    java
    二进制文件,在我的例子中,我将它放在
    /usr/local/bin

    #!/bin/sh
    
    docker run \
         --name usr-local-bin-java \
         -i \
         --rm \
         --network=host \
         -w /root/project \
         -v "$PWD":/root/project \
         -v "$PWD"/.docker/mvn/cache:/root/.m2 \
         maven:3-jdk-8-slim \
         java "$@"
    
    exit $?
    
    我使用Maven映像是因为我还需要Maven,它还包括Java。当然,也可以使用OpenJDK映像

  • 添加/更新了my IDE的用户
    设置.json
    ,内容如下:

    "java.configuration.runtimes": [
         {
             "name": "JavaSE-1.8",
             "path": "/usr/local/bin/java",
             "default": true
         }
    ],
    
  • 我被困在哪里 因此,我前面的最后一步是为
    java.home
    指定路径。但如果它位于docker容器中,我将如何做到这一点?最明显的解决方案是将docker容器中的路径装载到我的主机。不幸的是,这不起作用,因为我需要的路径存储在docker映像中,因此当我将主机装载到该路径时,它将导致一个空目录

    总而言之,不起作用(注意:docker图像中的java主页位于
    /usr/local/openjdk-8
    ):

  • 将以下参数添加到
    java
    二进制文件中,以设置卷装载:
    -v "$PWD"/.docker/java/jdk:/usr/local/openjdk-8 \
    
  • java.home
    属性添加到
    settings.json
    config:
    "java.home": "${cwd}/.docker/java/jdk",
    
  • 这将导致类似这样的结果:“java.home配置没有指向有效的JDK”

    有人知道:我的选择是什么吗?我可以指向交互式自动删除的docker容器中的目录吗

    PS:我不想直接在我的操作系统上安装JDK

    更新#1:我设法将一个卷从docker容器装载到主机上

  • 创建新的docker卷:
    docker volume create openjdk
    
  • 将卷装入参数添加到
    java
    二进制文件:
    -v openjdk:/usr/local/openjdk-8 \
    
  • 运行二进制文件:
    java -version
    
  • JDK_HOME
    JAVA_HOME
    变量添加到bash环境中:
    JAVA_HOME="$(docker inspect -f '{{ index .Mountpoint }}' openjdk)"
    
  • 重新加载IDE并获取错误。。。 运行Java扩展需要Java 11或更高版本。请下载并安装最新的JDK。您仍然可以通过配置


  • 我甚至试图将
    java.home
    属性直接设置为卷的装入点,这导致了权限拒绝错误,因此我
    chmod+rx-R
    我的整个“var lib docker”目录(卷的存储位置)。最后,出现了上述步骤中描述的相同错误。

    好吧,我想我已经找到了实现它的方法,但我认为这并不是最好的方法。因为它基本上与下载jdk并将其放在某个目录中相同。。。无论如何:

  • 创建用于存储jdk的docker卷:
    docker volume create openjdk-15
    
  • 使用您想要的jdk(需要是Java 11或更高版本)运行容器,同时让它填充您刚刚创建的卷:
    docker run --rm -v openjdk-15:/usr/local/openjdk-15 openjdk:15-slim java -version
    
  • (可选)我喜欢符号链接到卷,例如:
    sudo ln -s $(docker inspect -f '{{ index .Mountpoint }}' openjdk-15) /usr/local/lib/openjdk-15
    
  • settings.json中配置扩展:
    
    "java.home": "/usr/local/lib/openjdk-15",
    "java.configuration.runtimes": [
      {
        "name": "JavaSE-15",
        "path": "/usr/local/lib/openjdk-15",
        "default": true
      }
    ]
    
  • 因此,不需要定制
    java
    二进制文件来启动docker容器。但是,您仍然必须将JDK文件直接存储在操作系统上