問題タブ [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 - Oracle Enterprise Manager での新しい JAXB インスタンスの作成に関するヘルプ
サーブレット内に新しい JAXB インスタンスを作成しようとすると、jaxb.properties が見つからないという JAXBException が発生します。JAXBContext.newInstance() への呼び出しでクラスローダーを明示的に渡そうとしていますが、それを理解できません。
クラスローダーは次のとおりです。
JAXB で生成されたクラスは別のパッケージにあるため、私のサーブレットはパッケージ "com.xyz.ws" にあり、JAXB クラスはパッケージ "com.abc.123" にあります。`でサーブレットから新しいJAXBインスタンスを作成しています
(私も使ってみましたthis.getClass().getClassLoader()
)
java - Java では、例外クラスが必要になる前にクラスローダーで使用できるようにする必要があるのはなぜですか?
JAR を動的にロードするアプリケーションを開発しています。JAR には、使用する一連のクラスの定義が含まれています。動的にロードされた JAR にある例外派生クラスをキャッチしようとするまで、すべてがうまくいきました。
次のスニペットは問題を示しています (DynamicJarLoader
は実際に JAR をロードするクラスです。 と の両方TestClass
がMyException
外部 JAR にあります)。
実行しようとすると、次のようになります。
に置き換えるcatch(MyException e)
とcatch(Exception e)
、プログラムは正常に動作します。これは、JAR がすでにロードされた後にJavaが検出できることを意味します。TestClass
そのため、JVM はすべての Exception クラスをプログラムの実行開始時に定義する必要があり、それらが必要なとき (つまり、その特定の try-catch ブロックに達したとき) ではないようです。
なぜこれが起こるのですか?
編集
追加のテストをいくつか実行しましたが、これは確かにかなり奇妙です。これはの完全なソースですMyException
:
このコードは次のように実行されます。
これはしません:
NetBeans からテストを実行すると、すべてが計画どおりに進むことを指摘しておく必要があります。奇妙なことは、外部の Jar を Java の目から強制的に削除し、コマンド ラインからテスト アプリを実行したときにのみ始まります。
編集#2
答えに基づいて、私はこれを書きました。これは、私が受け入れたものが本当に正しいことを証明していると思います:
java - 実行時に外部jarからメソッドにアクセスするにはどうすればよいですか?
これは、投稿された質問の続きです:実行時にjarファイルをロードする方法
メソッド呼び出しレベルに進む方法がわかりません。私の理解では、clazzオブジェクトから、getMethodまたはgetDeclaredMethodを使用して、invokeを呼び出すメソッドオブジェクトを取得しました。もちろん、invokeにはインスタンスが必要です。それでは、サンプルコードでdoRunと呼ばれるものでしょうか?
mainとは異なるメソッドを実行したいのですが(run呼び出しで呼び出されるdoRunオブジェクトでmainであると仮定して)、doRun.run()メソッド呼び出しを実行する必要がありますか?
元の投稿をさらに明確にするために、次のように質問します。doRun.run()は、clazz型のクラスオブジェクトのインスタンスを実行する新しいスレッドを開始しますか?
私のためにこれを片付けるのを手伝ってくれてありがとう。
「how-should-i-load-jars-dynamically-at-runtime」(申し訳ありませんが、ハイパーリンクは1つしか許可されていません)を確認しましたが、これは、参照した最初の投稿のClass.newInstanceの悪意の警告に違反しているように見えました。
java - getClass().getClassLoader().getResourceAsStream が NullPointerException をスローしています
Javaでは、getClass().getClassLoader()はどのようにnullを返すことができますか?
- 「クラス」が配置されている jar は、common/lib の下には配置されていません。
- jar はブーストラップ ロードされていません。
jar 内のすべてのクラスの ClassLoader が null です。
java - JARファイル内のファイルの読み取り
import.sqlファイルを適切と思われる回数だけ分割できるように、Jarファイルのデータベーススクリプトを読み取ろうとしています。
たとえば、参照データを提供するプロジェクトまたはモジュールがいくつかあるので、各プロジェクトにそれを宣言するいくつかの個別のスクリプトがあります。大きなimport.sqlを1つ持つ代わりに、それを分割して読みやすくし、データを1つの場所に保持することでした。そのため、複数のWebアプリケーションプロジェクトがある場合、それらのファイルを再宣言して維持する必要はありません。別々に。
javassistに問題があると思います-与えられた名前を探すだけのヘルパークラス(モジュールではFileIO)を作成しました。次に、すべての一致について、構成の読み取り、データベーススクリプトの検索、行の読み取りを試みます。行ごとに、クエリを実行するために反復できるオブジェクトを返します。
(Seamプロジェクトから)そのヘルパークラスを呼び出すと、NoSuchMethodErrorが発生します。そのすべての機能を呼び出し元のSeamコンポーネントに戻すと、ほとんどの方法で機能します。最後の問題は、複数の構成ファイルがある場合、何らかの奇妙な理由で、URLが正しい構成ファイルを指していても、最初の構成ファイルのみが使用されるということです。
JBoss Seam 2.2.0.GA、Javassist 3.11.0.GA、およびHibernate EntityManager3.4.0.GAを使用しています。
シームコンポーネント
ヘルパーメソッド:
Java APIを適切に使用していますが、これはjavassistの問題ですか?任意の考えや提案をいただければ幸いです。
編集:StackTrace
ありがとう、ウォルター
ant - ant junitタスクを使用してカスタマイズ可能なクラスのロード順序はありますか?
Webアプリプロジェクトには、いくつかのjarファイルが含まれています。jarファイル内のクラスの1つの問題にパッチを適用するために、パッチソースフォルダー内のこのクラスの実装を変更しました。
tomcatにはクラスのロード順序が定義されているため(WEB-INF / WEB-INF / libの前のクラス)、パッチが適用されたバージョンのクラスは、jarファイルの元のバージョンではなくtomcatによってロードされます。したがって、アプリケーションをデプロイするとすぐに、すべてが期待どおりに機能します。
ここで、このパッチが適用されたクラスに対してantからjunitテストを実行します。したがって、元のjarファイルとパッチが適用されたクラスファイルの両方を保持するようにクラスパスを構成します。しかし、jarファイルからパッチが適用されていないバージョンではなく、パッチが適用されたクラスを最初にロードするようにantのjunitタスクに指示する方法はないようです。
問題を回避する方法はありますか?antのjunitタスクによってクラスがロードされる順序を決定する方法はありますか?パッチを適用したクラスをantからテストする他の方法はありますか?
java - JBossのどこからどのクラスがロードされたかを判別する方法
クラス名を入力し、それをロードしたクラスローダーと、クラスがロードされたリソースを確認できるJMXコンソールの関数を覚えているようです。残念ながら、私はこれを見つけることができないようです。スタンドアロンアプリの場合、私は常にJWhichツールを使用してこの情報を取得していました。
java - ClassLoaderがロードしたクラスを取得する方法はありますか?
古いフレームワークの単体テストを実装しようとしています。データベースレイヤーをモックアウトしようとしています。残念ながら、私たちのフレームワークは少し古く、ベストプラクティスを十分に使用していないため、関心の分離は明確ではありません。データベース層をモックアウトしようとすると、JVMが使用されない膨大な数のクラスをロードする可能性があるのではないかと少し心配しています。
私はクラスローダーをあまりよく理解していないので、これは問題ではないかもしれません。特定のClassLoaderがロードしたすべてのクラスでピークを迎えて、内部で何が起こっているかを証明する方法はありますか?
java - Quartz ジョブで Java クラスファイルの名前を動的にロードする
次のように Quartz JobDetail 行を設定すると、Java で記述された Quartz ジョブが正常に実行されます。
しかし、ジョブの詳細はデータベース テーブルに格納されているため、クラスを動的にロードしたいと考えています。だから私はこのようなものが欲しい:
sj はスケジュールされたジョブ オブジェクトであり、メソッド sj.getJobClassFile() は、クラス名をハードコーディングする代わりに、sj で定義されたクラスの名前を返します。
Java Class.forName メソッドの順列を試しましたが、成功しませんでした。