web-dev-qa-db-ja.com

ToolProvider.getSystemJavaCompiler()はnullを返します-JREのみがインストールされている場合に使用できますか?

JavaCompilerクラスを使用しようとしています:

ToolProvider.getSystemJavaCompiler()を呼び出すと、nullが返されます。

これは、JDKではなくJREを使用しているためだと思います。

問題は、ユーザーがJREまたはJDKを使用している天候に関係なく、すべてのプラットフォームで実行したいということです。

誰かがこれを修正する方法、または使用する別の方法を知っている場合はコメントしてください。

どんな助けでもいただければ幸いです。

23
Josh Sobel

ToolProvider.getSystemJavaCompiler()は使用できません。

Tools.jarがクラスパスにありませんか?

_Set class path to the tools.jar_ファイル。jdk\ jreディレクトリにあります。

System.setProperty("Java.home", "C:\\Program Files\\Java\\jdk1.7.0_02");

9

JDKがインストールされていないときに、アプリケーションからJavaコンパイラを実行する方法は次のとおりです。

まず、JDKのtools.jarファイルをJavaアプリに含め、tools.jarをクラスパスに配置します。Oracleはおそらくそれを好まないでしょう。しかし、法的な作業があります- tools.jarファイルは、openjdk.org(openjdk)、RedHat(IcedTea)、またはAzul Systems(Zulu)が提供する無料のJDKから入手できます。

次に、ToolProvider.getSystemJavaCompiler()とJavaCompilerクラスを使用する代わりに、tools.jarにあるコンパイラーを直接呼び出します。以下はコードのスニペットです。

String classpath = ...; // make sure tools.jar is in this path 
String sourcepath = ...; // path to your sources
String putputpath = ...; // directory for generated class files
String filepath = ...; // file path the file you want to compile

String[] args = new String[] {
"-classpath", classpath,
"-sourcepath", sourcepath,
"-d", putputpath,
filePath
};
com.Sun.tools.javac.Main javac = new com.Sun.tools.javac.Main();
int compileStatus = javac.compile(args);
5

これは 問題 だと思います。使用しているJava.exeのバージョンをJDKディレクトリのバージョンとして明示的に指定します。

こちらをご覧ください 詳細はこちら

4
PSR

Tools.jarファイルを/ libからItにコピーするだけです。

System.out.println(System.getProperty( "Java.home"))で取得できます。

ほとんどの場合、C:\ Program files\Java\jre(version)[forwindows]のようなものです。

3
Mr. Suryaa Jha

別の解決策は次のとおりです。- http://bugs.Java.com/bugdatabase/view_bug.do?bug_id=7181951

JDK_HOME/lib /のtools.jarをJRE_HOME/lib /にコピーします。少なくとも私にとっては、それは私の問題を魔法のように解決しました!

(上記のように推奨されることは何もしませんでした。そこにコピーしただけです。)

2
user3509406

Macではこれは私のために働いた:

  System.setProperty("Java.home", "/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home");
  javax.tools.JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

(何らかの理由でidk 10では機能しません)。

0
clankill3r

これが私のために働いた簡単な解決策です

Jreシステムライブラリを.... Program Files\Java\jdk1.7.0_55\binではなく..... Program Files\Java\jdk1.7.0_55\jreに変更したところ、機能しました。

0
Arshad Ali

BuildPathにJREとJDKの両方がありました... JREを削除したところ、修正されました。

0
Manuel Musetti