問題タブ [groovyclassloader]
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 - クラスパスに存在しないクラスのロード
ファイル システムに 1 つ以上の .class ファイルを生成した Groovyc を使用して Groovy スクリプトをコンパイルしたとします。Java アプリケーションから、これらのクラスをクラスパスに動的に追加して、クラスをロードしてメソッドを呼び出すにはどうすればよいですか? 目標は、Groovy スクリプトをプリコンパイルしてデータベースに保存することです。これにより、スクリプトのコンパイル済みバージョンから評価を実行できます。
grails - Groovy 動的に呼び出されたクラスと find メソッドが機能しませんか?
次のような動的クエリを作成しようとしています。
しかし、それは機能していません。
私がこれを試している場合、すべて問題ありません:
検索で動的ドメイン クラス名を使用するにはどうすればよいですか?
groovy - GroovyClassLoader を使用してクラスのメソッドを動的に変更または追加できない
Groovy スクリプトで定義されたクラスのメソッドを別の Groovy スクリプトから動的に変更および追加しようとしましたが、クラス名を .metaClass で直接使用するとなぜ機能するのかわかりません。ただし、GroovyClassLoader を使用してクラスをロードする場合はそうではありません (これを行う必要があります!)。
1つのファイル「MyTest.groovy」に
および別のファイル「suite.groovy」が含まれています
最初の方法では、期待される結果が得られます。
しかし、私が得る2番目のもので
興味深いことに、既存のメソッドを変更しても機能しませんが、例外はありませんが、新しいメソッドを追加しようとするとスローされます。使用されているクラスローダーで何かをしなければならないと思いますが、何を正確に何を変更すればよいのかわかりません! 最初のバージョンでは、次のクラス ローダーが呼び出されます。
2 番目のバージョンの場合:
どんなアイデアでも大歓迎!
フランク
eclipse - Grails 1.4.0.M1(STS 2.7.0.M2を使用)GantBuilderのNoClassDefFoundError
アップグレードしたばかりです...
- Grails 1.4.0.M1
- Groovy 1.8.0
- STSバージョン:2.7.0.M2ビルドID:201106101000-Mac用64ビットCocoaバージョン
- 私はOSX10.5.8を持っています。JVM1.5.0を使用
既存のプロジェクトで「create-app」や「upgrade」などのgrailsコマンドを実行すると、GantBuilderに対して次のNoClassDefFoundErrorが発生します。(完全なトレースについては、以下を参照してください)
このフォーラムから提案された同様の問題の解決策は、gant_groovy1.8-1.9.5.jarが欠落していることです。これをプロジェクトに直接追加し、groovy / libフォルダーにも追加しました(STS->設定->Groovy->コンパイラー->すべてのGroovyクラスパスコンテナーを更新します)が、それでもエラーが発生します。(gant_groovy1.8-1.9.5.jarをgroovy / libに追加したとき、それは別のgroovyダウンロードでしたが、STSが内部grailsシェルコマンドに使用するgroovy / libフォルダーや、STSgroovyの表示方法がわかりません。クラスパス)
誰かアイデアはありますか?
java - Beanshell では、「デフォルト」の JRE クラスローダーに jar を追加できませんか?
どこにも答えが見つからないBeanshellに関する質問があります。Beanshell スクリプトを実行できるのは、次の 2 つの方法のうちの 1 つだけです。
クラスパスは Beanshell を呼び出す前に定義され、Beanshell は JRE のデフォルト クラスローダーを使用します。
Beanshell を起動する前にクラスパスがまったく定義されていない場合、and を使用
addClassPath()
しimportCommands()
て Beanshell のクラスローダー内でクラスパスを動的に構築します。このメソッドは、デフォルトの JRE クラスローダーの一部であった jar を継承していないようです。
多くの実験の後、事前定義されたクラスパスを使用してスクリプトを開始できず、を使用してクラスパスに追加できないことがわかりましたaddClassPath()
。これが設計どおりなのか、それとも何か間違っているのかわかりません。
私の問題が何であるかを自分で確認するのは非常に簡単です。たとえば、スクリプトは次のとおりです。
2 番目の呼び出しでは、次のエラーが発生します。
Test.bat は、次の Beanshell スクリプトを起動します。
そして、これは私の helloWorld.bsh スクリプトです。
groovy - loadClass() メソッドの lookupScriptFiles "true"
GroovyClassloader の拡張と loadclass メソッドのオーバーライド
lookupScriptFiles
メソッドで" true
"を作成loadClass()
すると、スクリプトが実行され、別のパッケージの Groovy クラスを参照する import ステートメントは必要ありません。
GroovyClassloader を拡張し、loadclass メソッドをオーバーライドし、loadclass で引数lookupScriptFiles =true
これが真の場合、最初でも正常にコンパイルされます。groovy には import ステートメントがありません
lookupScriptFiles=false
期待どおりにコンパイルエラーがスローされる場合。
groovy - GroovyClassloader の動作
GroovyClassloader の動作理解、
ループで、
上記のコードに関していくつか質問があります。
- for ループで、新しい groovyclassloder オブジェクトを作成し、groovy スクリプトを 2 回解析しています。ループが 2 度目に繰り返され、groovyscript を再度解析しようとすると、どうなりますか?
- 別のオブジェクトが作成されたときに 2 回目に何が起こるか。クラスローダは、クラスパスからクラスを取得するか、再度再コンパイルしますか?
- 再コンパイルがトリガーされると、groovy はソースが変更されたことをどのように認識しますか?