web-dev-qa-db-ja.com

実行時にJavaクラスをコンパイルしてデプロイするにはどうすればよいですか?

私は、条件付き構成によって決定される単純な割り当てを実行するルールエンジンを作成中です。ルールがXML形式であることがプロジェクトの前提条件です。 XMLスキーマをモデル化して単純なコードブロックに似せました。 XMLを解析し、それをJavaコードに変換したい。次に、実行時にこのコードをコンパイル(および実行)したい。そうすると、ルールエンジンが次のように機能しなくなる。インタプリタですが、ネイティブJavaバイトコードを実行します。

解析段階と多かれ少なかれJavaコード生成フェーズを理解しました。最後のフェーズ、つまり実行時のコンパイルフェーズを理解したいと思います。

このスレッドに従う: コンパイルしてJavaバイトコード(Javaを使用しない) 私は次の可能な解決策に気づきました:

これらの比較と、実行時フェーズでのJavaコンパイル)を解決するための他の提案が欲しいです。

19
Yaneeve

Java 6コンパイラAPI を使用します。

18
cletus

それをClojureコードに変換すると、Clojureコンパイラーがそれをバイトコードに変換します。

4
kwatford

ここにJavaコンパイルユーティリティがあります。バイトコードツールなしで、実行時にコードをコンパイルできます。

http://code.google.com/p/compilation-toolbox/

4
abstract

Javassistはほぼ完全なJava Javaで記述されたコンパイラであり、完全にJavaで構成されています。一度に.Javaファイル全体を指定することはできませんが、次のコード文字列を指定することはできます。個々の関数を同じCtClassオブジェクトに追加します。これがバイトコードになり、次にJava.lang.Classになります。

Javassist(コンパイラー)とBeanshell(インタープリター)を一緒に使用し、最適化するコードとタイミングを制御できるGigaLineCompileのバージョン0.1をリリースしました。それ以降のバージョンでは、JavassistとBeanshellの間でより小さな粒度で変更されるため、一部の部分文字列を共有するコードの文字列が多数ある場合、部分文字列はコンパイルされ、他の部分はBeanshellで実行されます。 Javaコードを生成する人工知能に主に役立ちますが、Clojureまたは極端なJavassist/Beanshellのみの代替手段でもあります。

Javassist、Beanshell、およびGigaLineCompileは、ここから(ソースとともに)ダウンロードできます: http://sourceforge.net/projects/gigalinecompile

2
Ben F Rayfield

Groovy、BeanShell、またはJVMに基づくその他のスクリプト言語には、実行時にコードを挿入、変更、追加、および実行する機能があります。実際には、すべてのスクリプト言語が解釈されるため、実際には実行時にコンパイルされません。

2
Silent Warrior

手間を省いて、ここでほのめかされているように BeanShell を使用してください テキストファイルで指定されたコードを実行Java

BeanShellとは何ですか?

BeanShellは、小さくて無料の埋め込み可能なJava Javaで記述されたオブジェクトスクリプト言語機能を備えたソースインタープリターです。BeanShellは標準のJava構文を動的に実行し、それを共通で拡張しますルーズタイプ、コマンド、PerlやJavaScriptのようなメソッドクロージャなどのスクリプトの便利さ。

BeanShellをインタラクティブに使用して、Javaの実験とデバッグを行ったり、アプリケーションを新しい方法で拡張したりできます。スクリプトJavaは、次のようなさまざまなアプリケーションに適しています。迅速なプロトタイピング、ユーザースクリプト拡張、ルールエンジン、構成、テスト、動的展開、組み込みシステム、さらにはJava教育。

BeanShellは小さくて埋め込み可能であるため、JavaアプリケーションからBeanShellを呼び出して、実行時にJavaコードを動的に実行したり、アプリケーションに拡張性を提供したりできます。または、スタンドアロンのBeanShellスクリプトを使用して、Javaアプリケーションを操作します。JavaオブジェクトとAPIを動的に操作します。BeanShellはJavaそしてアプリケーションと同じVM)で実行され、「ライブ」オブジェクトへの参照をスクリプトに自由に渡し、結果として返すことができます。

つまり、BeanShellは動的に解釈されるJavaに加えて、スクリプト言語と柔軟な環境がすべて1つのクリーンなパッケージにまとめられています。

1
Nick Holt

あなたはこのようなプロセスをフォークすることができます

Process p = Runtime.getRuntime().exec("Java -classpath "..." SomeClassContainingMain ...other arguments);       

        //you need to consume the outputs of the command if output/error is large otherwise the process is going to hang if output/error buffer is full. and create a seperate thead for it (not created here).
        log.debug("PROCESS outputstream : " + p.getInputStream() );
        log.debug("PROCESS errorstream : " + p.getErrorStream());           
    p.waitFor(); // Wait till the process is finished

コンパイルして実行できます。

1
Rahul Garg