Linux OpenJDK DebianベースのディストリビューションのJAVA_HOME環境変数の正しいターゲットは何ですか?


91

Windowsでは、JAVA_HOMEJDKインストールフォルダを指す必要があります(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。ただし、jarファイルは別の場所にあるため、常に見つかるとは限りません(例:Grailsで取得ClassDefNotFoundしていますnative2ascii)。

  2. 一方、私が使用する場合:

    JAVA_HOME=/usr/share/java
    

    Javaの実行可能ファイル(のいずれもjavajavacなど)が見つかりません。

では、JAVA_HOMEDebianベースのLinuxで変数を処理する正しい方法は何ですか?

助けてくれてありがとう、ルイス

回答:


98

最終的に私のために働いたのは(Grailsは今ではスムーズに機能します)、SteveB。が指摘したようにやっています:

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

このようにして、ユーザーがシステムのデフォルトのJDKを変更してJAVA_HOMEも、引き続き機能します。

default-java 現在のJVMへのシンボリックリンクです。


6
Debian 7にはそのようなリンクがないようです
a1an 2014年

3
RHEL5.10では、/ usr / lib / jvm / java
Brian

1
/ usr / lib / jvm / java-7-openjdk-amd64
Randall Bohn

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に、シンボリックリンクされた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 2013

4
素晴らしいソリューションは、さまざまなオペレーティングシステムのさまざまな場所を指す傾向があるJAVA_HOMEを使用して、長年の頭痛の種を解決します。
datageek 2014年

3
この巧妙なソリューションは/usr/bin/java、スクリプトを指しているGentooのようなディストリビューションでは機能しないことに注意してください(/usr/libexec/eselect-java/run-java-tool.bash)。それでも、それは素晴らしいアプローチです。私が変更する唯一のことはsed、スポーンを回避するためにBashの組み込み置換を使用することです。例:JAVA_HOME=$( j=$( readlink -f /usr/bin/java ) ; echo ${j%%/bin/java} )
RubyTuesdayDONO 2014年

これはうまく機能します:)誰もがJDKをインストールしているわけではないので、に変更javacしたいjava場合があります。JREのみ
Hanxue 2014

1
@AlexisWilkeがjavacではなくjavaになりました
bbaassssiiee 2016年

7

標準のUbuntuインストールでは、さまざまなJavaバージョンがに配置されているよう/usr/lib/jvmです。javacあなたのパスにあなたが見つけ、Javaはこれにソフトリンクします。

JAVA_HOME環境変数を設定し、新しいJavaを使用していることを確認する限り、独自のJavaバージョンを好きな場所にインストールしても問題はありません。binし、パスに。

これを行う簡単な方法は、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が存在しないと文句を言い、中止します。
ルイスソエイロ

1
antはコンテキストである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

Ubuntu12.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があるとどうなりますか...どちらが「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


update-alternativesでは不十分です。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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.