問題タブ [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 - スレッド化されたJavaアプリケーションで実行時にメインクラスを決定する方法は?
実行時に、アプリケーションが開始されたクラス名 (main() メソッドを含むクラス名) を特定したいのですが、別のスレッドにいて、スタック トレースが元のクラスにまでさかのぼりません。
システム プロパティと、ClassLoader が提供するすべてのものを検索しましたが、何も見つかりませんでした。この情報は入手できないだけですか?
ありがとう。
java - 有線でクラスを送信する方法
次の問題があります。タイプ(java.lang.Class)をネットワーク経由で送信し、反対側でクラスを「定義」したい。
私はそのように試しました:
および受信側:
したがって、明らかに、クラスの生のバイトコードを送信して、
しかし残念ながら、ロードされたクラスのバイトコードを取得する方法がわかりません。私は次のようなものを探しています:
これは標準のJDKでも可能ですか、それともそれを実行できる小さなライブラリがありますか?
java - どのクラスがどの JAR からロードされているかを調べる方法は?
実行時にどのクラスがどの JAR からロードされるかを判断する方法はありますか?
私たちは皆、以前に JAR 地獄にいたことがあると確信しています。私はこの問題に何度も遭遇し、プロジェクトのトラブルシューティングClassNotFoundException
やトラブルシューティングを行ってきました。NoClassDefFoundError
JAR 内のクラスのすべてのインスタンスを検索したり、コードで削除プロセスを使用して CNFE が原因を見つけたりすることは避けたいと思います。
この種の情報を提供するプロファイリングまたは管理ツールはありますか?
この問題は、クラスがロードされるときにこの情報が必要なため、非常に厄介です。そこにたどり着く方法、または記録して見つける方法がなければなりませんが、これを行う方法を私は何も知りませんよね?
OSGi とバージョン管理されたバンドル/モジュールがこれを問題にしないようにすることを目指していることは知っていますが、すぐになくなるわけではないようです。
注: この質問は、バージョン管理された jar からロードされたクラスに関連する私の質問のサブセットであることがわかりました。
多少関連するこの投稿では、JAR 内 (現在のディレクトリの下) または M2_REPO 内でクラスを検索する戦略について説明しています: JarScan、特定のクラスのすべてのサブフォルダー内のすべての JAR ファイルをスキャンします。
また、多少関連するJBoss Tattletale
java - 必要なJavaクラスのロード
現在、JVMでの実際のオーバーヘッドは、使用されない追加のクラスをロードするためのものであるかどうか疑問に思っています。
クラスパス内のすべてのクラスを繰り返して特定のインターフェイスを実装するクラスを見つけるコードがあり、それらをロードします。
これにより、カスタムクラスをディレクトリにドロップするだけで、ロードおよび登録できます。
副作用は、クラスパス内のすべてのクラスにヒットし、クラスがロードされることです。JVMメモリにどのような影響がありますか?
クラスをロードするだけでメモリに大きな影響がありますか?
java - java.policy ファイルを構成して、jvm クラスへのアクセスを拒否できますか?
jdk6\jre\lib\security\java.policy
appengine によってブラックリストに登録されているいくつかのクラスを作成するための禁止をファイルに追加したいと考えていました。たとえば、アプリケーションがインスタンス化しようとしたときに、ローカル jvm が例外をスローするようにしますjavax.naming.NamingException
。
可能です?
私はここで私の特定の問題を説明しようとします。Google が提供するサービス (GAE-google アプリ エンジン) では、使用できるクラスに制限があります。たとえば、javax.naming パッケージにある JNDI クラスはインスタンス化されません。また、私のマシンでこのアプリケーションをテストするために使用できるテストサーバーも提供していますが、このサーバーはそのようなクラスを許可し、コードを実行できます。アプリケーションを Google にアップロードして初めて、ブラックリストに登録されたクラスを使用したことがわかりました。そのようなクラスのブラックリストの強制が開発 jvm で実行できないかどうかを考えていました。そうでなければ、すでにそのようなポリシーファイルを提供している可能性があるので、これは簡単だと思います。
java - OSGi felix:ホストアプリケーションとバンドルの間でクラスを共有することは可能ですか?
ホストアプリケーション内で、setおよびgetメソッドを提供することにより、Vehicleという名前のクラスのインスタンスをOSGiワールドに転送するために使用される単純なpushServiceを実装しようとしました。サービスを使用できるようにするために、サービスインターフェイスとVehicleクラスの両方をjarファイルにエクスポートし、そのファイルをバンドル内にインポートしました。このファイルはサービスを使用する必要があります。
felixフレームワークとバンドルをインスタンス化するホストアプリケーション内でVehicleクラスを使用しようとするたびに、リンケージエラーが発生しました。次のブログエントリ(http://frankkieviet.blogspot.com/2009/03/javalanglinkageerror-loader-constraint.html)を読んだ後、このエラーが発生する理由を理解しました。しかし、私には自分の問題を解決する方法がわかりません。
ホストアプリケーションとOSGiインスタンスの間でクラスを共有することは可能ですか?jarファイルをインポートする代わりにリフレクションを使用する必要があるかもしれませんか?私はそのライブラリ(http://code.google.com/p/transloader/)を調べましたが、このライブラリが私の問題を解決できるかどうかはよくわかりません...
BR、
マーカス
java - JVM によってロードされたすべてのパッケージ名のリストを取得するにはどうすればよいですか
JVM によってロードされたすべての Java パッケージの名前を取得する必要があります。これは、IDE に見られるようなパッケージ ブラウザーを表示するためです。ClassLoader クラスの保護された「packages」フィールドにアクセスすることで、現在のクラスローダーとその祖先のパッケージ リストを取得できます。しかし、独自のクラスローダーを持っているため、他の webapps によって読み込まれたパッケージを取得できません。これをWeblogicサーバーでテストしています
groovy - GroovyrootLoaderがnull
EclipseからGroovyスクリプトを実行する場合、次の行を実行します。
無効である。コマンドラインから直接スクリプトを実行すると、これはnullではありません。なぜこれが起こるのかをどうやって知ることができますか?
java - 奇妙なクラスパス、.NoClassDefFoundError エラー
編集済み:ソリューションが見つかりました。これは奇妙で、最善の解決策ではありませんが、swt.jar と私のクラスがまったく同じ瞬間に同じ方法でロードされるように、先に進んで MY JAVA CODE (com.*) のクラスを swt.jar に入れました。クラスローダー。最善の解決策ではありませんが、一時的な修正です
編集: ここにほとんどのコードを追加しました: http://groups.google.com/group/clojure/browse_thread/thread/1d7dd4913b2f9aa7 http://groups.google.com/group/clojure/web/NoClassDefIssue.zip http: //groups.google.com/group/clojure/web/MostCodeIssue.java
これは奇妙な no classdef not found エラーです。これは、私のコードの動作の 90% が少し異なるシナリオです。Clojure を使用していることを無視してください。通常の Java コードでもこれを実行しましたが、同じエラーが発生します。
理想的には、カスタム クラスローダーに関するヘルプを期待していました。私の最初の考えは、クラスローダーを作成し、jar のファイルパス/URL をクラスローダーに追加して、コードを起動できるということでした。しかし、どうやら奇妙なことが起こっているようです。
4〜5個の補助jarファイルを動的にロードするjarファイルが1つあります。シンプルな URLClassLoader に基づいて構築されています。ユーザーが 1 つの jar ファイルをクリックしてアプリケーションを起動できるため、これを実行したいと考えています。そのため、ユーザーが心配しなければならない項目が 1 つあります。
この jar ファイルをクリックすると、アプリケーションはファイルシステムから jar ファイルをロードします。たとえば、アプリケーションは swt.jar (Eclipse のウィジェット ツールキット) とその他の jar をロードします。
3 (しかし心配しないでください)、私のアプリケーションは Clojure (動的プログラミング言語) で構築されています。最初に起動するアプリケーションはこの Clojure スクリプトです。私のアプリケーションのほとんどは、clojure スクリプト内にあります。
4. 1 ~ 3 まではすべて問題なく動作します。アプリケーションがロードされ、clojure スクリプトが実行され、SWT GUI アプリケーションが実行されます。
ここが動かない部分です。
既存の Java ライブラリがあり、それを my-swt-gui.jar と呼びます。それもswtアプリケーションです。基本的に別のGUIアプリケーションがすでに構築されています。現在の clojure/swt アプリケーションからウィンドウをロードしようとしています。何らかの理由で、JAVA 指向のライブラリが SWT を認識せず、noclassdef エラーが発生します。
ここが奇妙です。そして、どこに奇妙な点があると思われるかを特定します。
エンティティ: A. Java 指向のクラスローダー。Java クラスローダーで、clojure アプリケーションを起動します。SWT およびその他の jar ファイルは、このクラスローダーでロードされます。B. セクション エンティティによって呼び出される Clojure 指向のコード clojure コードは、swt ベースの GUI アプリケーションです。B は正常に動作します。C. 別の GUI ウィンドウを含む Java コード。何らかの理由で、このライブラリが読み込まれず、noclassdef というエラーが発生します。
注: 私は、SWT クラスが実際にクラスパスにあることを知っています。そうしないと、NoClassFound 例外が発生します。私はその例外を受けていません。他にも何かが起こっています。
注: SWT に win32 dll が含まれていることも問題でしょうか? おそらく、win32 dll jar へのアクセスは初めて機能しますが、Java コードでは機能しませんか? しかし、それは奇妙です。SWT が機能し、その後機能しないのはなぜですか?
すべてのコードをお見せすることはできませんが、関連する部分をお見せできれば幸いです。
メインのクラスローダー コードは次のとおりです。
そして、これがJava swtウィンドウをロードしようとした方法です。クラスローダーについてできるだけ多くを印刷して、別のクラスローダーに変更しようとしました。
public static final void createPDFWindowShell(IStartService service, final Object shell, final Object globalClassLoader) throws Exception {
}
エラーは次のとおりです。
-