Linux OpenJDK Debian 기반 배포에 대한 JAVA_HOME 환경 변수의 올바른 대상은 무엇입니까?


91

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, javac등) 찾을 수 없습니다.

그렇다면 JAVA_HOMEDebian 기반 Linux에서 변수 를 처리하는 올바른 방법은 무엇입니까?

도와 주셔서 감사합니다, Luis

답변:


99

마침내 저에게 효과가 있었던 것은 (Grails가 이제 원활하게 작동합니다) 거의 Steve B.가 지적한 것처럼하고 있습니다.

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

이렇게하면 사용자가 시스템의 기본 JDK를 변경해도 JAVA_HOME계속 작동합니다.

default-java 현재 JVM에 대한 심볼릭 링크입니다.


6
데비안 7에는 그런 링크가없는 것 같습니다
a1an 2014 년

3
RHEL5.10에서는 / usr / lib / jvm / java
Brian

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

80

대안을 사용하여 여러 Java 버전을 관리하는 경우 다음 JAVA_HOME과 같이 symlinked 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
이 영리한 솔루션은 /usr/bin/java스크립트 ( /usr/libexec/eselect-java/run-java-tool.bash)를 가리키는 Gentoo와 같은 배포판에서는 작동하지 않습니다 . 그래도 좋은 접근 방식입니다. 내가 변경할 유일한 것은 스폰을 피하기 위해 Bash의 내장 대체를 사용하는 것입니다 sed. 예 :JAVA_HOME=$( j=$( readlink -f /usr/bin/java ) ; echo ${j%%/bin/java} )
RubyTuesdayDONO

이것은 잘 작동합니다 :) 변경할 수 있습니다 javacjava모든 사람이 JDK가 설치되어 있기 때문에, JRE 만
Hanxue 2014

1
@AlexisWilke 이제 javac 대신 자바
bbaassssiiee

7

표준 Ubuntu 설치는 다양한 Java 버전을 /usr/lib/jvm. javac경로에서 찾을, 자바는 여기에 소프트 링크합니다.

JAVA_HOME환경 변수 를 설정 하고 새 Java가 있는지 확인하는 한 원하는 곳에 Java 버전을 설치하는 데 문제가 없습니다.bin 경로에 .

이를 수행하는 간단한 방법은 Java 홈이 소프트 링크로 존재하도록하는 것입니다. 따라서 버전을 업그레이드하거나 전환하려면 이것이 가리키는 디렉토리 만 변경하면됩니다. 예 :

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

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

데비안과 함께 우분투 솔루션을 추천하는 것은 위험합니다. 그들은 다를 수 있고 다를 수 있습니다.
RichieHH 2010 년

4
요청자가 Kubuntu를 사용했다고 말 했으므로 Ubuntu 솔루션은 괜찮을 것입니다.
Joseph Holsten

0

일반적으로 JAVA_HOME 환경 변수가 없습니다. 자바는 스스로 설정할 수 있습니다. java java.home 시스템 속성을 사용할 수 있어야합니다.


나는 보통 그것을 가지고 있지 않습니다. 그러나 내가 설정하지 않으면 grails는 JAVA_HOME이 없다고 불평하고 중단합니다.
Luis Soeiro

1
개미는 데비안에서도 그것을 필요로한다
RichieHH 2010-08-05


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

우분투 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 대신 update-java-alternatives 스크립트를 사용했습니다. 그리고 그것은 나를 위해 JAVA_HOME을 올바르게 설정했습니다.


Ubuntu 20.4에는 없습니다
Martin Schröder

-1

update-alternatives 명령이 수행하는 작업을 참조하십시오 (좋은 사람이 있습니다 ...).

곧-java-sun-1.4와 java-opensouce-1.0이 있으면 어떻게됩니까? 데비안 "/ usr / bin / java"는 심볼릭 링크이고 "/usr/bin/java-sun-1.4"는 "/ usr / bin / java"의 대안입니다.

편집 : Richard가 말했듯 update-alternatives이 충분하지 않습니다. 실제로 사용해야합니다.update-java-alternatives . 자세한 정보 :

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


업데이트 대안으로는 충분하지 않습니다. update-java-alternatives
여야합니다

@Richard : 그렇습니다. 처음으로 그것에 대해 검색하여 Ubuntu 문서를 찾았습니다. 감사!
elcuco

-2

내 올바른 목표는 항상 Sun에서 다운로드하여 설치하는 것입니다. 그러면 모든 것이 들어가는 디렉토리를 정확히 알 수 있습니다.

그러나 데비안이 설치하는 이상한 방법을 고수하고 싶다면 java 및 javac 바이너리가 위치한 바로 위의 상위 디렉토리가 가장 좋습니다.

(경로에 지정할 때 $ JAVA_HOME / bin입니다) (따라서 귀하의 경우에는 ... $ JAVA_HOME / share이고 $ JAVA_HOME은 / usr입니까?)

어, 잘못된 것 같네요 ...

이것에 대한 답도 듣고 싶습니다!


데비안을 사용할 때 데비안 구조를 유지해야합니다. 그렇지 않으면 시스템 업데이트로 인해 시스템이 손상됩니다.
RichieHH 2010 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.