問題タブ [classloader]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 実行時にJARファイルを動的にロードする方法は?
なぜJavaでこれを行うのは難しいのですか? 何らかの種類のモジュール システムが必要な場合は、JAR ファイルを動的にロードできる必要があります。独自の を書くことでそれを行う方法があると言われていますClassLoader
が、それは、JAR ファイルを引数としてメソッドを呼び出すのと同じくらい簡単なはずの (少なくとも私の考えでは) ための多くの作業です。
これを行う簡単なコードの提案はありますか?
java - java.util.Random にサードパーティ クラスの特定のシードを与えるにはどうすればよいですか?
サードパーティのクラス ファイル (私が書いていないクラス) をロードして実行する Java プログラムがあります。これらのクラスはjava.util.Random
、デフォルトで、インスタンス化されるたびにランダムな開始シード値を生成する を使用することがよくあります。再現性の理由から、これらのクラスには毎回同じ開始シードを与え、私の裁量でのみ変更したいと考えています。
明らかな解決策のいくつかと、それらが機能しない理由を次に示します。
サードパーティのクラスファイルで別のランダム クラスを使用します。ここでの問題は、クラス ファイルをロードするだけで、ソースを変更できないことです。
カスタム クラスローダーを使用して、JVM のバージョンの代わりに独自の Random クラスをロードします。
java
Java ではクラスローダーがパッケージ内のクラスをオーバーライドできないため、このアプローチは機能しません。rt.jar の
java.util.Random
実装を独自のものに交換するか、ファイルを JVM の信頼できる場所に置きます。これらのアプローチでは、アプリケーションのユーザーが自分のマシンにインストールされている JVM をいじる必要があり、役に立ちません。bootclasspath にカスタム
java.util.Random
クラスを追加します。これは技術的には機能しますが、この特定のアプリケーションでは、このアプリケーションはエンド ユーザーが IDE から実行することを目的としているため、実用的ではありません。アプリをユーザーにとって便利に実行できるようにしたいので、ブートクラスパスを強制的に設定するのは面倒です。これは、Eclipse などの IDE から実行することを目的としているため (デバッグを容易にするため)、スクリプトで非表示にすることはできません。
では、どうすればこれを行うことができますか?
java - 要求されたクラスとはまったく異なるクラスを返す Java ClassLoader を定義することは可能ですか?
私はこれを試しましたが、呼び出し時に ClassNotFoundException を取得します:
java - クラスローダーの問題-ロードされているライブラリバージョン(jarファイル)を特定する方法
私はちょうど別の*I-though-I-was-using-this-version-of-a-library-but-apparently-my-app-server-has-already-loaded-an-older-version-ofを解決しました-this-library- * issue(ため息)。
アプリケーションがすべての適切なjarファイルまたはロードされたクラスバージョンにアクセスできるかどうかを確認(または監視)するための良い方法を知っている人はいますか?
前もって感謝します!
[PS私の見解ではOSGiモジュールアーキテクチャを使い始める非常に良い理由です!]
更新:この記事も役に立ちました!ログファイルに書き込むことで、JBossのクラスローダーがどのクラスをロードしたかを知ることができました。
java - Javaでクラスをアンロードしますか?
デスクトップ アプリケーションが、通信する必要がある AppServer から動的にクラスのロードを開始できるように、カスタム クラス ローダーがあります。これを行うために必要な瓶の量がばかげているため、これを行いました(出荷したい場合)。実行時に AppServer ライブラリから動的にクラスをロードしないと、バージョンの問題も発生します。
今、私は 2 つの異なる AppServer と通信する必要があるという問題に遭遇し、最初にロードしたクラスによってはひどく壊れる可能性があることがわかりました.JVM を実際に強制終了せずにクラスのアンロードを強制する方法はありますか?
これが理にかなっていることを願っています
java - 実行時にjarファイルをロードする方法
実行中に新しいコード (拡張) をロードできる Java システムを構築するように依頼されました。コードの実行中に jar ファイルを再ロードするにはどうすればよいですか? または、新しいjarファイルをロードするにはどうすればよいですか?
明らかに、一定の稼働時間が重要であるため、既存のクラスを再ロードする機能を追加したいと考えています (複雑になりすぎない場合)。
私が気をつけなければならないことは何ですか?(実行時のクラスのリロードに関する質問と、新しいクラスの追加に関する質問の 2 つの異なる質問と考えてください)。
java - Thread.getContextClassLoader() == null?
Thread.getContextClassLoader()
null にすることはできますか? javadoc はあまり明確ではありません。
図書館はこのケースを考慮に入れる必要がありますか?
更新:私が尋ねた理由は、この場合は機能しないbeansbinding.dev.java.net
ためです(そして私のコードは機能しますsetContextClassLoader(null)
java - Java クラスのロード元を見つける
Javaクラスローダーが実際にクラスをロードする場所をプログラムで見つける方法を知っている人はいますか?
私はしばしば、クラスパスが非常に長くなり、手動検索が実際にはオプションではない大規模なプロジェクトに取り組んでいます。私は最近、2 つの異なる場所のクラスパス上にあるため、クラスローダが誤ったバージョンのクラスをロードするという問題が発生しました。
では、実際のクラス ファイルがディスク上のどこから来ているかをクラスローダーに教えてもらうにはどうすればよいでしょうか。
編集:クラスローダーが実際にバージョンの不一致 (またはその他の原因) のためにクラスのロードに失敗した場合はどうなりますか?
java - JavaでLinkageErrorsを処理するには?
XML ベースの Java アプリケーションを開発していると、最近 Ubuntu Linux で興味深い問題に遭遇しました。
Java Plugin Frameworkを使用する私のアプリケーションは、 dom4jで作成された XML ドキュメントをBatik のSVG 仕様の実装に変換できないようです。
コンソールで、エラーが発生したことがわかります。
この問題は、JVM の元のクラスローダーと、プラグイン フレームワークによってデプロイされたクラスローダーとの間の競合が原因であると考えています。
私の知る限り、フレームワークが使用するクラスローダーを指定することはできません。ハッキングすることは可能かもしれませんが、(何らかの理由で) Linux システムでのみ発生するため、この問題を解決するためのより積極的なアプローチを好みません。
あなたの 1 人がそのような問題に遭遇し、それを修正する方法、または少なくとも問題の核心にたどり着く方法を知っていますか?
java - 実行時の Java アノテーションのスキャン
注釈付きクラスのクラスパス全体を検索するにはどうすればよいですか?
私はライブラリを作成していて、ユーザーがクラスに注釈を付けられるようにしたいので、Web アプリケーションの開始時にクラスパス全体をスキャンして特定の注釈を探す必要があります。
Java EE 5 Web サービスまたは EJB の新機能のようなものを考えています。@WebService
クラスにorで注釈を付ける@EJB
と、システムはロード中にこれらのクラスを見つけて、リモートでアクセスできるようにします。