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

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

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

不过,我需要使用Kubuntu的默认OpenJDK包。 问题是所有的可执行文件都放在/usr/bin 。 但是这些jar子放在/usr/share/java 。 由于它们不在相同的JAVA_HOME文件夹下,所以我在使用Grails时遇到了麻烦,也许会遇到其他需要标准Java结构的应用程序。

  1. 如果我使用:

     JAVA_HOME=/usr 

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

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

     JAVA_HOME=/usr/share/java 

    没有一个Java可执行文件( javajavac等)可以find。

那么,在基于Debian的Linux中处理JAVA_HOMEvariables的正确方法是什么呢?

感谢你的帮助,路易斯

终于为我工作的东西(Grails现在可以顺利运行)正在像Steve B.指出的那样:

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

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

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

如果你使用替代方法,你可以像这样设置符号链接的java的JAVA_HOME

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

标准的Ubuntu安装似乎把各种Java版本放在/usr/lib/jvm 。 您在path中find的javac ,java将会链接到此。

只要设置JAVA_HOME环境variables并确保在path上有新的Java bin就不需要在任何地方安装自己的Java版本。

一个简单的方法是将Java home作为一个软链接存在,所以如果你想升级或切换版本,你只需要改变它指向的目录 – 例如:

 /usr/bin/java --> /opt/jdk/bin/java, /opt/jdk --> /opt/jdk1.6.011 

如果你没有发现JAR文件的问题,我也会确保你的CLASSPATH被设置为包含这些文件的位置。 但是我发现CLASSPATH通常需要针对不同的程序设置不同的内容,而且通常最终只能为个别程序设置一些东西。

我发现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

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

尝试设置JAVA_LIBvariables。

据我所知,我用update-java-alternatives脚本代替了更新选项。 它确实为我设置了JAVA_HOME。

更新的答案,将解决您的问题,也只是一个普通的好方法在Ubuntu上安装Oracle Java 7可以在这里find: http : //www.wikihow.com/Install-Oracle-Java-on-Ubuntu-Linux

Ubuntu 12.04这个工程…

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

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

所以你必须将你的JAVA_HOME设置为/ usr / java / default,以便在你的类path中始终有其他的select

HTH!

我的正确目标一直是从Sun下载并以此方式安装。 那么你就知道到底是什么目录。

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

(因为当你在你的path中指定它$ JAVA_HOME /斌)(所以在你的情况下,这将是… $ JAVA_HOME /共享和$ JAVA_HOME将是/ usr?)

呃那听起来不对

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

请参阅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

Interesting Posts