問題タブ [java-runtime-compiler]
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.
chronicle - ミューテーション テスト用の新しいクラス定義で再コンパイルする
openHFT/java-runtime-compilerを使用して、ディスク アクセスの多用からインメモリ コンパイルのみの使用まで、ミューテーション テスト ツールを改善しようとしています。
変異テストでは、2 種類のクラスがありました 。 A. 変異クラス、その定義が常に操作/変更され、再コンパイルされるクラス。 B. その他のクラス、その定義が変更されないクラス、つまりテスト ケース クラス、または変更されたクラスが必要とするその他のクラス。
openHFT/java-runtime-compiler を使用すると、以下のコードを使用して簡単に実行できます。これは、変更されたクラスと他のクラスの両方を再コンパイルするたびに新しい classLoader を作成することでした。
これはうまく機能し、クラス A の新しい定義がコンパイルされるたびに、AClassは新しい定義に適応します。
ただし、以下のコード ( BClassが最初にロードされ、次にAClass ) のように順序が逆になっていると、これは機能しません。クラス A の再コンパイルは、新しい定義に適応せず、クラス A のコンパイルに使用された最初の定義を常に使用します。
openHFT/java-runtime-compiler ライブラリ (以下のコード) からloadFromJavaクラスを変更する必要があったのではないかと思います。私はすでに行を省略して試しています
loadFromJavaが呼び出されるたびに、すべてのソースコード (既にコンパイルされているものも含む) を常に再コンパイルするようにすることを期待していました。しかし、それは間違った結果をもたらします。
機能させるために必要な変更を指摘するのを手伝ってください。
大変お世話になりました。
編集済み
ピーター・ローリーに感謝します。あなたの提案を試してみましたが、同じ結果が得られました。A クラスは最初に使用された定義に固執し (最初の反復で)、新しい定義への変更/使用に失敗しました (次の反復で)。 .
私は症状を集めました。考えられる説明は、次の反復とは異なる最初の反復 (初めてクラスがコンパイル/ロードされた) の処理があったことです。そこから、いくつかのことを試します。
第 1 の症状
loadFromJava (下) に出力行 (System.out.println) を入れたときでした。
出力は次のとおりです。
最初の反復では、loadClassesMap には classLoader がないため、正しい出力 "loadClasses Null" (B をロードするとき) が返され、loadClassesMap には classLoader があるが、ないため、"clazz Null" (A をロードするとき) が返されました。 t は A クラス名を持っています。
ただし、次の反復では (A をロードするとき)、「clazz Not Null」が出力されます。A クラス名が既に loadedClassesMap.get(classLoader) に格納されているように見えますが、これは発生しないはずです。CachedCompiler コンストラクターで loadedClassesMap をクリアしようとしました。
しかし、それは LinkageError: loader (main/Utama$2 のインスタンス): 重複したクラス定義を試みました。
2 番目の症状
最初の繰り返しでの差別化のより強い症状は、s_fileManager バッファーをチェックしたときでした。
最初のイテレーションは予想どおりでしたが、次のイテレーションでは、s_fileManager バッファーは既にサイズ 2 を取得しているようで、0 にリセットされていません。
CachedCompiler コンストラクター (以下) で FileManager バッファーをクリアしようとしましたが、
しかし、ExceptionInInitializerError が発生します。
java - アプリケーションでの複数の JVM の問題
お客様のマシンでの Java への依存を避けるために、アプリケーション Jar と JRE もパックしているデスクトップ アプリケーションがあります。
ただし、問題は、顧客がすでに Machine に Java をインストールしている場合です。一部のクラスの Java バージョンの依存関係が原因で、クラス定義の例外がないなどの問題に直面しています。
ここで私の質問は、アプリケーションがパッケージ化された JRE を常に使用してアプリケーションを起動し、インストールされている場合はシステム JRE を使用しないようにする方法です。
java - Java ランタイム -ERR 'fsctl コマンドが見つかりません
java Runtime.Thatコマンドは、ターミナル/コマンドプロンプトで正常に実行されたが、Java.Runtimeを介して実行できない場合は正常に機能します:-
「 -ERR 'fsctl Command not found!」という出力が得られます。