基于Linux OpenJDK Debian的发行版的JAVA_HOME环境变量的正确目标是什么?

时间:2009-03-19 19:23:07

标签: java grails java-home debian-based

在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中我ClassDefNotFound获得native2ascii

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

    JAVA_HOME=/usr/share/java
    

    无法找到任何Java可执行文件(javajavac等)。

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

    感谢您的帮助, 路易斯

14 个答案:

答案 0 :(得分:89)

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

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

这样,如果用户更改系统的默认JDK,JAVA_HOME仍然有效。

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

答案 1 :(得分:61)

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

export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")

答案 2 :(得分:5)

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

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

执行此操作的一种简单方法是将Java主目录作为软链接存在,这样,如果要升级或切换版本,则只需更改指向的目录 - 例如:

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

/opt/jdk --> /opt/jdk1.6.011

答案 3 :(得分:0)

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

答案 4 :(得分:0)

尝试同时设置JAVA_LIB变量。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

如果您找不到JAR文件的问题,我还会确保您的CLASSPATH设置为包含这些文件的位置。然而,我确实发现CLASSPATH通常需要针对不同的程序进行不同的设置,并且通常最终会为各个程序设置唯一的内容。

答案 7 :(得分:0)

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

答案 8 :(得分: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未被触发。

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

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

答案 9 :(得分:0)

Ubuntu 12.04这个有用......

JAVA_HOME = / usr / lib中/ JVM / JAVA -6-的openjdk-I386 / JRE

答案 10 :(得分:0)

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

所以你必须将你的JAVA_HOME设置为/ usr / java / default,以便在类路径中始终有替代的选择

HTH!

答案 11 :(得分:0)

我总是倾向于根据/usr/bin/java设置JAVA_HOME。

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

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

答案 12 :(得分:-1)

我的正确目标始终是从Sun下载并以这种方式安装。然后你就确切地知道了所有目录。

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

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

呃,听起来不对......

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

答案 13 :(得分:-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