FreeBSD / TrueOSパッケージjavavmのコマンドjavavmwrapper

FreeBSD / TrueOSパッケージjavavmのコマンドjavavmwrapper

代わりに環境変数設定を使用できますか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、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、​、、、、、、、、、、および。checkvmsextcheckidljjarjarsignerjavajava-rmi.cgijavacjavadocjavahjavapjcmdjconsolejdbjdepsjhatjinfojjsjmapjpsjrunscriptjsadebugdjstackjstatjstatdkeytoolmanvmnative2asciiorbdpack200policytoolregistervmrmicrmidrmiregistryschemagenserialverservertooltnameservunpack200unregistervmwsgenwsimportxjc/usr/local/bin/javavm

リストの長さと通常、これらすべてのコマンドが同じJVMを使用すると予想していることは、Debian / Ubuntuが持っていることですupdate-java-alternatives。少し単純化すると、これらの名前をすべて知り、次のすべてをupdate-java-alternatives呼び出す1つのプログラムがあります。update-alternativesそれらを。 (Debian / Ubuntuシステムでは、すべてのコマンドを一度に設定するのupdate-alternativesではなく、単一のコマンド設定を使用して複数のコマンドにupdate-java-alternatives異なるJREを呼び出すことができます。これはjavavmwrapperFreeBSD / TrueOSメカニズムでは不可能です。)

FreeBSD / TrueOSjavavmwrapperパッケージアプローチは、可能なすべてのコマンド名を含み、JRE間に変更があるときにシンボリックリンクを移動するのではなく、システム上のファイルシンボリックリンクの結果ではなく、実行時にプログラムで決定を下すラッパーを持つことです。

/usr/local/bin/javavmまさにその包装紙です。それ

  1. 呼び出される名前(0番目の引数のデフォルト名)を決定します。
  2. ファイルから適切なJREルートディレクトリ名(および環境変数/usr/local/etc/javavmsに設定されているユーザーのオペレーティングシステム、ベンダー、およびバージョン設定と一致する)を検索します。JAVA_OSJAVA_VENDORJAVA_VERSION
  3. JAVA_HOMEルートディレクトリ名の値に設定します。
  4. ${JAVA_HOME}/bin/${basename}これらのいずれかで、または${JAVA_HOME}/jre/bin/${basename}その中にある内容に従って自分自身を上書きします。

noshツールセットを含むサービスバンドル

noshツールセットを使用してサービスバンドラを作成するとき、システム管理者はDebian / Ubuntuなどのシステム、またはFreeBSD / TrueOSなどのシステムを使用して正しいJREを選択するためのrun「汎用」コマンドを提供することを誰でも信頼できますあります。javaalternativesjavavmwrapper

#!/空/ノッシュ
#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構成情報がどこから来るのかを知っています。それ

  1. 適切なJREのルートディレクトリ名(ユーザーが選択したオペレーティングシステム、ベンダー、およびコマンドラインオプションで設定されたバージョンと一致)を見つけ、ファイルがある場合は検索し、存在しない場合はディレクトリを検索し/usr/local/etc/javavms/usr/lib/jvm検索パスをハードワイヤーします。 、そうでない場合。
  2. JAVA_HOMEルートディレクトリ名の値に設定します。
  3. チェーンは、残りのコマンドライン引数で指定された次のプログラムにロードされます。

例では、次のプログラム(実際には次のプログラム、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_HOMExyrオプションに設定されており、すべてがルールに従って呼び出されると予想しています。 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 でPATHinclude(同等)に設定します。${JAVA_HOME}/bin/これが完了していない場合、javafindを呼び出す/usr/bin/javaと、事前に選択されたJREの代替システムのシンボリックリンクが検索されます。シェルのコマンド検索パスに明示的に追加された場合にのみ${JAVA_HOME}/bin/直接検索できます。

追加読書

  • javavmユーザーマニュアル。無料BSD。 2005
  • javavmwrapper。 FreeBSDポート。
  • ジョナサンデボインポラード(2017)。find-matching-jvmスナックガイド。ソフトウェア。

おすすめ記事