92

在 Windows 中,JAVA_HOME必须指向 JDK 安装文件夹(以便JAVA_HOME/bin包含所有可执行文件并JAVA_HOME/libs包含所有默认jar库)。

如果我下载 Sun 的 JDK 包并将其安装在 Linux 中,则过程相同。

但是,我需要使用 Kubuntu 的默认 OpenJDK 包。问题是所有可执行文件都放在/usr/bin. 但是罐子放在/usr/share/java. 由于它们不在同一个JAVA_HOME文件夹下,我在使用 Grails 时遇到了问题,并且可能会遇到其他需要标准 Java 结构的应用程序的问题。

  1. 如果我使用:

    JAVA_HOME=/usr
    

    所有想要使用任何 Java 可执行文件的应用程序和脚本都可以使用标准过程call $JAVA_HOME/bin/executable。然而,由于罐子在不同的地方,它们并不总是被找到(例如:在 grails 我得到ClassDefNotFoundnative2ascii)。

  2. 另一方面,如果我使用:

    JAVA_HOME=/usr/share/java
    

    找不到任何 Java 可执行文件(java、等)。javac

那么,JAVA_HOME在基于 Debian 的 Linux 中处理变量的正确方法是什么?

谢谢你的帮助,路易斯

4

15 回答 15

101

最终对我有用的东西(Grails 现在运行顺利)几乎就像 Steve B. 指出的那样:

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

这样,如果用户更改了系统的默认 JDK,JAVA_HOME仍然可以使用。

default-java是当前 JVM 的符号链接。

于 2009-03-19T19:39:42.990 回答
84

如果您使用替代方法来管理多个 java 版本,您可以设置JAVA_HOME基于符号链接的 java(或 javac),如下所示:

export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")
于 2012-07-18T13:50:50.523 回答
7

标准的 Ubuntu 安装似乎将各种 Java 版本放入/usr/lib/jvm. 您在路径中找到的javac, java 将软链接到此。

只要您设置JAVA_HOME环境变量并确保bin在您的路径上有新的 Java,在您喜欢的任何地方安装您自己的 Java 版本都没有问题。

一个简单的方法是让 Java 主目录作为软链接存在,这样如果您想升级或切换版本,您只需更改 this 指向的目录 - 例如:

/usr/bin/java --> /opt/jdk/bin/java,

/opt/jdk --> /opt/jdk1.6.011
于 2009-03-19T19:32:36.017 回答
1

我修改了上面的解决方案之一,无论 java 安装在哪里,只要它在您的 PATH 中,这似乎都有效。

JAVA_HOME=$( j=$( readlink -f $(which java) ) ; echo ${j%%/bin/java} )
于 2021-09-02T21:14:18.173 回答
0

我通常没有任何 JAVA_HOME 环境变量。Java 可以自行设置。内部 java java.home 系统属性应该可用。

于 2009-03-19T19:28:10.613 回答
0

尝试设置 JAVA_LIB 变量。

于 2009-03-19T20:01:05.310 回答
0

如果您遇到找不到 JAR 文件的问题,我还会确保您的 CLASSPATH 设置为包含这些文件的位置。但是,我确实发现 CLASSPATH 通常需要为不同的程序设置不同的设置,并且通常最终会成为为单个程序唯一设置的东西。

于 2011-03-14T15:53:02.463 回答
0

可以在此处找到可以解决您的问题的更新答案以及在 Ubuntu 上安装 Oracle Java 7 的一般好方法:http: //www.wikihow.com/Install-Oracle-Java-on-Ubuntu-Linux

于 2012-06-12T06:50:41.347 回答
0

我发现 Ubuntu 中的 openjdk-6-jre 和 openjdk-6-jre-headless 软件包存在类似问题。

通过清除 openjdk-6-jre 和 openjdk-6-jre-headless 软件包并重新安装,我的问题得到了解决。替代方案仅在全新安装 openjdk-6-jre 和 openjdk-6-jre-headless 软件包时更新。

以下是清除后的安装示例:

aptitude purge openjdk-6-jre openjdk-6-jre-headless # to ensure no configuration exists
aptitude install --without-recommends openjdk-6-jre # Installing without some extras
Reading package lists... Done
Building dependency tree
Reading state information... Done
Reading extended state information
Initializing package states... Done
The following NEW packages will be installed:
  ca-certificates-java{a} java-common{a} libavahi-client3{a} libavahi-common-data{a} libavahi-common3{a} libcups2{a} libflac8{a} libgif4{a} libnspr4-0d{a} libnss3-1d{a} libogg0{a} libpulse0{a} libsndfile1{a} libvorbis0a{a} libvorbisenc2{a} libxi6{a} libxtst6{a}
  openjdk-6-jre openjdk-6-jre-headless{a} openjdk-6-jre-lib{a} tzdata-java{a}
The following packages are RECOMMENDED but will NOT be installed:
  icedtea-6-jre-cacao icedtea-netx ttf-dejavu-extra
0 packages upgraded, 21 newly installed, 0 to remove and 119 not upgraded.
Need to get 0B/34.5MB of archives. After unpacking 97.6MB will be used.
Do you want to continue? [Y/n/?]
Writing extended state information... Done
Selecting previously deselected package openjdk-6-jre-lib.
(Reading database ... 62267 files and directories currently installed.)
Unpacking openjdk-6-jre-lib (from .../openjdk-6-jre-lib_6b24-1.11.5-0ubuntu1~10.04.2_all.deb) ...
...
Processing triggers for man-db ...
Setting up tzdata-java (2012e-0ubuntu0.10.04) ...
...
Setting up openjdk-6-jre-headless (6b24-1.11.5-0ubuntu1~10.04.2) ...
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/java to provide /usr/bin/java (java) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/keytool to provide /usr/bin/keytool (keytool) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/pack200 to provide /usr/bin/pack200 (pack200) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/rmid to provide /usr/bin/rmid (rmid) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/rmiregistry to provide /usr/bin/rmiregistry (rmiregistry) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/unpack200 to provide /usr/bin/unpack200 (unpack200) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/orbd to provide /usr/bin/orbd (orbd) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/servertool to provide /usr/bin/servertool (servertool) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/tnameserv to provide /usr/bin/tnameserv (tnameserv) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/lib/jexec to provide /usr/bin/jexec (jexec) in auto mode.
Setting up openjdk-6-jre (6b24-1.11.5-0ubuntu1~10.04.2) ...
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/policytool to provide /usr/bin/policytool (policytool) in auto mode.
...

您可以在上面看到update-alternatives运行以设置各种 Java 二进制文件的链接。

在此安装之后,还有 中的链接、中的/usr/bin链接/etc/alternatives和中的每个二进制文件的文件/var/lib/dpkg/alternatives

ls -l /usr/bin/java /etc/alternatives/java /var/lib/dpkg/alternatives/java
lrwxrwxrwx 1 root root  40 2013-01-16 14:44 /etc/alternatives/java -> /usr/lib/jvm/java-6-openjdk/jre/bin/java
lrwxrwxrwx 1 root root  22 2013-01-16 14:44 /usr/bin/java -> /etc/alternatives/java
-rw-r--r-- 1 root root 158 2013-01-16 14:44 /var/lib/dpkg/alternatives/java

让我们将其与不清除的安装进行对比。

aptitude remove openjdk-6-jre
aptitude install --without-recommends openjdk-6-jre
Reading package lists... Done
Building dependency tree
Reading state information... Done
Reading extended state information
Initializing package states... Done
The following NEW packages will be installed:
  ca-certificates-java{a} java-common{a} libavahi-client3{a} libavahi-common-data{a} libavahi-common3{a} libcups2{a} libflac8{a} libgif4{a} libnspr4-0d{a} libnss3-1d{a} libogg0{a} libpulse0{a} libsndfile1{a} libvorbis0a{a} libvorbisenc2{a} libxi6{a} libxtst6{a}
  openjdk-6-jre openjdk-6-jre-headless{a} openjdk-6-jre-lib{a} tzdata-java{a}
The following packages are RECOMMENDED but will NOT be installed:
  icedtea-6-jre-cacao icedtea-netx ttf-dejavu-extra
0 packages upgraded, 21 newly installed, 0 to remove and 119 not upgraded.
Need to get 0B/34.5MB of archives. After unpacking 97.6MB will be used.
Do you want to continue? [Y/n/?]
Writing extended state information... Done
Selecting previously deselected package openjdk-6-jre-lib.
(Reading database ... 62293 files and directories currently installed.)
Unpacking openjdk-6-jre-lib (from .../openjdk-6-jre-lib_6b24-1.11.5-0ubuntu1~10.04.2_all.deb) ...
...
Processing triggers for man-db ...
...
Setting up openjdk-6-jre-headless (6b24-1.11.5-0ubuntu1~10.04.2) ...

Setting up openjdk-6-jre (6b24-1.11.5-0ubuntu1~10.04.2) ...
...

如您所见,update-alternatives未触发。

安装后, 中没有 Java 二进制文件的文件, 中/var/lib/dpkg/alternatives没有链接/etc/alternatives, 中也没有链接/usr/bin

中的文件的删除/var/lib/dpkg/alternatives也会中断update-java-alternatives

于 2013-01-16T18:48:22.153 回答
0

Ubuntu 12.04 这工作...

JAVA_HOME=/usr/lib/jvm/java-6-openjdk-i386/jre

于 2013-03-06T23:51:56.180 回答
0

作为 fedora 用户的更新,替代方法将当前 java 目录设置为 /usr/java/default

所以你必须将你的 JAVA_HOME 设置为 /usr/java/default 以在你的类路径中总是有替代的当前选择

于 2015-09-06T21:05:14.423 回答
0

我总是倾向于根据/usr/bin/java.

JAVA_HOME="$(dirname -- "$(dirname -- "$(readlink -f /usr/bin/java)")")"

这样,两种选择都指向同一个位置

于 2019-11-21T10:23:11.340 回答
-1

请查看 update-alternatives 命令的作用(它有一个好人......)。

很快 - 当你有 java-sun-1.4 和 java-opensouce-1.0 时会发生什么......哪个需要“java”?它 debian "/usr/bin/java" 是符号链接,而 "/usr/bin/java-sun-1.4" 是 "/usr/bin/java" 的替代品

编辑:正如理查德所说,update-alternatives这还不够。您实际上需要使用update-java-alternatives. 更多信息在:

https://help.ubuntu.com/community/Java

于 2009-03-19T19:47:54.873 回答
-1

据我记得,我使用的是 update-java-alternatives 脚本而不是 update-alternatives。它确实为我正确设置了 JAVA_HOME。

于 2009-03-20T10:51:49.177 回答
-2

我的正确目标一直是从 Sun 下载它并以这种方式安装。然后你就知道所有东西都在哪个目录下。

但是,如果您更喜欢 Debian 安装它的奇怪方式,我最好的猜测是 java 和 javac 二进制文件所在的父目录。

(因为当您在路径中指定它时,它是 $JAVA_HOME/bin)(所以在您的情况下,它将是 ... $JAVA_HOME/share 和 $JAVA_HOME 将是 /usr ?)

呃,好像不太对...

我也有兴趣听到这个问题的答案!

于 2009-03-19T19:26:36.813 回答