Java はどのようにして Jar パッケージの展開とロードを学習するのでしょうか?

java -jar パラメータを使用してアプリケーションを実行するときにクラスパスを設定する方法 java -jar yourJarExe.jar を使用してパッケージ化されたアプリケーションを実行する場合、-classpath パラメータを設定する方法が表示されますが、アプリケーションは対応するサードパーティ クラスを見つけることができません。 。実際、これは、-jar パラメーターを使用して実行すると、Java VM がすべての外部クラスパスをシールドし、クラスの検索スコープとして yourJarExe.jar の内部クラスのみを使用するためです。

解決

拡張性クラスローダー

拡張クラス ローダーは通常、{Java_home}\jre\lib\ext ディレクトリに保存されており、Java を呼び出すときに拡張クラス パスが自動的に検索されます。このように、解決策は非常に簡単で、使用するすべてのサードパーティの jar パッケージを ext ディレクトリにコピーするだけです。透過的に読み込みカテゴリに入力されます。

注: 推奨されません。推奨されない場合は、すべての JRE を移行、統合、同期する必要があります。

BootStrap クラス ローダー拡張スキーム

-Xbootclasspath パラメーターを使用して、拡張された jar パッケージをロードします。

Java コマンド ラインを使用すると、bootStrap レベルのクラスを拡張する簡単な方法が提供されます。

-Xbootclasspath: 一般的には使用されない、基本的なコア Java クラス検索パスを完全に置き換えます。そうしないと、すべての Java コア クラスを書き換える必要があります (非推奨)。

-Xbootclasspath/a: コア クラス検索パスの後のサフィックス (推奨)

-Xbootclasspath/p: プレフィックスはコア クラス検索パスの前にあります。これは、不要な競合を避けるために通常は使用されません。(使用はお勧めしません)

構文は次のとおりです: (区切り文字はクラスパス パラメータに似ています。Unix では : 数値が使用され、Windows では ; 数値が使用されます。ここでは Unix を例に挙げます)

java -Xbootclasspath/a:/usrhome/thirdlib.jar: -jar yourJarExe.jar

ユーザークラス拡張スキーム

-jar を使用して実行可能 Jar パッケージを実行すると、JVM は Jar パッケージが配置されているディレクトリをコードベース ディレクトリとして設定し、すべてのクラス検索がこのディレクトリで開始されます。

したがって、他のサードパーティの jar パッケージが使用されている場合、より受け入れられる構成可能な解決策は、jar パッケージのマニフェスト拡張メカニズムを使用することです。

次のように進めます。

必要なサードパーティの jar パッケージを、実行可能 jar と同じディレクトリまたはサブディレクトリにコピーします。例: jar パッケージは /usrhome/yourJarExe.jar にあり、すべての jar パッケージを /usrhome ディレクトリまたは / にコピーできます。 usrhome/lib および同様のサブディレクトリ。

マニフェストファイルを変更する

次の行を Manifest.mf ファイルに追加します。

クラスパス:classes12.jar lib/thirdlib.jar

Class-Path は、実行可能 jar パッケージが依存するキーワードです。

Class-Path は、ローカル マシンの CLASSPATH 環境変数の単なる略語であることに注意してください。つまり、このプレフィックスを使用すると、jar 上のすべての CLASSPATH ディレクトリで、対応するサードパーティのクラス/クラス ライブラリを検索することになります。パッケージ実行マシン。

独自の jar パッケージ (またはネットワーク上) にある jar ファイルをクラスパス経由でロードすることはできません。

理論的に言えば、jar リリース パッケージには他のサードパーティ ライブラリを含めるべきではないためです (代わりに、使用説明書を通じて対応するサポート ライブラリを取得するようにユーザーに通知する必要があります)。

特別なニーズのため、他のサードパーティ クラス ライブラリ (jar、zip、class など) を直接パッケージ化し、独自の jar パッケージで一緒にリリースする必要がある場合は、カスタム ClassLoader を実装して、これらのサードパーティ ライブラリを、必要に応じてロードする必要があります。自分自身の意図のクラス ライブラリ。

記事の出典: ネットワークの著作権は原作者に帰属します

上記のコンテンツは営利目的ではありません。知的財産権に関する問題が含まれる場合は、編集者にご連絡ください。すぐに対処します。

おすすめ

転載: blog.csdn.net/xuezhangmen/article/details/132161009