java - 新定义的环境变量在 WSL2 之外看不到?

标签 java shell environment-variables wsl-2

在 WSL2 中,使用 ubuntu 发行版,我在 /etc/profile 中定义了一个新变量(我还尝试了 ~/.bashrc 和/etc/environment)

导出 JDK_17_0=/home/scaventz/sdk/jdk-17

然后源/etc/profile

然后我尝试通过使用 Intellij IDEA 在 Windows 中创建一个 Java 项目来获取此变量(当然该项目本身位于 WSL2 中):

public class Main {
    public static void main(String[] args) {
        String prop = "JDK_17_0";
        String jdk = System.getProperty(prop);
        if (jdk == null) {
            jdk = System.getenv(prop);
        }
        System.out.println(jdk);
    }
}

我得到一个空值。

这似乎是 WSL2 相关问题,有解决方法吗?

最佳答案

是的,这是可以预料的,而且是的,有一个解决方法。默认情况下,导出的 WSL 环境变量不会传播回 Windows 环境。您可以通过以下方式看到相同的行为(从 WSL/Bash 开始):

> export JDK_17_0=/home/scaventz/sdk/jdk-17
> powershell.exe
PS > $env:JDK_17_0

...不会返回任何内容。

但是 WSL 确实有 sharing environment variables 的互操作功能WSL 和 Windows 进程之间。

重复我们之前的例子:

> export JDK_17_0=/home/scaventz/sdk/jdk-17
> WSLENV=JDK_17_0 powershell.exe
PS > $env:JDK_17_0
/home/scaventz/sdk/jdk-17

请注意,这不会直接修改 Windows 中的系统环境变量;它只是将一个新变量注入(inject)到 powershell.exe 进程中。因此,您应该能够通过调用 Intellij IDEA Windows 可执行文件来执行相同的操作(如果 Windows 中没有该可执行文件,您可能需要完整的 /mnt/c/... 路径)路径)以同样的方式。由于 Windows Java 可执行文件是由 Intellij 启动的,因此为 Intellij 进程设置的环境变量应该传播到 Java 进程。

虽然我目前没有特定的设置,但我至少能够通过从上面的 PowerShell session 中启动 VSCode 来确认这一点。在 VSCode 内部,环境变量仍然可用。

当然,还要注意 WSL/Linux 和 Windows 之间路径结构的差异。仅仅因为您可以将 /home/scaventz/sdk/jdk-17 传递到在 Windows 上运行的 Java 中,并不意味着它会理解它。 Windows 上的 Java 理解 Windows 路径结构。它无法直接访问 /home/scaventz/sdk/jdk-17 中的任何内容。

我意识到您并没有尝试访问该示例中的文件系统,但我认为这对您来说是 future 的一步,因为您正在传递路径。因此,您可能想要使用 translatable path option对于 WSLENV:

> export JDK_17_0=/home/scaventz/sdk/jdk-17
> WSLENV=JDK_17_0/p powershell.exe
PS > $env:JDK_17_0
\\wsl$\Ubuntu\home\scaventz\sdk\jdk-17 # Or \\wsl$\whatever_your_distribution_is_named\...

旁注:

It seems a WSL2 related issue

公平地说,事实并非如此。按照您描述事物的方式,如果您从 PowerShell 执行此操作,您会看到相同的行为。尝试在 PowerShell 中设置相同的环境变量,然后从 Windows 开始菜单启动 Intellij IDEA。它也无法访问该变量。

只有当从父进程内启动新进程时,您才有希望将变量传递给该新进程。

除非您使用PowerShell修改系统变量like so 。请注意,如果需要,您也可以通过 WSL 与 PowerShell 的互操作来完成此操作。

关于java - 新定义的环境变量在 WSL2 之外看不到?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68947132/

相关文章:

java - 将按钮添加到从数据库中的数据动态生成的表中的列 java swing

java - CDI 是否为 RequestScoped 重用代理?

linux - 如何将远程文件 CURL 到远程服务器

vagrant 文件中的 Shell 环境变量仅先向上传递

windows - 在 Powershell 中使用批处理式环境变量解释字符串

java - Spring Post方法与关系数据库(Rest Api)

java - 使用 maven 存储库将 java 库添加到 Android Studio 项目

用于更新多个文件夹的命令的 Linux shell 脚本

c - UNIX shell C 管道的执行

bash - 'echo' bash 中 'env' 的奇怪行为