問題タブ [urlclassloader]
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 - defineClassを使用してバイトからクラスを動的に作成する
:URLClassLoader
を含む派生クラスローダーを使用してこれを実行できるはずです。loadClass()
次に、クラスファイルからバイトを読み取り、上記のloadClassメソッドを呼び出します。私はこれを手に入れます:
java.lang.NoClassDefFoundError: com/samples/SampleClass (wrong name: com/samples/SampleClass)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.lang.ClassLoader.defineClass(ClassLoader.java:465)
奇妙なことに、名前と「間違った名前」は同じです。そして、どちらも正しいパッケージです。
NoClassDefFoundError
正しい予想される名前を取得するにはどうすればよいですか?そして、これを行うことは可能defineClass
ですか?
クラス名なしで非推奨のフォームを使用すると、完全に機能します。
ありがとう
class - Java 動的クラスのロードは Windows では失敗しますが、Linux では正常に動作します
jar ファイルからクラスを動的にロードしようとしています。Ubuntu Linux ボックス (Sun Java Version 1.6.0_24 (b07)) では問題なく動作しました。
Windows (Windows 7、Java バージョン "1.6.0_14") で同じことを実行しようとすると、Class Not Found 例外で失敗します。
以下はコードです:
Linux での実行中、jar はルートに配置され、Windows では c:\ に配置されます (ソースとバイナリは C:\ のフォルダーにあるため、"/sqljdbc4.jar" は Windows では c:\sqljdbc4.jar に解決されます。両方のプラットフォームで正しい jar の場所がクラスローダーに渡されるようにしました。
以下は、Windowsで取得したスタックトレースです
注:これを試してみる必要がある任意のjarを使用できます。私はMS SQL Server JDBC Driver jarで遊んでいました。
ありがとう !
-アビジート。
jms - 親 CL で子 CL JMS インターフェースを使用可能にするために必要な狡猾なクラスローダー ソリューション/ハック
私はマルチベンダーの JMS アダプターを作成していますが、いくつかのばかげたライセンスの問題により、狡猾なクラスローダー ソリューション/ハックの必要性が生じました。きれいにはなりませんが、専門家から独創的なアイデアを聞きたいと思っています。そこのクラスローダーハッカー...
アーキテクチャは単純です。アダプタはすべてのコードをシステム クラスローダに格納し、Sun の J2EE javax.jms.jar からのインターフェースを多用し、クラスパス情報に基づいて子 URLClassLoaders にこれらのインターフェースの個々の JMS プロバイダーの実装をロードします。一部の XML 構成ファイルからロードします。
これは、Sun の J2EE JMS jar が再配布を妨げる非常に煩わしいライセンスによって管理されていることに気付くまで (含まれているのは業界標準のインターフェイスだけであるにもかかわらず!)、システム クラスパスに単純に置くことができないことに気付くまで、すべて正常に機能していました。箱から出して私たちのコードと一緒に。しかし、顧客が Sun の Web サイトから jar を見つけてダウンロードし、それをインストールの適切な場所にコピーして機能させるように強制された場合、エンドユーザーのエクスペリエンスは非常に粗末なものになります。私たちがロードしている JMS プロバイダーの実装は、必ず私たち自身の JVM に既にロードされているすべてのインターフェースを持っていることを考えると、顧客にそのような苛立ちを強要するのは恥ずべきことです - 唯一の問題は、それらがプロバイダー固有の子クラスローダーにあることです。彼らの意味
ですから、これを解決するための巧妙なアイデアを聞きたいです (可能であれば!)。
たとえば、システムのクラスローダーを使用するのではなく、カスタマイズされた urlclassloader サブクラスにメイン クラスをロードしようとして (ただし、既存の MANIFEST.MF クラスパス参照の効果を再現する必要があることを考えると、それはかなりの苦痛になるでしょう)、そのクラスローダーを与えることについて疑問に思いました。子クラスローダーの 1 つへの参照 (XML 構成を解析した後) で、子から "javax.jms.*" インターフェイス (のみ) をロードできます (通常の親優先ポリシーを覆し、ベンダーを無視します)。 - 親にロードしてはならない同じ jar 内の特定のクラス)。これが実行可能である可能性が高いかどうか、および誰かが指針を持っているかどうか疑問に思っています。私' 欠落している JMS インターフェースを参照するメソッドがあるにもかかわらず、メイン CL の一部のアダプター クラスが正しくロードされることに気付きました (ただし、これらのメソッドが呼び出されると明らかに失敗します)。これらのクラスを含む CL にそのようなメソッドが呼び出されるまでに (ただし、クラスがロードされた後) JMS インターフェースにアクセスすると、それは機能しますか? (というかもう遅いのか…)
(参考までに、いくつかの有用なコンテキストを提供しますが、この指定された問題を完全には解決しない2つの関連するスタックオーバーフローの投稿をすでに見つけました:How do you change the CLASSPATH within Java? and How do I create a parent-last / child-first ClassLoader in Java ? 、または親 CL に既にロードされている古い Xerces バージョンをオーバーライドする方法は? )
これを手伝ってくれてどうもありがとう!:)
java - 特定の URL から Spring ロード クラスを作成するにはどうすればよいですか (Bean のインスタンス化のため)。
Bean のインスタンス化中に特定の URL からクラスをロードするように Spring に指示する方法はありますか? クラスパスにない場所からクラスをロードする必要があります。純粋な Java を使用している場合は使用できますURLClassLoader
が、Spring でこれを実現するにはどうすればよいですか? Spring 3.0を使用しています
java - パッケージを指定せずにフォルダーからクラスをロードする
抽象クラスを使用して、人々が独自の実装を作成できるようにするアプリケーションがあります。これらの実装をディレクトリから .class-files としてロードします。現在、私はこの解決策を持っています:
ご覧のとおり、クラスを正しくロードするには、クラスが配置されているパッケージを指定する必要があります。パッケージを省略すると、
エラー。
さて、アーキテクチャの視点から、他の人が設計したクラスをロードするときに MY パッケージにコンパイルする必要があるのは、非常に不適切な設計だと思います。
だから私はあなたに尋ねます:クラスが存在するパッケージを指定せずに、ファイルシステムからクラスをロードできる方法はありますか?
java - Javaは、System ClassLoaderによって別のクラスによってすでにロードされているクラスをロードする方法はありますか?
(ひどいタイトル、私は知っています)
これを説明する最善の方法は、実行時に URLClassLoader からロードされるいくつかのクラスをロードする必要があるということです。これらのクラスは、システム ClassLoader によってすでにロードされているクラスのインスタンスへの参照を持ち、再ロードできないためです。他のいくつかの問題の。
また、System ClassLoader を使用してクラス パス内の jar からクラスをロードできるようにコードを変更したいと考えていますが、それはできませんでした。
java - Java System ClassLoader (URLClassLoader なし) を使用して、クラスパス内の jar からクラスをロードする方法は?
そのため、クラスパスの jar から System ClassLoader を使用して実行時にいくつかのクラスをロードする必要がありますが、試行するたびに ClassNotFoundException が発生します。System ClassLoader を使用すると、xyclassineed (x と y はパッケージ) を実行できますか?それとも、それが可能であると仮定して、pathtox.xyclassineed のようにする必要がありますか?
java - ClassLoaderを使用したJavaの例
小さな問題があります。私はJavaSEを学び、クラスClassLoaderを見つけました。以下のコードで使用しようとしています。URLClassLoaderを使用して、実行時にクラスを動的にロードしようとしています。
Java仮想マシンはクラスを認識せず、次の例外が発生します。
私がこの問題を解決する方法を知っていますか?
java - サードパーティのクラスローダーがクラスをロードできないようにする
サードパーティのコードを呼び出しています
クラスをロードするクラスローダーがあります。特定のクラスをロードできないようにすることは可能ですか? また、私が呼び出している第3部プログラムが複数あり、子クラスローダーが最初に親に委任する方法を見て、子クラスローダーが特定のクラスをロードするのを一般的に防止する幅広いソリューションを探していますこれは可能ですか?
java - URLClassLoader がプラグインの外部 JAR ライブラリを読み取らない
Java を使用して単純なプラグイン ベースのアプリケーションを実装しました。主なプラグイン クラスは、"Plugin" と呼ばれる抽象クラスから派生します。アプリケーションは JAR ファイルからそのクラスを読み取り、クラスのインスタンスを作成してプラグインを実行します。私が推測する標準的な手順:)
今まではすべてうまくいきました。しかし、MySQL コネクタなどのライブラリをプラグインに含めると、問題が発生します。実行後に例外 NoClassDefFoundError および ClassNotFoundException がスローされます。MySQL コネクタ ライブラリをメイン アプリケーションに追加することで問題を解決していますが、その場合はどうすればよいでしょうか? :)
私は Java の専門家ではないので、ライブラリのクラスパスを定義するなどの代替ソリューションについてはわかりません。
これが私のプラグインローダーです: http://pastebin.com/90rQ9NfJ
そして、ここに私のプラグイン基本クラスがあります: http://pastebin.com/Juuicwkm
GUIから実行しています: