5

したがって、javaには、javaソースコードを.classファイルにコンパイルするための専用の組み込みライブラリがあり、それはにありjavax.toolsます。それで、私はあなたがそれをどのように正確に機能させるのか疑問に思いました。javadocを読みましたが、そこにいくつかの例がありますが、それらの例を使用するとエラーが発生します。

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);

StandardJavaFileManagerこれは、より多くのことを実行できるクラスのインスタンスを取得するためにoracleが提供する例です。ただし、そのコードの最初の行でいくつかの問題が発生しています。しようとするとToolProvider.getSystemJavaCompiler();、常にnullが返されます。そのメソッドのjavadocsには、「このプラットフォームで提供されているコンパイラを返すか、コンパイラが提供されていない場合はnullを返します」と書かれています。ただし、のインスタンスを取得する他の方法を示すことはありませんJavaCompiler。私は他の多くの方法を試しました。たとえば、を使用してServiceLoader参照を見つけることができましたが、勝つことはできませんでした。これを機能させるにはどうすればよいですか?

4

2 に答える 2

9

JDKディレクトリではなくJREディレクトリからJavaを実行している可能性があります。Javaコンパイラがどこにあるかを「認識」しているバージョンを実行する必要があります。

たとえば、私のWindowsボクシングでは、次のような小さなテストアプリを実行します。

import javax.tools.*;

class Test {
    public static void main(String[] args) {
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        System.out.println(compiler);
    }
}

結果は次のとおりです。

c:\Users\Jon\Test>"\Program Files\Java\jdk1.7.0_09"\bin\java Test
com.sun.tools.javac.api.JavacTool@1e0f2f6

c:\Users\Jon\Test>"\Program Files\Java\jre7\bin\java" Test
null

ご覧のとおり、特にJDKバージョンを実行すると問題ありませんが、JREバージョンを実行するとnullになります。Javaの起動方法を確認してください。

于 2012-12-04T06:58:20.407 に答える
2

コンパイルは、多くの場合、インストールされたJava Development Kit(JDK)を必要とするjavacコンパイラを直接呼び出すか、Sunのtools.jarにあるを呼び出すことによって実行されます。Sunのライセンスにより、tools.jarを完全なJavaランタイム環境(JRE)で再配布できます。このような動的機能を実装する他の方法には、アプリケーションの実装言語(「参考文献」を参照)と統合する既存の動的スクリプト言語(JavaScriptやGroovyなど)の使用、またはドメイン固有言語と関連する言語インタープリターまたはコンパイラーの記述が含まれます。com.sun.tools.javac.Main

于 2012-12-04T06:59:29.137 に答える