問題タブ [dynamic-class-loaders]
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.
jboss - Eclipse を使用せずに JBoss で変更されたファイルのデプロイを自動化する
私の要件は何ですか:プロジェクトのファイルで何らかの変更を行うとき、手動で再構築/再デプロイ/再起動を行うことなく、それらの特定のファイルを自動的に再デプロイしたいと考えています。
つまり、ファイルを変更して保存するとすぐに変更が Web ページに反映されるようにしたいということです。変更されたファイルはサーバーに自動的に再デプロイされます。
私がこれまでに試したこと:
ファイルが変更されるたびにアプリを再デプロイするために、JBoss の standalone.xml ファイルを変更しました。しかし、これは私の要件を適切に満たしていません。また、この方法では Out of Memory エラーが何度も発生しました。
JRebel を使用することを考えましたが、無料では利用できません。
DCE VM を使用してみましたが、役に立ちませんでした。
プロジェクトを手動で再デプロイするには時間がかかるため、代替案を提案してください。展開された耳に変更されたファイルのみをデプロイすることで、このプロセスを自動化したいと考えています。IDE を使用したくありません。
java - Java が動的に jar をロードする
議論について多くの議論を見つけましたが、解決策はありません。
機能するために、jdbc ドライバーも含む単純なプラグイン (jar) を作成したいと考えています。このプラグインは、より大きなアプリ内で使用されます。
このように非常に単純なメインを作成すると:
私はいつもこの例外を持っています:
Class.forName は、私のプラグイン クラスの同じパッケージにある jar を見つけることができないようです。
私は多くの解決策を試しましたが、誰もうまくいきません。直接参照せずにjarをロードすることは可能です(メインクラスの同じパッケージにあります)。
ありがとう
java - RMI サーバーが不足しているクラスを HTTP コードベース サーバーから動的にロードしない
環境
これは Java RMI を使用するアプリケーションで、次のものがあります。
- ホスト A 上のクライアントとホスト B 上のサーバー。
- ホスト A 上の HTTP サーバー。クライアントとサーバーが使用するすべてのクラスのコピーを保持します。
- RMI レジストリはサーバー コードから作成され、サーバー JVM と CLASSPATH を共有します。
サーバーおよびクライアント アプリケーションの場合:
java.rmi.server.codebase
プロパティは (コード内で) HTTP サーバーの URL に設定されます。- 適切なポリシーを備えたセキュリティ マネージャーが配置されています。
- は
java.rmi.server.hostname
LAN アドレスに設定されます。
メソッド呼び出し:
- サーバー メソッドは、型
WorkRequest
(抽象クラス) のパラメーターで定義されます。 - クライアントは、サブクラスを使用してこのメソッドを呼び出します
WorkRequestSquare
。 WorkRequestSquare
サーバーコードでは決して言及されていません
サーバーコード
クライアントコード:
このコードは、サーバーの CLASSPATH にすべての関連クラスがあり、動的ロードが必要ない場合に機能します。
問題
サーバー側で CLASSPATH から削除WorkRequestSquare
すると、クライアント側で例外がスローされます (サーバー側では何もスローされません)。
WorkRequestSquare
サーバーコードで明示的に言及されていないため、動的にロードできるはずですが、そうはなりません。
バイパス
Stuart Marks から、プロパティjava.rmi.server.useCodebaseOnly
を に設定する必要があることがわかりましたfalse
。
このプロパティのデフォルト値は、JDK 7u21 でfalse
からに変更されました。を使用してローカルに定義された場所を除いて、JVM が任意の場所からクラスを動的にロードするのを防ぐために設定します。これは、パラメーターをマーシャリングするときにクライアント JVM によって設定されたコードベース値が、サーバーによって無視されることを意味します。true
useCodebaseOnly
true
java.rmi.server.codebase
WorkRequestSquare
useCodebaseOnly
true
サーバーで がにuseCodebaseOnly
設定さfalse
れ、WorkRequestSquare
クラスがサーバーの CLASSPATH から削除されると、サーバーは HTTP サーバーからクラス定義を取得するようになりました。これは有効なバイパスです。
質問
クライアントとサーバーのプロパティの値が同じであるため、まだ何か異常がありcodebase
ます。
useCodebaseOnly
サーバーにデフォルト設定された場合true
、JVM は RMI ストリームに追加されたクライアントを無視する必要がありましたが、クラスを取得するためにcodebase
独自のものを使用する必要がありました。codebase
WorkRequestSquare
codebase
クライアントとサーバーの値が同じであるため、これはとにかく成功するはずです。
誰かがその問題に光を当てることができますか?
java - 実行時にクラスをロードするときの ClassNotFoundException
Bukkit-API を使用して、実行時に特定のペーストビン リンクの Java コードをコンパイルし、そのコードを実行できるプラグインを作成しようとしています。1 つのことを除いて、これまでのところすべてが機能しています。既に読み込まれているプラグインの 1 つにアクセスしようとすると、ClassNotFoundException が発生します。(Bukkit-API メソッドを使用している場合、例外は発生しません!) すべてのプラグイン jar がクラスパスに追加されました。現在、次のようになっています。
動的にロードしようとしたクラス:
MultiCube の ClassNotFoundException
働く
RuntimeCompiler.java のソースコード: http://paste.multicu.be/axigofekip.avrasm (少し長いので、pastebin リンクを使用しました)
また、MultiCube.jar のクラスパスを削除するとコンパイル エラーが発生することにも気付きました。これは、ソースコードをコンパイルできるため、クラスパスが正しい必要があることを意味します。
編集: MultiCube.class.getClassLoader() を URLClassLoader のコンストラクターの引数として追加することで修正できました
java - DRL が動的にロードされたクラスを解決しない
drools 6 パッケージを使用して、アプリケーションの drl ファイルをビルドおよび実行しています。静的クラスでは問題なく動作していますが、ルールで動的クラスを使用すると、次のようにエラーがスローされます
Rule Compilation error : [Rule name='rule 1'] com/sample/Rule_rule_11982550347.java (2:28) : タイプのみをインポートできます。com.chainsys.csapp.dynaclass.vo.SupplierdivVO はパッケージに解決されます
クラスローダーをナレッジベースにロードしたにもかかわらず。以下は私のコードです。
java - jar のバイト配列からクラスを適切にロードする
同じ問題に対処する質問があることは知っています。私がそれらを経験したことを信じてください。しかし、どれも私の問題に対する答えを含んでいませんでした。バイト配列からクラスをロードし、その内容を検証したいと考えています。クラスの byte[] がありますが、カスタム クラスローダーに実際にロードさせることができません。簡単にするために、jar ファイルのバイトを読み取る次の関数を作成しました。
それは非常に簡単です。ここからは、次のコードを使用して、このストリームからクラス ファイルを取得します。
jar ファイル内の構造は次のようになります。
を使用して loadClass メソッドに<classname>$1.class
渡す<packagename>.<classname>$1
と、実行されるそのクラスで定義されている唯一のメソッドが取得されます。ロードしたい実際のクラスを使用しようとすると、さまざまな例外が発生します。ClassLoader の「実装」のソースとともにすべての詳細を提供します。
MyClassLoader をそのままにしておくと、次の StackTrace が得られます。
try ブロックを削除して、catch ブロック内の loadClass のみを残すと、次のようになります。
この問題を解決するために、defineClass 呼び出しから name 属性を削除すると、次の StackTrace でさらに別の例外が発生します。
ClassCircularityError はありません。私のクラスは他のクラスを使用していますが、それらのクラスはまったく使用<classname>
していません。これらのクラスから へのインポートはありません<packagename>.<classname>
。これは、私のjarのクラスがどのように編成されているかを示す階層です。
正直なところ、ここには CircularReferences がまったく表示されません。jar 内のクラス ファイル内の正確なバイトである正しいバイトが MyClassLoader 内の byte[] に含まれる defineClass まで、アプリケーションをデバッグできました。それでは、byte[] は正しいと仮定しましょう。しかし、まだ defineClass を動作させることができません。
私は何を間違っていますか?
@Edit: 次のように MyClassLoader をわずかに変更します。
最初に classname$1.class をロードしてから classname.class をロードすると、すべての問題が修正されます。今、私の唯一の質問は、なぜですか?loadClass メソッドによって返されるクラスを使用できるようにするために、classname$1.class と classname.clss の両方をロードする必要があるのはなぜですか? classname$1.class にネストされたクラスが含まれていることは知っていますが、実際には、ネストされたクラスはなく、無名クラスもありません。外観は次のとおりです。
PrintDeclaredMethod はかなり単純です。クラスの CanonicalName を出力し、その下に宣言されたメソッド名をわずかにインデントして出力します。出力は次のとおりです。
PooledTCPConnector には正確な関数が宣言されているため、これは実際に正しいです。null は、その実行関数を含む $1.class ファイルであると思います。現在ロードされているクラスの 1 つを除外すると、NoClassDefFoundError が発生します。私の質問は、なぜですか?
ありがとう!- ジョーイ
c# - BeanUtils の .NET への移植
動的に読み込まれる型の動的ランタイム構成を使用するシステムがあります。
システムは XML に基づいてタイプをロードし、インスタンスを作成しています。次に、XML ファイルから「プロパティ」を読み取り、作成されたインスタンスにこれらのプロパティを設定します。現時点では、インスタンスの単純なプロパティで直接動作しますが、これらの型には、呼び出し側が認識しない設定の階層が含まれている可能性があります。
Java BeanUtils [ http://commons.apache.org/proper/commons-beanutils/]に似た utils-library を探しています。次のようなことができるようにしたいと思います(疑似コード):
または、おそらく拡張機能を使用して:
そしてGet
もちろん逆です。
BeanUtils にはプロパティを記述する独自のスタイルがあるため、リストを含むほとんどのタイプのプロパティで機能することに注意してください。
問題への別のアプローチに関する何か、またはおそらく提案はありますか?
java - クラスを動的に再コンパイルしてリロードする
Javaソースファイルを受信できるJavaでサーバーを構築しています.JavaCompilerを使用して動的にコンパイルし、クラスをロードする必要があります。ただし、問題は、サーバーが同じ名前で内容が異なるファイルを受信した場合でも、以前のクラスをロードして同じ出力を与えることです。ロードしようとしているクラスのスーパークラスを作成し、別の classLoader を使用することを示唆するいくつかの回答に気付きましたが、Java ソース ファイルがサーバーに動的に送信される場合はまだそうですか?
FileServer.java のコンパイルおよびロード メソッドは次のとおりです。
java - URLClassLOader が jar からクラスを動的にロードできない
ClassNotFoundException
入っていloadClass
ます。
次のようなコードのいくつかのバリアントを試しました
しかし、すべての結果はClassNotFoundException
!
Eclipse でデバッグを試みましたが、クラス ローダー インスタンスが jar からクラスをロードできません。クラス Vector は空です。