在 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/