我的 Linux 发行版是 Debian 12.7.0,64 位,英文版。
我修改了标题为“如何在 Debian 12 上安装 Java JDK 21 或 OpenJDK 21”的指南 ,以便我可以“安装”/使用最新的生产就绪版本的 OpenJDK 23.0.1(仅供参考,Debian 的官方存储库包含 OpenJDK 17,对于我来说已经过时了。)
我点击链接https://download.java.net/java/GA/jdk23.0.1/c28985cbf10d4e648e4004050f8781aa/11/GPL/openjdk-23.0.1_linux-x64_bin.tar.gz将该软件下载到我的电脑。
接下来我使用以下命令解压缩文件:
tar xvf openjdk-23.0.1_linux-x64_bin.tar.gz
我的设备上创建了一个新目录。它名为jdk-23.0.1
我将该目录复制到/usr/local
sudo cp -r jdk-23.0.1 /usr/local
我通过发出以下命令创建了一个新的源脚本来设置 Java 环境:
su -i
tee -a /etc/profile.d/jdk23.0.1.sh<<EOF
> export JAVA_HOME=/usr/local/jdk-23.0.1
> export PATH=$PATH:$JAVA_HOME/bin
> EOF
完成上述操作后,我使用FeatherPad打开jdk23.0.1.sh,内容显示如下:
export JAVA_HOME=/usr/local/jdk-23.0.1
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/bin
根据指南,我输入了以下命令:
source /etc/profile.d/jdk23.0.1.sh
为了检查我的计算机上的 OpenJDK 版本,我输入了:
java --version
出现错误信息:
bash: java: command not found
有人能告诉我我做错了什么吗?谢谢。
PS:我非常仔细地遵循了上述指南,但仍然出现了错误消息。
编辑以更正拼写错误。正确的陈述应如下:
导出JAVA_HOME=/usr/local/jdk-23.0.1
如果你运行:
正如您提到的,shell 脚本将包含:
这显然是错误的,因为您真正希望的是第二行:
这样,在脚本被调用时变量就会被扩展,之后环境变量
PATH
的值(而不是脚本的内容)将变成(注意最后几位):如果 (相应 shell 的) 值为:
在获取脚本之前。
生成的脚本中出现“意外”内容的原因是,
EOF
在运行tee
命令时如果不引用第一个命令,则运行该命令的 shell 将扩展 heredoc 中的变量。而且因为
$JAVA_HOME
在运行命令的 shell 中没有设置(定界符是 的输入tee
;在将它输入到 时不会“即时”获取它tee
;之后也不会自动获取它),当变量被 shell 扩展时(在将定界符输入之前tee
),它会被扩展为“空字符串”而不是。这就是为什么你在第二行的末尾/usr/local/jdk-23.0.1
得到(第二个)的原因。:/bin
为了抑制扩展,您应该运行:
反而。
还要注意,中的脚本
/etc/profile.d/
通常由任何(新的)“登录”shell 提供(这里实际上只是意味着例如bash
以 开始-l
),并且通常即使连接到终端仿真器的 shell 可能是“非登录”shell,它们仍会以某种方式从提供脚本的某个进程/shell 继承环境。因此,重新登录后,您不需要(再次)手动获取新创建的脚本。还请注意,
PATH
末尾附近的“组件”优先级较低,这意味着:$JAVA_HOME/bin
,如果PATH
您使用系统包管理器安装其他/较旧的 jdk 包,则将使用该包代替您在 中的 jdk/usr/local/
。因此,根据您的需要,您可能希望将其添加到前面。此外,如果系统 jdk 包附带了类似的脚本,您甚至需要确保您的脚本具有一个稍后按词汇顺序排列的文件名(我认为这可能会根据当前语言环境而有所不同),以便稍后可以获取它。