Как установить 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);
}
}
}