2016-08-04 17 views
0

java内からJavaソースコードをコンパイルする作業は、javafx.toolsパッケージ内のJavaコンパイラツールによって支援されるタスクです。しかし、何か情報が見つからないようなものがあります。Java内からJVMを実行してJavaソースファイルをコンパイルします

コンパイルに使用されているJVMに対してJavaファイルをコンパイルすることができるかどうかは疑問です。私は、いくつかのjarライブラリを使用するソフトウェアで動作するコードを作成しています。それらのうちのいくつかはかなり大きく、個々のJavaファイルを動的にコンパイルし、結果として得られるクラスファイルをスクリプト言語のように動作させようとします。コンパイルされたJavaファイルがソフトウェア内のクラスと変数にアクセスするためには、ビルド時にクラスパスに同じライブラリがすべて追加されている必要があります。

私はこのことが不可能かどうか、それが見つからないかどうかについて情報を検索しましたが、私は完全に無関係な結果を得ています。

私が必要とするすべてのライブラリ(30個以上)をリンクすることができない場合、私は好きではないでしょう。現在の環境とのコンパイルが不可能な場合は、JVMにロードされるすべてのライブラリのリストを動的に取得する最も簡単な方法は何ですか?

編集:Jimに応答して、私はJavaファイルがクラスファイルにコンパイルされており、そのクラスファイルが読み込まれていることを理解しています。私はライブラリがコンパイラなどにアクセスできる必要があることを理解しています。私が言いたいのは、30以上のライブラリが380 MB以上あり、クラスを拡張するフォルダに数百個の個別のJavaソースファイルがありますメインプログラム内でモジュールとして使用するために定義されています。コンパイルするために数百個のファイルすべてを380 MBのファイルにリンクする必要がある場合は、時間がかかります。私はそれらをまとめてコンパイルして問題のほとんどを解決することができますが、主な問題は、実行するファイルのリストがコマンドラインの-classpath引数に追加され、いつでも変更できることです。これをコード化する。だから、質問の第2部分が存在するのですが、現在のプログラムを実行するのにクラスパスを使用すると、コンパイラに渡すことができます。

+0

ステートメント_ "使用されているJVMに対してJavaファイルをコンパイルする" _は意味がありません。 Javaファイルをコンパイルしてクラスファイルを生成し、そのクラスファイルをJVMにロードすることができます。外部ライブラリに関しては、参照を解決するためにコンパイラが利用可能でなければならず、実行時にリンクするためにクラスローダが利用できる必要があります。外部ライブラリが既にJVMのクラスパスにあると仮定すると、それらを呼び出すときにコンパイラが利用できるようにするだけで十分です。 –

+0

私はあなたが私の質問ジムを正しく読むとは思わない。まず最初に "Compi; e against"は完全に有効な文であり、それを調べることができます。これは、リソースをコンパイルプロセスにリンクするためによく使われるフレーズの意味です。 "コンパイルのクラスパスにライブラリを追加する"というのとまったく同じことを意味しています.30以上のライブラリをそれぞれ300個以上の個別のJavaファイルにリンクする必要はありませんか?既に読み込まれて実行中の環境を使用することが可能な場合 –

+0

"いくつかのjarライブラリを使用します。そのうちのいくつかはかなり大きい" - それらの大きなlibにapiだけを含む小さなjarファイルを作成し、コンパイルすることができます。 – mabn

答えて

0

コンパイラAPIを使用する場合は、使用するClassLoaderを指定します。このClassLoaderは、コードをコンパイルするのに必要なすべてのクラスを提供します。詳細は覚えていませんが、約5年前にJavaコードのメモリコンパイル用ライブラリを作成しました。 https://github.com/OpenHFT/Java-Runtime-Compiler

関連する問題