usar test puedo orden encontró java jdk1.6 java-compiler-api jsr199

test - ¿Cómo establecer classpath cuando uso javax.tools.JavaCompiler compile el código fuente?



javac test java (2)

Uso la clase javax.tools.JavaCompiler (jdk6) para compilar un archivo fuente, pero el archivo fuente depende de algún archivo jar. Cómo establecer el classpath de javax.tools.JavaCompiler ?


El javax.tools.JavaCompiler#getTask() toma un parámetro de options que permite establecer las opciones del compilador. El siguiente message describe una manera fácil de configurarlos para acceder al classpath del programa de llamada:

Necesita configurar el administrador de archivos java estándar para saber sobre los archivos jar - usted usa el argumento de opciones del compilador para hacer eso.

De forma predeterminada, el objeto del compilador de Java solo parece conocer las ubicaciones predeterminadas de los directorios bootclasspath, extdirs y endorseddirs en términos de su classpath.

Debe agregar el classpath actual del programa de llamada a la instancia del compilador de java que se pasa al administrador de archivos estándar, que luego encontrará las clases en los archivos jar.

Así es como lo hago en el envoltorio del compilador que escribí

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);

Todo lo que necesitará entonces es obtener el conjunto de ruta de clases adecuado al ejecutar el programa que realiza la llamada.


El mismo problema se me ocurrió recientemente, finalmente encontré dos soluciones. Puede establecer la ruta de clase ya sea por invocación StandardJavaFileManager.setLocation (StandardLocation.CLASS_PATH, "YOUR_CLASS_PATH") o Compiler.getTask (ARG_0, ARG_1, ARG_2, CLASS_PATH_OPTIONS, tal como lo indica la primera respuesta publicada aquí.