代わりに環境変数設定を使用できますかupdate-alternatives
?
そうでなければ、いつどのような方法を使用すべきですか?ありがとうございます。
私の質問は読書から来ています。https://askubuntu.com/a/895024/1471
ほとんどの答えは私にとってとても複雑です。
当初、Oracleはいくつかの環境変数設定に基づいて複数のバージョンのJavaをインストールできると判断しました。
単純ですが、これらの変数を知らない人にとっては複雑すぎます。誰かが「update-java-alternatives」を発明しました。
「update-java-alternatives」は単純であることが証明されています。すべてが設定されたら、プログラムを実行して必要なバージョンを選択するだけです。
問題は、このソリューションを直接構成する必要がある場合(Javaのすべてのコマンドに対して構成する必要がある場合)、構成が複雑すぎるということです。
最良の答えは基本に戻る。
.bash_profile
(ユーザーの場合)または(各ユーザーの場合)で次の変数を設定します/etc/profile
。JAVA_HOME=<The home of your new java distribution> PATH=<The bin directory of your new java distribution>:$PATH
私の場合ははるかに簡単でした...すでに
/etc/profile.d
次の内容を含むファイルがあります(新しいディレクトリ構造に更新しています)。export J2SDKDIR=/usr/lib/jvm/jdk1.8.0_121 export J2REDIR=/usr/lib/jvm/jdk1.8.0_121/jre export PATH=/usr/lib/jvm/jdk1.8.0_121/bin:/usr/lib/jvm/jdk1.8.0_121/db/bin:/usr/lib/jvm/jdk1.8.0_121/jre/bin:$PATH export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_121 export DERBY_HOME=/usr/lib/jvm/jdk1.8.0_121/db
それだけです! ! !
ベストアンサー1
はい、一部のシステムはまさにそうします。
FreeBSD / TrueOSパッケージjavavm
のコマンドjavavmwrapper
FreeBSD / TrueOSでJREに提供されるすべてのコマンドは、次の名前の/usr/local/bin/
シンボリックリンクです(appletviewer
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、および。checkvms
extcheck
idlj
jar
jarsigner
java
java-rmi.cgi
javac
javadoc
javah
javap
jcmd
jconsole
jdb
jdeps
jhat
jinfo
jjs
jmap
jps
jrunscript
jsadebugd
jstack
jstat
jstatd
keytool
manvm
native2ascii
orbd
pack200
policytool
registervm
rmic
rmid
rmiregistry
schemagen
serialver
servertool
tnameserv
unpack200
unregistervm
wsgen
wsimport
xjc
/usr/local/bin/javavm
リストの長さと通常、これらすべてのコマンドが同じJVMを使用すると予想していることは、Debian / Ubuntuが持っていることですupdate-java-alternatives
。少し単純化すると、これらの名前をすべて知り、次のすべてをupdate-java-alternatives
呼び出す1つのプログラムがあります。update-alternatives
それらを。 (Debian / Ubuntuシステムでは、すべてのコマンドを一度に設定するのupdate-alternatives
ではなく、単一のコマンド設定を使用して複数のコマンドにupdate-java-alternatives
異なるJREを呼び出すことができます。これはjavavmwrapper
FreeBSD / TrueOSメカニズムでは不可能です。)
FreeBSD / TrueOSjavavmwrapper
パッケージアプローチは、可能なすべてのコマンド名を含み、JRE間に変更があるときにシンボリックリンクを移動するのではなく、システム上のファイルシンボリックリンクの結果ではなく、実行時にプログラムで決定を下すラッパーを持つことです。
/usr/local/bin/javavm
まさにその包装紙です。それ
- 呼び出される名前(0番目の引数のデフォルト名)を決定します。
- ファイルから適切なJREルートディレクトリ名(および環境変数
/usr/local/etc/javavms
に設定されているユーザーのオペレーティングシステム、ベンダー、およびバージョン設定と一致する)を検索します。JAVA_OS
JAVA_VENDOR
JAVA_VERSION
JAVA_HOME
ルートディレクトリ名の値に設定します。${JAVA_HOME}/bin/${basename}
これらのいずれかで、または${JAVA_HOME}/jre/bin/${basename}
その中にある内容に従って自分自身を上書きします。
noshツールセットを含むサービスバンドル
noshツールセットを使用してサービスバンドラを作成するとき、システム管理者はDebian / Ubuntuなどのシステム、またはFreeBSD / TrueOSなどのシステムを使用して正しいJREを選択するためのrun
「汎用」コマンドを提供することを誰でも信頼できますあります。java
alternatives
javavmwrapper
#!/空/ノッシュ #HBaseに基づいて作成された分散および拡張可能な時系列データベース 機械環境 環境環境 ハード制限-o 65536 ソフト制限-oハード setuidgid——opentsdb sh -c "exec java ${JAVA_OPTS} -Xmx6000 -classpath \"${CLASSPATH}:${HBASE_CONF}\" -enableassertions -enablesystemassertions ${BIGTABLE_SUPPORT} -DLOG_FILE_PREFIX=/var/log/opentsDB/\"$ }\"-net.opentsdb.tools.TSDMain"
...またはツールセットのツールを使用することもできますfind-matching-jvm
。
#!/空/ノッシュ #HBaseに基づいて作成された分散および拡張可能な時系列データベース 機械環境 環境環境 ハード制限-o 65536 ソフト制限-oハード 一致するものを探す jvm --version 1.6 --version 1.7 --version 1.8 setuidgid——opentsdb sh -c "exec \"${JAVA_HOME}/bin/java\" ${JAVA_OPTS} -Xmx6000 -classpath \"${CLASSPATH}:${HBASE_CONF}\" -enableassertions -enablesystemassertions ${BIGTABLE_SUPPORT} -DLOG_FILE_PR var/log/opentsdb/\"${MACHINEID}\"- net.opentsdb.tools.TSDMain"
find-matching-jvm
タスクの一部を実行しjavavm
、環境変数ではなくコマンドラインオプションで駆動されるJREを選択し、より多くのJVM構成情報がどこから来るのかを知っています。それ
- 適切なJREのルートディレクトリ名(ユーザーが選択したオペレーティングシステム、ベンダー、およびコマンドラインオプションで設定されたバージョンと一致)を見つけ、ファイルがある場合は検索し、存在しない場合はディレクトリを検索し
/usr/local/etc/javavms
、/usr/lib/jvm
検索パスをハードワイヤーします。 、そうでない場合。 JAVA_HOME
ルートディレクトリ名の値に設定します。- チェーンは、残りのコマンドライン引数で指定された次のプログラムにロードされます。
例では、次のプログラム(実際には次のプログラム、1つのみ)はを使用するためのシェルです"${JAVA_HOME}/bin/java"
。
基本知識
ここでの理論的根拠は、ファイルシステムと一連のシンボリックリンクを使用して、通常のコマンド/usr/bin/java
から必要な特定のJREにマッピングすることにした決定をエンコードするか、構成情報を検索してプログラムで必要なJREを見つけるためのコマンドを提供することです。 Debian / Ubuntuの代替システムは前者を実行します。 FreeBSD/TrueOSのパッケージングシステムは後者を実装します。
ただし、noshサービスバンドラの例に示すように、ここには範囲がありますrun
。
環境JAVA_HOME
変数は仲介者として使用できる規則です。 (Java VMと言語自体にはこの環境変数は必要ありません。)JREを見つけて、そのルートディレクトリをJAVA_HOME
環境変数に入れ、常に直接呼び出す規則を使用できます。${JAVA_HOME}/bin/somecommand
これは確かに環境を設定する人々が.profile
採用したルールです。 XeはJAVA_HOME
xyrオプションに設定されており、すべてがルールに従って呼び出されると予想しています。 xeは、コマンド検索パスをxyrシェルに追加(同等)することによって実行されます。 ${JAVA_HOME}/bin/somecommand
${JAVA_HOME}/bin/
説明されているように、FreeBSD / TrueOSjavavm
ラッパーとnoshツールセットのfind-matching-jvm
ツール自体はこのルールを使用し、このルールがすでに使用中であることを知っている場合はそれを尊重します。JAVA_HOME
環境変数がすでに設定されていることがわかったら、自分で設定した点を含むすべての手順をスキップします。
Debian / Ubuntuの代替案ではそうではありません。環境変数を認識するシンボリックリンクを作成するのはかなり困難であり、代替システムは既に行われた決定(システム管理者update-alternatives
の一部として実行中に明示的または間接的にupdate-java-alternatives
)をシンボリックリンクにエンコードします/etc/alternatives/
。
だから重要です返品Debian/Ubuntu でPATH
include(同等)に設定します。${JAVA_HOME}/bin/
これが完了していない場合、java
findを呼び出す/usr/bin/java
と、事前に選択されたJREの代替システムのシンボリックリンクが検索されます。シェルのコマンド検索パスに明示的に追加された場合にのみ${JAVA_HOME}/bin/
直接検索できます。
追加読書
javavm
。 ユーザーマニュアル。無料BSD。 2005javavmwrapper
。 FreeBSDポート。- ジョナサンデボインポラード(2017)。
find-matching-jvm
。 スナックガイド。ソフトウェア。