Entre los conectores de JDT se incluye un compilador de Java incremental y por lotes para construir archivos .class de Java a partir del código fuente. El compilador no ofrece ninguna API directa. Se instala como un constructor en proyectos Java. La compilación se activa utilizando mecanismos estándar de construcción de la plataforma.
Los mecanismos de construcción de la plataforma se describen con detalle en el apartado constructores de recursos.
Los archivos fuente de Java de un proyecto pueden compilarse desde programa utilizando la API de construcción (build).
IProject myProject; IProgressMonitor myProgressMonitor;myProject.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, myProgressMonitor);
Para un proyecto de Java, este código llamará al constructor incremental de proyectos Java (junto con todos los otros constructores incrementales de proyectos que se hayan añadido a las especificaciones de construcción del proyecto). Los archivos .class generados se graban en la carpeta de salida designada. En el caso de una construcción por lotes completa, todos los archivos .class de la carpeta de salida se eliminan para asegurar que no se encuentran archivos obsoletos. Asegúrese de colocar todos los archivos .class para los que no tenga archivos fuente correspondientes en carpetas de archivo de clase independientes de la vía de acceso de clases, en lugar de en la carpeta de salida.
Los archivos de recursos adicionales también se copian en la carpeta de salida. Puede controlar qué archivos de recursos se copian mediante el filtro de recursos. Por ejemplo, para filtrar los archivos que terminan en '.ignore' y las carpetas denominadas 'META-INF', utilice:
Opciones de tabla de hash = JavaCore.getOptions();
options.put(JavaCore.CORE_JAVA_BUILD_RESOURCE_COPY_FILTER, "*.ignore,META-INF/");
JavaCore.setOptions(options);
Los nombres de archivo se filtran si coinciden con uno de los patrones suministrados. Las carpetas enteras se filtran si su nombre coincide con uno de los nombres de carpeta suministrados que terminan en un separador de vía de acceso.
También pueden configurarse los constructores por lotes e incremental para que sólo generen un único error si el archivo .classpath contiene errores. Esta opción se establece por omisión y elimina numerosos errores, todos ellos provocados generalmente por un archivo jar que falta. Consulte la opción CORE_JAVA_BUILD_INVALID_CLASSPATH de JavaCore .
<?xml version="1.0" encoding="UTF-8" ?>La sintaxis utilizada para la tarea Ant javac Ant puede encontrarse en la documentación de tareas javac Ant . El adaptador actual da soporte a la tarea Ant Javac 1.4.1. Cuando se suministre Ant 1.5, estará disponible la versión 1.5.
<project name="compile" default="main" basedir="../.">
<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/> <property name="root" value="${basedir}/src"/> <property name="destdir" value="d:/temp/bin" /> <target name="main"> <javac srcdir="${root}" destdir="${destdir}" debug="on" nowarn="on" extdirs="d:/extdirs" source="1.4"> <classpath> <pathelement location="${basedir}/../org.eclipse.jdt.core/bin"/> </classpath> </javac> </target> </project>
El núcleo de JDT define un marcador especializado (tipo de marcador "org.eclipse.jdt.core.problem") para señalar los problemas de compilación. Para encontrar desde programa los problemas detectados por el compilador, debe utilizarse el protocolo estándar de marcadores de la plataforma. En el apartado marcadores de recursos hallará una introducción sobre el uso de los marcadores.
El fragmento de código siguiente busca todos los marcadores de problemas de Java de una unidad de compilación.
public IMarker[] findJavaProblemMarkers(ICompilationUnit cu)
throws CoreException {
IResource javaSourceFile = cu.getUnderlyingResource();
IMarker[] markers =
javaSourceFile.findMarkers(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER,
true, IResource.DEPTH_INFINITE);
}
El constructor de proyectos Java es el encargado del mantenimiento de los marcadores de problemas de Java, y éstos se eliminarán automáticamente en cuanto se solucionen los problemas y el código de Java vuelva a compilarse.
Una de las constantes de IProblem establece el valor de id del problema. El id de problema es fiable, pero el mensaje se traduce y, por tanto, puede cambiar de acuerdo con el entorno nacional por omisión. Las constantes definidas en IProblem son autodescriptivas.
Debe definirse una implementación de
IProblemRequestor
para recoger los problemas descubiertos durante una operación Java.
Pueden combinarse copias de trabajo con la detección de problemas si se ha suministrado
un
IProblemRequestor para la creación de copias de trabajo. Para obtenerlo, puede utilizar el método
reconcile. A continuación se ofrece un ejemplo:
ICompilationUnit unit = ..; // obtener alguna unidad de compilación
// crear peticionario para acumular problemas descubiertos
IProblemRequestor problemRequestor = new IProblemRequestor() {
public void acceptProblem(IProblem problem) {
System.out.println(problem.getID() + ": " + problem.getMessage());
}
public void beginReporting() {}
public void endReporting() {}
public boolean isActive() { return true; } // detectará problemas si está activo
};
// utilizar copia de trabajo para contener el fuente con error
IWorkingCopy workingCopy = (IWorkingCopy)unit.getWorkingCopy(null, null, problemRequestor);
((IOpenable)workingCopy).getBuffer().setContents("public class X extends Zork {}");
// desencadenar combinación
workingCopy.reconcile(true, null);
Puede añadir una acción en los problemas de los que se ha informado en el método acceptProblem(IProblem). En este ejemplo, el problema del que se informa será que Zork no puede resolverse o no es una superclase válida y su id es IProblem.SuperclassNotFound.