これは尋ねられ、多くの回答がありましたが、私はまだ良い解決策がなく、まだ一部の部分を理解していません。だから私は* .javaファイルをプログラムでコンパイルする必要があります。プログラムでJavaファイルをコンパイルします
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
私が使用しているもの(期待通り)はnull
です。 今、私はJREを "ランタイム"として使用する必要はないことを知っていますが、ここでは理解できないことがあります。tools.jar
をアプリケーションのクラスパスに入れてJava Compiler APIにアクセスできますか?これが当てはまる場合は、スタンドアロンのJavaアプリケーションとWebベースのアプリケーションの間に違いがあると思います。 実際、私はPlayFramework webappからJavaCompilerを呼び出そうとしていますので、(tools.jar
を含む)このソリューションはスタンドアロンアプリケーションでのみ動作するのでしょうか?
私は、カスタムクラスローダを作成し、反射して、上記のメソッドを呼び出すことを試みたが、私は取得していますすべてがcompiler
オブジェクトのnull
です:
-
:上記のコードのための
ClassLoader classloader = app.classloader();
File file = new File("lib/tools.jar");
URL url = file.toURI().toURL();
URL[] urls = new URL[]{url};
ClassLoader newCL = new URLClassLoader(urls, classloader) {
};
Class<?> loadClass = newCL.loadClass("javax.tools.ToolProvider");
Method method = loadClass.getMethod("getSystemJavaCompiler", null);
Object object = method.invoke(null);
System.out.println("Object: " + object); // NULL
説明
tools.jar
のClassLoaderを返すプレイ-方法であり、 )私はPlayがJavaコンパイラクラスをロードする前に、何か必要なことがあると確信しています。紛失しているものはわかりません。
Runtime.exec("javac myFile.java")
のようなオプションとEclipse JDTコンパイラは私には分かっていますが、それは私が探しているものではありません。
ああ、何かSystem.setProperty("java.home", "PATH_TO_YOUR_JDK");
、次にToolProvider.getSystemJavaCompiler();
のように動作していますが、私はこの解決策がとても醜いと感じています。 (追加情報を提供し、最後のステータスを反映する) これはウェブアプリ-構造の基本的な表現です:
myApp
|-conf\...
|-lib\MyJar.jar
|-lib\tools.jar
|-logs\...
|-...
原因は、Myjar.jarが今持っている
EDIT
敬具次の内容のMETA-INF/MANIFEST.MF
ファイル:
Manifest-Version: 1.0
Sealed: true
Main-Class: here.comes.my.main.class
Class-Path: tools.jar
- 私の単純なmain
メソッドは、コンパイラ(ToolProvider.getSystemJavaCompiler();
)を呼び出しようとしており、null
を返します。は、再生アプリケーションを起動するがなくても、lib
フォルダにあります。これは、問題はPlayとは何の関係もないと私に信じています。通常、Jarを通常実行しているときにコンパイラを手に入れることさえできません。
'JAVA_HOME'は私のdevマシンに設定され、尋ねられたらJDKのパスを返します。しかし '' java.home ''プロパティを( 'System.getProperty(...) 'を使って)実行しているPlayアプリケーションから取得すると、JREへのパスが返されます。多分それが一つの問題です。しかし、クラスパスに 'tools.jar'があるときに問題はありません。そして、私は 'tools.jar'がクラスパスにあり(Webアプリケーションの実行中にチェックされています)、ファイルが破損していないことを確信しています。私は上記のクラスローディングのものを試してみるつもりです。 – user2229298
私は私のubuntuで遊んだので、私はスカラの動作からJavaコンパイラを問題なく利用することができました。多分セットアップに何か問題がありますか? –
'JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();を試しました。 \t \t \t 'app/Global.java'の' onStart'メソッドからSystem.out.println( "Javaコンパイラ:" + javaCompiler); - 私のアプリケーションのクラスパスに 'tools.jar'を付けて - 「ヌル」 – user2229298