問題タブ [java-compiler-api]
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 - Java ランタイム クラス生成フレームワーク
Java 7 用の Java 8 の機能の 1 つが必要です: メソッドの自動インターフェイス実装生成 (リフレクション呼び出しによるパフォーマンスの低下を避けるため)。Java 8 がコンパイル時に生成を提供することは知っていますが、Java 7 (メタデータ ファイルのメンテナンスなし) では不可能だと思います。したがって、実行時の実装生成に同意します。
例:
私は次のインターフェースを持っています:
そしてBeanクラス(またはインターフェース)
Foo の各プロパティに Extractor インターフェースの実装が必要です。Foo::getProperty1
Java 8のようなもの。
使用する必要がありますJavaCompiler
か (現在、実装するインターフェイスがほとんどなく、テンプレート クラスを操作できます)、またはより良い解決策がありますか?
主な要件は、短いバイトコード生成時間と LGPL 互換性 (商用製品で使用可能) です。
可能であれば、私の場合の例を少し挙げてください。
java - Maven コード生成およびコンパイル プラグイン: Java コンパイラ: クラスパスの問題
コードを生成してコンパイルするMavenプラグインに取り組んでいます。Eclipse でのテストでプラグインのソース コードを使用している場合、問題なく動作します。JavaCompiler ( Javax.tools ) でクラスパスを設定することさえしません。
しかし、パッケージ化してmavenプラグインとして実行すると。生成されたコードのコンパイルは、Jackson アノテーションなどの参照されたクラスを見つけることができずに失敗します。
私は試した
- ローカルの Maven リポジトリを指す JavaCompiler で classpath オプションを設定しようとしましたが、それでも必要なクラスが見つかりませんでした。
- クラスパスを jackson アノテーション jar と commons lang (生成されたコードで必要) に設定すると、問題なく動作するようです。
作業コード:
jar アプローチへのパスを使用したこの設定クラスパスの問題:
- きれいではありません。プラグインのユーザーは、これらの jar の場所を指定する必要があります (これをオプションとして数えることさえしません。
JavaCompiler が、生成されたコードをコンパイルするために必要な依存関係を見つけることができることを確認するためのより良い方法は何ですか。
どんな助けでも大歓迎です。
java - glassfish4、CompilationTask.call メソッドでの javacompiler クラスローダ エラー - シンボルが見つかりません
task.call()メソッドでglassfish4、jdk1.7エラーを使用し、
j2se クライアントではコードが正常に動作し、glassfish サーバーではエラーが発生します
サンプルコード;
glassfish4 で javacompiler を使用するには? また、sun-web.xml で class-loader delegate=false を設定しようとしましたが、その後 ejb Bean が機能しません
ありがとう
java - jdk1.6コンパイラAPIでコンパイルするときに、メモリ内のjarファイルをクラスパスに入れる方法は?
jdk1.6コンパイラAPIを使用して動的コンパイルを行っています。
今のところ、コンパイル時にクラスパスに含めるために、必要なすべての jar ファイルを disk にダンプしました。
メモリ内のjarファイルをクラスパスに直接配置するためのトリックはありますか?
javax.tools.ForwardingJavaFileManager を拡張してこれを行う方法を理解できませんでした。
誰かヒントをくれませんか?
ありがとう。
classloader - ClassLoader を Drools 5.6.0 と共有して、実行時にクラスのメモリ内コンパイルを可能にする
XML ファイルを読み取り、それらのノードを POJO に変換し、それらを Drools の WM にロードし、最終的にそれらにいくつかのルールを適用する単純なユーティリティを作成しています。プロジェクト全体は、私のGitHub プロファイルで見つけることができます。残念ながら、あらゆる努力にもかかわらず、実行時にコンパイルされたクラスのインスタンスを Drools に「いいね」させることはできませんでした。多くの人が ClassLoader にも問題を抱えているのを見たので、それが原因であると思われます... GitHubと以下で入手できる最小限の作業例を用意しました。GitHubでのみ利用可能な他のいくつかの小さなファイル ( 、および) が必要です。MemoryFileManager
MemoryJavaClassObject
MemoryJavaFileObject
簡潔にするために。この例を正しく機能させるには、JVM が JDK >= 6 でありtools.jar
、. 例は次のとおりです。classes.jar
classpath
この例を実行すると、次の出力が得られます。
ご覧のとおり、Person
クラスはメモリ内で正常にコンパイルされ、インスタンス化されています (Hello, HAL!
出力のメッセージを参照)。ただし、クラスを WM に追加すると、Exception in thread "main" java.lang.NoClassDefFoundError: Object (wrong name: Person)
明示的に s に依存するルールがない場合でもエラーが発生しPerson
ます。ここで、例外を少し調べたところ、指定されたクラス ( ) がDrools によって使用されるクラスPerson
内に見つからない場合に発生することがわかりました。したがって、と の両方にコンパイルおよびインスタンス化するために使用されるものとClassLoader
まったく同じ参照を含む構成を追加して、コードを変更しましたが、それでも同じ例外が発生するため、何か間違っている可能性があります。ClassLoader
HAL
KnowledgeBuilder
KnowledgeBase
なぜこれが起こるのか、それを回避する方法はありますか?よろしくお願いします!
java - メインクラスとそのスーパークラスを作成および破棄する順序は何ですか
メインメソッドから実行が開始される場合、メインクラスインスタンスの前にスーパークラスインスタンスを作成する方法と、メインクラスの前にスーパークラスを最初に初期化する必要がある場合、メインクラスのスーパークラスが最初に破棄されるか、メインクラスが最初に破棄されますか必要に応じてプログラムに害を与えるでしょうか?
java - クラスを動的に再コンパイルしてリロードする
Javaソースファイルを受信できるJavaでサーバーを構築しています.JavaCompilerを使用して動的にコンパイルし、クラスをロードする必要があります。ただし、問題は、サーバーが同じ名前で内容が異なるファイルを受信した場合でも、以前のクラスをロードして同じ出力を与えることです。ロードしようとしているクラスのスーパークラスを作成し、別の classLoader を使用することを示唆するいくつかの回答に気付きましたが、Java ソース ファイルがサーバーに動的に送信される場合はまだそうですか?
FileServer.java のコンパイルおよびロード メソッドは次のとおりです。
java-compiler-api - toolprovider.getsystemjavacompiler() は null を返します
まず、JavaCompilerAPI の使用について多くの質問が寄せられています。クラスを事前に作成するためにユーザーからの入力が多すぎるオンライン シミュレーション ビルダを作成していることを明確にしたいと思います。そのため、ユーザーの入力を使用してクラスを作成するために、Java コンパイラを使用しています。
私の問題については、いくつかの基本的なコンパイラ プログラムでテストし、現在、ここにあるコードで作業しています:物理ファイルを作成しない動的コンパイル
コードのコンパイルは成功しましたが、コードを実行すると、
ToolProvider.getSystemJavaCompiler(); null を返します。
他のエントリから、デフォルトの java.home が JRE であることが 1 つの原因である可能性があることがわかりました。そのため、Java ホームを JDK バージョンに設定する行を追加しました。
また、プログラムのフォルダーに tools.jar を追加し、次のようにクラスパスで tools.jar を指定してプログラムを呼び出しました。
これらのアプローチは何も変わっていません。何が問題なのかについてのアイデアはありますか?
...