問題タブ [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 にロードされたクラスの数
そこにロードされたクラスの数が常に増加しているというプログラムがあります。
これは実際にどのようになるのでしょうか? または、クラスローディングについてJavaで何か誤解していますか?
これは、jConsole からの一晩のスニペットです。
代替テキスト http://img200.imageshack.us/img200/200/classesp.jpg
このような一定のクラスローディングの増加の考えられる理由を教えてください。それともこれは正常ですか?
ありがとう
jvm - Websphere 6.1(IBM JVM)でクラスローダーアドレスが変更されたのはどうしてでしょうか。
連続するjavacoreダンプで、クラスローダーのアドレスがWebsphere 6.1(IBM JVM 1.5.0)で変更されていることを確認しました。クラスローダーの下のクラスのアドレスは変更されていません。それで、それは新しいアドレスの同じクラスローダーではありませんか?
たとえば、最初のjavacore
2CLTEXTCLLOADローダーcom/ibm / ws / classloader / CompoundClassLoader(0x00002AAABF5BB7F0)
3CLTEXTCLASS org / eclipse / emf / ecore / EObject(0x00002AAB24684B30)
そして後のjavacoreで
2CLTEXTCLLOADローダーcom/ibm / ws / classloader / CompoundClassLoader(0x00002AAABF5AB6E0)
3CLTEXTCLASS org / eclipse / emf / ecore / EObject(0x00002AAB24684B30)
以前は0x00002AAABF5BB7F0のクラスローダーの下にあった同じクラスでしたが、現在はクラスローダーが0x00002AAABF5AB6E0にあります。
私はクラスのアンロードの問題を理解しようとしていますが、これはヒープダンプを掘り下げるときに生活を楽にするようには見えません。
java - jarからクラスを抽出するときのClassNotFound例外
.jarファイルからクラスを取得しようとして失敗しました。.jarはC:\ CTF.jarにあり、CTFという名前のフォルダーに.classファイルCaptureTheFlagRulesが含まれています。次のコードは機能しません。
コードは、forName()呼び出しでClassNotFoundExceptionを通過します。クラスを受講するには何をする必要がありますか?
java - Javaagent クラスのアンロード
バイトコードを計測する Java エージェントがあります。Java 6 でアタッチ API を使用して、ユーザーが Java エージェントを使用してエージェントとインスツルメントおよびインスツルメンテーション コードを動的にロードできるようにしています。Boot-Class-Path マニフェスト属性を使用して、javagent クラスがブート クラスパスにあることを確認し、ユーザーが ArrayList などのクラスを計測できるようにしています。
ただし、バージョン管理には問題があります。ユーザーがエージェントのバージョン 1 を動的にアタッチするとします。次に、彼にバージョン 2 を渡しました。彼が私のエージェントのバージョン 1 をアタッチして以来、彼のアプリケーション サーバーはシャットダウンされていないため、バージョン 1 のクラスがまだロードされています。
私のクライアント バージョン 2 の javaagent がバージョン 1 をアンロードするような方法が必要です。
javaagent のクラスの顧客クラスローダを作成し、クラスローダの参照を null に設定する方法があることはわかっています。ただし、その場合、クラスローダーはブートクラスローダーの階層の下にあるため、ブートクラスパスでクラスを計測することはできません。したがって、ユーザーは ArrayList のようなクラスを計測できません。エージェントのクラスのメソッドは、ブート クラス ローダーからは見えません。
ブート クラスパスの問題を解決し、以前のエージェントのクラスをアンロードする方法はありますか?
jboss - 戦争中のジャー - NoClassDefFound 例外
jboss に app1.war と app2.war として 2 つのアプリをデプロイしました。これら 2 つのアプリは、myPackage などの共通の Java パッケージを使用します。以前の私の戦争はこのように見えました
================================================== ======================
app[12].war/
-----web.xml
-----アプリ固有のクラス (.class ファイルなど)
-----appClass1.class
-----appClass2.class など
-- ---WEB-INF/ ------
myPackage/ (これはただの戦争下のフォルダーであり、jar パッケージではありません) ----------
----
のような共通パッケージに属するクラス
------common_class1.class
----------common_class2.class
----------。
----------。
================================================== =====================
しかし、これは両方の共通クラスのセットがまったく同じ名前などを持つため、両方の war ファイルで問題を引き起こしました。そこで、共通パッケージを jar ファイルとしてコンパイルし、それを各 war ファイルの WEB-INF/lib にドロップすると、war ファイルは次のようになります。
================================================== ==========================
app[12].war/
-----web.xml
-----アプリ固有のクラス (.class ファイルなど)
-----appClass1.class
-----appClass2.class など
-- ---WEB-INF/
----------lib/
----------myPackage.jar (これは jar パッケージになりました)
---------- myPackage/
---------------共通パッケージに属するクラス
---------------common_class1.class
-------- -------common_class2.class
---------------。
---------------。
================================================== ==========================
しかし今、myPackage.jar でクラス ファイルにアクセスする必要があるアプリ固有のクラスは、java.lang.ClassNotFoundException 例外をスローします。
イライラする 3 ~ 4 時間 Google で検索しましたが、この特定の問題に対処するものは何もありませんでした。私はおそらくとんでもないことをしている。誰でも私を助けてください。
PS: JBOSS 4.2.3 で戦争を展開しています
ありがとうございます。〜マノジ
junit - Eclipse RCP: Eclipse galileo (4.5.0) に同梱されているものとは異なる JUnit バージョン (4.3.1) を使用する
ハロー、
次のような状況があります。
Eclipse RCP アプリケーションを開発しており、Eclipse 3.4 からEclipse 3.5に切り替えたいと考えています。JUnit-Tests は JUnit 4.3.1 を使用しており、テスト スイートを開始するための起動構成があります。ここで詳しく説明する必要はないと思います。
問題は:
Eclipse 3.5 でテストを実行しても機能しません。JUnit はテスト クラス ((at)Test でも (at)RunWith でもない) で注釈を見つけることができません。
何が起こっているのかを確認するために、いくつかのログ出力でjunitライブラリにパッチを当てました。この問題はクラスローディングの問題であることがわかりました。
JUnit に渡されたテスト クラスは、JUnit が「RunWith」などの注釈クラスをロードするために使用するものとは異なる ClassLoader に「あります」。これはEclipse 3.4には当てはまりません
最初の行は、2 行目とは別のクラスローダーを出力します。JUnit はテスト クラスの注釈を Annotation-Class (ここでは RunWith.class) と一致させることができないため、これは問題です。CL1 の "RunWith" は CL2 の "RunWith" と等しくありません。
中心的な問題を指摘する解決策があります: JUnit バージョンが 1 つだけになるように、Eclipse Galileo の JUnit 4.5 を JUnit 4.3.1 に置き換えます: テスト実行クラスとテスト クラスは両方とも JUnit 4.3.1 を使用しています ( 「org.eclipse.jdt.junit4.runtime」にパッチを適用して、以前のjunitバージョンを受け入れるようにします)。
テスト クラスの JUnit 4.3.1 をバージョン 4.5 に置き換えることもできると思いますが、それはまだオプションではありません。
推測: クラスが異なる JUnit-Bundle に「由来する」ため、クラスローダーが異なります: バージョン 4.3.1 からの注釈を含むテストクラスと、バージョン 4.5 で実行されるテスト
私が知りたいこと: Eclipse にパッチを適用する (JUnit バージョンを置き換える) 以外に解決策はありますか? コマンドライン引数などはありますか? Eclipse に JUnit 4.3.1 を強制的に使用させるための設定はありますか?
上記の分析に関するヒントは大歓迎です!
jpa - OSGi 環境では、クラスパスとクラスローダーはどのように設定されていますか?
OSGi でのクラスの可視性について混乱しています。Apache Felix を実行しており、次のバンドルをロードしています。
- 、
antlr
、asm
およびeclipselinkjpa
のバンドルcore
javax.persistence
1.99用の OSGi-fied jarcom.mysql.jdbc
ドライバーを含む OSGi-fied jar- 注釈付きのエンティティ クラスと
persistence.xml
- 呼び出す私自身の別のバンドル
Persistence.createEntityManagerFactory(String, Map)
さて、私が混乱しているのは、どのバンドルが MySQL ドライバーを認識できる必要があるかということです。これは EntityManagerFactory を作成するバンドルだと思っていましたが、そのマニフェストにインポートすると ClassNotFound エラーが発生します。jpa
次に、eclipselinkバンドルのマニフェストからインポートしようとしましたが、やはり失敗しました。永続化ユニット (エンティティ クラスおよびpersistence.xml
) を含むバンドルのマニフェストからインポートした場合にのみ機能します。
そのため、PU のバンドルのクラスローダによってデータベース ドライバが検索されているように見えますが、それは私には意味がありません。どうしたの?
これに関する簡単なドキュメントが見つからないようです。これらのスライドはいくつかのヒントを提供しますが、完全に網羅しているわけではありません。
java - 「通常の」状況で Java クラスローダがどのように機能するか (クラスローダの非明示的な使用)
クラスパスの動的変更を検討しています。うまく機能する解決策を 1 つ見つけましたが、それは addURL() への明示的な呼び出しを使用して行われます。(おそらく起動時)
ただし、デフォルトのクラスローダーがクラスを見つけられないように見える場合は、実行時にクラスローディングプロセスをインターセプトしてクラスを見つけたいと思います。ClassLoaderをサブクラス化してデフォルトに委譲findClass()
し、これらのメソッドが呼び出されたことを示すデバッグ行を出力しようとしましたが、クラスが暗黙的なクラスローディングloadClass()
を介して依存クラスを使用している場合、それらが呼び出されることはありません。
このような状況でクラスローディングはどのように機能しますか? (対 Classloader.loadClass() が明示的に呼び出される単純なケース)
以下は、カスタムクラスローダーでの私の試みです。の引数リストを指定して DynClassLoader0.main() を使用し、{"some.package.SomeClass", "foo", "bar", "baz"}
some.package.SomeClass が外部の .jar ファイルにある他のクラスを参照する場合、上記のメソッドのいずれかを使用すると、なぜ私の DynClassLoader0 の findClass() および loadClass( ) 呼ばれる?loadClass が呼び出されるのは、以下の main() 関数で loadClass を明示的に呼び出したときだけです。
編集:私はすでにこれらの質問を見てきました:
編集: kdgregory が以下で言っていることは正しいと思いました。クラスローダーを明示的に使用すると ([***]
コメントとしてコード内の行を参照)、そのクラスから実行されるすべてのコードは、同じクラスローダーから暗黙的なクラスローディングを引き起こします。しかし、私の DynClassLoader0.loadClass() は、最も外側の明示的な呼び出し以外では決して呼び出されません。
apache-flex - getDefinitionByNameからの奇妙な動作
渡された名前に基づいてサブクラスをロードするクラスを作成しました。この関数はgetDefinitionByNameを使用し、クラスタイプを取得してインスタンス化し、クラスがこのメソッドを所有するクラスのサブタイプである場合はそれを返します。サブタイプは、コントロールのインスタンス化を簡素化するために、基本クラスを拡張するすべてのmxmlファイルです。
ただし、完全修飾名を渡すと、単体テストでは機能しますが、アプリケーションのコンテキストで実行すると失敗します。getDefinitionByNameに、実行コンテキストごとに異なる動作をさせる落とし穴はありますか?修飾名でクラスをロードする簡単な方法はありますか?
java - クラスパス上のパッケージやクラスのリストを取得するにはどうすればよいですか?
Java では、ClassLoader を使用して、既にロードされているクラスのリストとそれらのクラスのパッケージを取得できます。しかし、ロードできるクラス、つまりクラスパス上にあるクラスのリストを取得するにはどうすればよいでしょうか? パッケージも同様。
これはコンパイラ用です。foo.bar.Baz を解析するとき、foo が他のものと区別するためにパッケージであるかどうかを知りたいです。