問題タブ [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.
jenkins - 実行中の Groovy スクリプト (Jenkins Pipeline スクリプト) のクラスパスを置き換える
Jenkins Pipeline には、CPSGroovyShell によって実行される CpsGroovyScript があり、グローバル ライブラリの場所へのパスが追加されたカスタム クラスパスがあります。
Jenkins インスタンスのすべてのパイプラインで使用できるようにする前に変更をテストできるようにするために、実行時にクラスをアンロードし、スクリプトのクラスパスをそれ自体から変更して、クラスパスをオーバーライドしたいと考えています。
私の考えは、変更されたクラスが最初に見つかるように、現在のクラスパスに新しい場所を追加することです。this.class.classLoader.addURL()素晴らしいですが、新しいパスはクラスパスの最後になります。
.../src- これは現在の本番コードのルートであり、デフォルトではクラスパスに
あります.../branch-src- これは変更したコードのルートです。.../src
たとえば、私が呼び出したときにクラスをオーバーライド.../src/com/foo/Bar.groovyし たい.../branch-src/com/foo/Bar.groovyimport com.foo.Barnew com.foo.Bar()
これがまったく機能しない場合、他のハックがあります。つまり、元のクラスパスを完全に置き換えるか、クラスローダー全体を置き換えるなどです。
java - Groovy - バイナリ クラスをロードすることは可能ですか?
複数の groovy スクリプトを使用する Java アプリケーションがあります。スクリプトは、GroovyShell.parse(text)メソッドを使用してコンパイルした後にメモリにキャッシュされます。
これらのスクリプトを一度だけコンパイルして、バイナリ クラスをディスク/データベースに保持することは可能ですか? 次のコードは、バイナリ クラスを に格納し/tmpます。
このコードを実行した後、ディレクトリ内で確認できますmyScript1.classがmyScript2.class、/tmp/上記のコードを使用してアプリケーションの再起動後にクラスをロードしようとすると (再コンパイルの必要がないため) 失敗します:
iのソース コードから、メソッドGroovyClassLoader以外のバイナリ クラスをロードする方法が見当たりませんdefineClass(java.lang.String, byte[])。クラスをロードしようとすると、次の例外が発生します。
Exception in thread "main" java.lang.ClassFormatError: Incompatible magic value 2901213189 in class file myScript1
コンパイルされた Groovy クラスを直接ロードする他の方法はありますか?
java - @CompileStatic アノテーションを尊重するように GrovyClassLoader を構成する
Groovy に実装され、構成ファイルを介して提供されるビジネス ルールを実装するカスタム Java ライブラリがあります。GroovyClassLoader を使用してビジネス ルールをコンパイルし、次のように目的のクラスを返します。
構成ファイルに埋め込まれたビジネス ルールには、クラス レベルで @CompileStatic アノテーションが付けられます。
静的コンパイルを行うように GroovyClassLoader を構成するにはどうすればよいですか?
CompilerConfiguration (つまり、GroovyClassLoader(ClassLoader loader, CompilerConfiguration config)) を使用して GroovyClassLoader を作成する必要があると思いますが、これを達成するために CompilerConfiguration を構成するための特定の情報を見つけるのが困難です。
GroovyClassLoader を静的にコンパイルするように構成する方法の例を誰か提供できますか?
ありがとう!