在使用替代方案的 Linux 系统上,JAVA_HOME 的正确路径是啥?

Posted

技术标签:

【中文标题】在使用替代方案的 Linux 系统上,JAVA_HOME 的正确路径是啥?【英文标题】:What is the correct path for JAVA_HOME on a Linux system that uses alternatives?在使用替代方案的 Linux 系统上,JAVA_HOME 的正确路径是什么? 【发布时间】:2012-08-18 15:10:10 【问题描述】:

Ubuntu 系统上确定JAVA_HOME 的正确路径有点复杂,因为它使用了替代方法。在我的机器上,这就是替代方案在到达实际的 java 或 javac 之前创建至少两个间接级别的方式。

usr/bin/javac -> /etc/alternatives/

/etc/alternatives/java -> /usr/lib/jvm/jdk1.7/bin/javac

如果我将 JAVA_HOME 设置为 /usr/lib/jvm/jdk1.7 ,那么我的系统 java 可能与 JAVA_HOME 指向的 java 不一致,如果我更新替代项以使用另一个 java。

我的问题是,在使用替代方案的系统上,JAVA_HOME 的正确值是多少。我倾向于认为JAVA_HOME应该设置为/usr

这样 TOMCAT 或任何其他使用它的软件都会将“bin”附加到JAVA_HOME 并找到它需要的所有可执行文件。

这是JAVA_HOME 在使用替代品的系统上的正确值吗?大多数软件是否仅使用JAVA_HOME 来定位可执行文件,还是会使用该值来定位与 JDK 捆绑在一起的其他工件(例如安全策略文件等)?如果前者是真的,那么我觉得我们可以将/usr 用于JAVA_HOME,但如果后者是真的,那么我认为正确使用JAVA_HOME 的唯一方法是牺牲替代功能。

【问题讨论】:

我刚刚查看了我的 CentOS 5.5 系统:1) 我确实没有在我的环境中的任何地方定义了 $JAVA_HOME,2) /etc/tomcat5/tomcat5.conf 有这个行:JAVA_HOME="/usr/lib/jvm/java",3) /usr/lib/jvm/java 是一个符号链接:java -> /etc/alternatives/java_sdk,4) /etc/alternatives/java_sdk 也是一个符号链接:java_sdk -> /usr/lib/jvm/java-1.4.2-gcj 是的,我在 Ubuntu 上有 'default-java' 而不是 /usr/lib/jvm 里面的 'java' 所以,我想诀窍是根本不用担心替代方案,因为还有一个替代品和 Java 之间的层。 【参考方案1】:

好问题 - 我在 Linux 上使用“替代方案”,一切都“正常工作” - 我从来没有真正考虑过。

我相信这就是答案:

JAVA_HOME=/usr/lib/jvm/default-java

What is the correct target for the JAVA_HOME envrionment variable for a Linux OpenJDK Debian-based distribution?

1) “alternatives”将符号链接设置为您的“真实”Java 当前配置的任何内容

2) 您只需将 $JAVA_HOME 设置为符号链接

【讨论】:

这是在哪个发行版上?我在使用替代品的 Debian 上,但我没有 /usr/lib/jvm/default-java 有趣的答案。我首先解释了为什么,你的建议不起作用。但当我想得更多时,我想我明白你的建议了。您是说我应该创建一个“default-java”目录并将其符号链接到我要使用的 Java。在此之后,我应该更新我的替代系统以将所有与 Java 相关的二进制文件指向“default-java/bin”中的二进制文件。这将通过在替代方案和 Java 之间增加一层来解决问题 谢谢。我有点困惑,因为我弄乱了我的替代方案,并且 java 二进制文件不再通过 default-java redhat 好像是 JAVA_HOME=/usr/lib/jvm/java。【参考方案2】:

我没有找到合适的直接解决方案,所以这是我的解决方法 将以下内容添加到 bachrc

javapath=$( readlink --canonicalize /usr/bin/java)
removebin="/bin/java"
removejre="/jre"
javapath2=$javapath/$removebin/
export JAVA_HOME=$javapath2/$removejre/

然后在使用替代方法更改 java 版本时执行源以重新加载 JAVA_HOME

source ~/.bashrc 

说明: 我所做的是从 update-alternatives app 设置的变量中获取 java 类路径,然后从中删除 bin/java 部分,然后将其分配给 JAVA_HOME。此过程发生在登录系统时。如果您在会话过程中更改 java 版本,则必须重新加载配置文件。

【讨论】:

以上是关于在使用替代方案的 Linux 系统上,JAVA_HOME 的正确路径是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Docker Desktop 收费之后,神网友弄了个替代方案

AlmaLinux 9 正式发布,CentOS 替代方案

java的更新替代方案的问题

Linux 中的 Windows 命名管道替代方案

使用UDEV SCSI规则在Oracle Linux上配置ASM

2038 年嵌入式 Linux(32 位)解决方案? [复制]