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


90

在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。但是,由于罐子位于不同的位置,因此并不总是可以找到它们(例如:在我要的grailsClassDefNotFoundnative2ascii)。

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

    JAVA_HOME=/usr/share/java
    

    在Java可执行文件(没有javajavac等等)都可以找到。

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

谢谢您的帮助,路易斯

Answers:


97

最终对我有用(Grails现在可以正常工作)的工作几乎就像Steve B.指出的那样:

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

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

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


6
看来Debian 7上没有这样的链接
2014年

3
在RHEL5.10,它是/ usr / lib中/ JVM / JAVA
布赖恩

1
我使用了/ usr / lib / jvm / java-7-openjdk-amd64
Randall Bohn,2014年

对于Oracle Linux 7(这适用于CentOS和RHEL),我创建了一个名为/etc/profile.d/java.sh的文件,并使用以下内容填充该文件:JAVA_HOME = / usr / lib / jvm / jre-openjdk export JAVA_HOME重新供应/ etc / profile(通过运行源/ etc / profile)后,按预期填充了JAVA_HOME。
darnold0714

79

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

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

3
这对我有用:JAVA_HOME = $(readlink -f / usr / bin / java | sed“ s:/ jre / bin / java ::”)
dpnsan

4
出色的解决方案,通过JAVA_HOME解决了我多年以来的头疼问题,JAVA_HOME往往指向不同操作系统上的不同地方。
Datageek

3
请注意,这种聪明的解决方案不适用于Gentoo之类的/usr/bin/java指向脚本(/usr/libexec/eselect-java/run-java-tool.bash)的发行版。仍然,这是一个不错的方法。我唯一要更改的是使用Bash的内置替代方法来避免产生sed,例如:JAVA_HOME=$( j=$( readlink -f /usr/bin/java ) ; echo ${j%%/bin/java} )
RubyTuesdayDONO 2014年

效果很好:)可能希望更改javac为,java因为不是每个人都安装了JDK。只有JRE
Hanxue 2014年

1
@AlexisWilke现在使用Java代替Javac
bbaassssiiee

6

标准的Ubuntu安装似乎会将各种Java版本放入/usr/lib/jvm。的javac,Java中,你发现在你的路径软链接到这一点。

只要您设置JAVA_HOME环境变量并确保bin在路径上安装新的Java,就可以在自己喜欢的任何位置安装自己的Java版本。

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

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

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

在Debian中推荐Ubuntu解决方案是很危险的。他们可以而且确实会有所不同。
RichieHH 2010年

4
请注意,请求者说他使用过Kubuntu,因此Ubuntu解决方案应该可以。
约瑟夫·霍尔斯滕

0

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


我通常也没有。但是,如果我不进行设置,grails会抱怨JAVA_HOME不存在并中止。
路易斯·苏埃罗09年

蚂蚁在debian中也需要使用上下文
RichieHH 2010年



0

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



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


0

Ubuntu 12.04可以使用...

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


0

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

因此,您必须将JAVA_HOME设置为/ usr / java / default,以始终在类路径中选择替代项

HTH!


0

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

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

这样,两个备选方案都指向同一位置


-1

请查看update-alternatives命令的功能(它有个不错的人...)。

简短地讲-当您使用java-sun-1.4和java-opensouce-1.0 ...时,会发生什么?debian的“ / usr / bin / java”是符号链接,“ / usr / bin / java-sun-1.4”是“ / usr / bin / java”的替代品

编辑:正如理查德所说,update-alternatives还不够。您实际上需要使用update-java-alternatives。有关更多信息,请访问:

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


更新替代品是不够的。它需要是update-java-alternatives
RichieHH 2010年

@理查德:是的,注意到。我第一次去了解它,所以我搜索了一下,找到了Ubuntu的文档。谢谢!
elcuco 2010年

-2

我的正确目标一直是从Sun下载并以这种方式安装。然后,您确切地知道所有内容都进入哪个目录。

但是,如果您希望坚持使用Debian安装它的奇怪方式,那么我的最佳猜测将是位于java和javac二进制文件所在位置上方的父目录。

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

嗯,听起来不对...

我也很想听听这个答案!


使用debian时,您确实需要保持debian结构,否则以后的系统更新将使您的系统损坏。
RichieHH 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.