Как установить classpath, когда я использую javax.tools.JavaCompiler для компиляции исходного кода?

Я использую класс javax.tools.JavaCompiler (jdk6) для компиляции исходного файла, но исходный файл зависит от некоторого файла JAR. Как установить путь к классу javax.tools.JavaCompiler?

3 ответа

Решение

Метод javax.tools.JavaCompiler#getTask() принимает options параметр, который позволяет установить параметры компилятора. Следующее сообщение описывает простой способ их установки для доступа к classpath вызывающей программы:

Вам нужно настроить стандартный файловый менеджер java, чтобы знать о jar-файлах, - для этого вы используете аргумент параметров компилятора.

По умолчанию объект компилятора java, кажется, знает только о расположениях по умолчанию для каталогов bootclasspath, extdirs и endorseddirs в терминах своего пути к классам.

Вам нужно добавить текущий путь к классу вызывающей программы к экземпляру компилятора java, который передается стандартному файловому менеджеру, который затем находит классы в файлах jar.

Вот как я делаю это в оболочке компилятора, которую я написал

List<String> optionList = new ArrayList<String>();
// set compiler's classpath to be same as the runtime's
optionList.addAll(Arrays.asList("-classpath",System.getProperty("java.class.path")));

// any other options you want
optionList.addAll(Arrays.asList(options));

JavaCompiler.CompilationTask task = compiler.getTask(out,jfm,diagnostics,optionList,null,jfos);

Все, что вам нужно, это установить правильный путь к классу при запуске вызывающей программы.

Недавно та же проблема возникла у меня, и наконец я нашел два обходных пути. Вы можете установить путь к классу , вызвав StandardJavaFileManager.setLocation(StandardLocation.CLASS_PATH, "YOUR_CLASS_PATH") или Compiler.getTask(ARG_0, ARG_1, ARG_2, CLASS_PATH_OPTIONS, как сказано в первом ответе, опубликованном здесь.

Мне нужно было что-то более простое, чем примеры выше.

Ниже приведен автономный пример использования встроенного компилятора Java и установки пути к классам для использования компилятором.

Это эквивалентно созданию исходного файла с именем HelloPrinter.java и последующей его компиляции следующим образом:

      javac -classpath C:\Users\dab\Testing\a.jar;c:\path\etc org\abc\another\HelloPrinter.java

Обратите внимание, как путь к классам можно задать с помощью String[] параметров. Это должно быть знакомо, если вы уже привыкли запускать javac в командной строке (как указано выше).

Этот код совместим с Java 6. Для его запуска вам понадобится JDK, а не JRE. Этот пример на самом деле не использует путь к классам. Все, что он делает, это печатает «Hello». Вы можете добавить оператор импорта в сгенерированный источник и вызвать метод во внешнем файле Jar, чтобы проверить это должным образом.

      import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;

public class JavaCompilerExample {
    
    public static void main(String[] args) throws Exception {

        String className = "HelloPrinter";
        String directoryName = "org/abc/another";
        new File(directoryName).mkdirs();

        FileOutputStream fos = new FileOutputStream(directoryName+"/"+className+".java");
        PrintStream ps = new PrintStream(fos);
        ps.println(
                "package "+directoryName.replace("/", ".")  + " ; "
                + "public class " +className + 
                "{ public static void main(String[] args){System.out.println(\"Hello\");} }");
        ps.close();
        
        JavaCompiler javac = ToolProvider.getSystemJavaCompiler();
        String javacOpts[] = {"-classpath", 
                             "C:\\Users\\dab\\Testing\\a.jar;c:\\path\\etc;",
                              directoryName+"/"+className + ".java"};
        
        if ( javac.run(null, null, null,  javacOpts)!=0 ) {
            System.err.println("Error");
            System.exit(1);
        }
        
        
    }

}
Другие вопросы по тегам