在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结构的应用程序。
如果我使用:
JAVA_HOME=/usr
所有想要使用任何Java可执行文件的应用程序和脚本都可以使用标准过程call $JAVA_HOME/bin/executable
。但是,由于罐子位于不同的地方,因此并不总是找到它们(例如:在grails中我ClassDefNotFound
获得native2ascii
。
另一方面,如果我使用:
JAVA_HOME=/usr/share/java
无法找到任何Java可执行文件(java
,javac
等)。
那么,在基于Debian的Linux中处理JAVA_HOME
变量的正确方法是什么?
感谢您的帮助, 路易斯
答案 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
。更多信息: