0

Tree API を利用するプログラムを作成しようとしています ( https://weblogs.java.net/blog/2006/09/16/hacking-javacを参照)。基本的な考え方は、 を作成し、JavaCompilerそれを使用して を取得することJavaCompiler.CompilationTaskです。CompilationTask返される は、実際には のインスタンスです(JavacTaskImpl以下のコードを参照)。しかし、返さCompilationTaskれたを にキャストしようとするJavacTaskImplと、 が得られますNoClassDefFoundError

import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;

import com.sun.tools.javac.api.JavacTaskImpl;

public class Main {
    public static void main(String[] args) {
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
        Iterable<? extends JavaFileObject> fileObjects = fileManager.getJavaFileObjects("Test.java");
        CompilationTask task = compiler.getTask(null, fileManager, null, null, null, fileObjects);

        // Prove that this is indeed an instance of JavacTaskImpl.
        System.out.println("Task.getClass(): " + task.getClass());

        JavacTaskImpl javacTask = (JavacTaskImpl) task;
    }
}

このコードをコンパイルできます

$JAVA_HOME/bin/javac Main.java -cp $JAVA_HOME/lib/tools.jar

しかし、を使用してコードを実行する

$JAVA_HOME/bin/java Main -cp $JAVA_HOME/lib/tools.jar

次の出力が生成されます。

Task.getClass(): class com.sun.tools.javac.api.JavacTaskImpl
Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/tools/javac/api/JavacTaskImpl
    at Main.main(Main.java:19)
Caused by: java.lang.ClassNotFoundException: com.sun.tools.javac.api.JavacTaskImpl
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
    ... 1 more

このエラーを取り除くにはどうすればよいですか?

4

1 に答える 1