問題タブ [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 - コンテキスト クラスローダーで JDK6 ToolProvider と JavaCompiler を使用するにはどうすればよいですか?
私の使用例は、JDK 6 で提供される ToolProvider および JavaCompiler クラスを使用して、Java プログラムから生成されたソース ファイルをコンパイルすることです。ソース ファイルには、コンテキスト クラスローダー (J2EE コンテナーで実行される) 内のクラスへの参照が含まれていますが、システム クラスローダー内には含まれていません。私の理解では、デフォルトでは、ToolProvider はシステム クラスローダーを使用して JavaCompiler インスタンスを作成します。
JavaCompiler が使用するクラスローダーを指定する方法はありますか?
IBM DeveloperWorks の何かを変更して、このアプローチを試しました。
FileManagerImpl は次のように定義されています。
スタックトレースは、アノテーション処理中に一度だけ呼び出されたことを示しています。コンパイルするソース ファイルで参照されているクラスがシステム クラスパス上になく、コンテキスト クラスローダーから使用できることを確認しました。
java - 長時間実行されるTomcatプロセスのClassLoadersの問題
Tomcat 6.0.18でWebアプリケーションをホストし、次の問題が発生しました。
WebApp1とWebApp2の2つのWebアプリがあり、どちらも同じシステムですが、バージョンが異なります。
ここで問題となるのは、Tomcatが1週間以上実行されている場合、システムがNoClassDefFoundErrorを返すことがあります。また、WebApp1のクラスローダーがWebApp2のjarに存在するクラスをロードするという奇妙な問題が発生しました。同じjarがWebApp1にも存在しますが、バージョンが異なります。
Tomcatを再起動すると、すべてが正常に機能し始めました。JREは1.5.10です
このような問題が発生した場合はお知らせください。
よろしく、ジャタンポレチャ
java - Javaでトップレベルクラスなしで非トップレベルクラスにアクセスする
TestThis.java
次のようなJava ファイルがあります。
上記のコード ファイルは、警告やエラーなしで正常にコンパイルされています。A
クラスのいずれかにアクセスする方法、またはB
他の外部クラスからトップレベルのクラスなしでアクセスする方法はありますか?
そうでない場合、なぜJavaはトップレベルクラスなしでそのようなファイルのコンパイルを許可するのでしょうか?
java - パッケージ化されたWebアプリケーションにjsp-apiおよびservlet-apijarをロードするためのアプリケーションサーバーの動作のオーバーライド
特定のバージョンのjsp-apiおよびservlet-apijarファイルを使用してプロジェクトをビルドおよびパッケージ化しています。ここで、Tomcat、WAS、Weblogicなどの任意のアプリケーションサーバーにWebプロジェクトをデプロイするときに、これらのjarをロードする必要があります。
私がtomcatで見た動作は、これらのAPIのパッケージ化されたバージョンが問題のあるクラスと一緒にロードされていないというメッセージを表示することです。
これらのサーバー設定または動作をオーバーライドする方法はありますか?
私の懸念は、サーバーのデフォルトの動作を許可すると、サーバーごとに、または同じアプリサーバーのバージョンごとに異なる動作が許可される可能性があることです。
java - デフォルト以外のパッケージとネストされたフォルダのないクラスファイルを動的にロードする
私はJavaを初めて使う学生のためのカリキュラムプロジェクトを書いています。そのようにフォルダ構造を持っています。
jarがsolutions/my /実際/long/package/ディレクトリ内のすべてのクラスをロードできるように取得しました。クラスパスに「solutions/」を追加します。
私の質問は、デフォルトのパッケージを使用せずにパッケージ用の長いネストされたフォルダがないように設定できるかどうかです。
結果の構造は次のようになります
ただし、MySolutionクラスにはデフォルトのパッケージがありません。
java - 実行中の JVM で実行中のインスタンスを見つける
特定のクラスの実行中のインスタンスでハンドルを取得できるかどうか疑問に思っています。これを引き起こした特定の問題は、多数の実行中のスレッドが原因で適切に終了しないアプリケーションでした。
はい、スレッドをデーモン化できることはわかっています。そうすれば、スレッドはアプリケーションの終了を妨げません。しかし、これが可能かどうか疑問に思いました。私ができる最も近いのはクラスローダー(保護されています!)findLoadedClassですが、これを行うには独自のクラスローダーを実行する必要があります。
関連して、これはプロファイリング ツールがオブジェクト ハンドルを追跡する方法ですか? 独自のカスタムクラスローダーを実行することによって? または、私が見ていない素敵なトリッキーな方法はありますか?
java - Javaでは、Class.forNameはnullを返すことができますか?
Java では、Class.forName は null を返すことができますか?それとも、クラスが見つからない場合は常に ClassNotFoundException または NoClassDefFoundError をスローしますか?
java - Javaでは、クラスがすでにロードされているかどうかを知ることは可能ですか?
Java クラスをロードしようとせずに、Java クラスがロードされているかどうかを知ることはできますか? Class.forName
クラスをロードしようとしますが、この副作用は望ましくありません。別の方法はありますか?
(クラスローダーをオーバーライドしたくありません。比較的単純な方法を探しています。)
java - 自分のクラスローダー?
これが私が遭遇している問題です。Java 1.3 で実行され、MyAPI v1.0 などの外部 API を使用する巨大なレガシー アプリケーションがあります。MyAPI 1.0 の正確な実装は、アプリが使用するクラスパスのどこかにあります。そのアプリが外部コードを使用できるようにするメカニズムもあります (ある種のプラグイン メカニズム)。現在、MyAPI v2.0 (v1.0 との 100% 下位互換性はありません) を使用する別の Java ライブラリ (MyLib.jar) があり、そのプラグイン メカニズムを使用して元のアプリから使用する必要があります。そのため、どうにかして、同じ API の 2 つの (互換性のない!) バージョンを連携させる必要があります。具体的には、API クラスが MyLib.jar クラスから呼び出される場合は MyAPI v2.0 を使用し、それ以外の場合はすべて MyAPI 1.0 を使用したいと考えています。
MyAPI 1.0 はクラスパスにあるので、デフォルトで使用されます。それで問題ありません。MyAPI 2.0 からクラスをロードする独自のバージョンのクラス ローダーを作成できます。問題ありません。しかし、どうすればすべてを合わせることができますか?質問:
MyLib.jar オブジェクトは、MyAPI 2.0 からのクラスの多くの (!) インスタンスをインスタンス化します。これは、これらすべてのインスタンス化をリフレクション (自分のクラスローダーを指定) を介して行う必要があるということですか? とんでもない作品だ!
MyAPI 2.0 オブジェクトの一部がインスタンス化され、MyAPI から別のオブジェクトを内部的にインスタンス化する場合、どのクラスローダーを使用しますか? クラスローダーまたはデフォルトのクラスローダーを使用しますか?
一般的に、私のアプローチは合理的に聞こえますか? より良い方法はありますか?
java - Linux では Java クラスローディングが失敗するのに、Windows では成功するのはなぜですか?
Jetty でデプロイされた Java Web アプリケーション (Spring を使用) があります。Windows マシンで実行しようとすると、すべてが期待どおりに機能しますが、Linux マシンで同じコードを実行しようとすると、次のように失敗します。
でアプリを実行しました。java -verbose:class
その出力によると、最初の例外がスローされる直前に、/WEB-INF/lib の log4j JAR から org.apache.log4j.Category がロードされます。
現在、2 つのマシンの Java バージョンはわずかに異なります。どちらのマシンにも Sun の Java があり、Linux マシンには 1.6.0_10 があり、Windows マシンには 1.6.0_08 か、または 07 または 06 があります。正確な番号は今思い出せず、手元にマシンがありません。 . しかし、Java のマイナー バージョンがわずかに異なっていても、コードがこのように壊れることはありません。誰かがここで何が悪いのか理解していますか?