Compilazione del codice Java

I plug-in JDT comprendono un compilatore Java incrementale e batch per la creazione di file .class Java dal codice sorgente. Nessuna API è direttamente fornita dal compilatore. Questa viene installata come generatore su progetti Java. La compilazione viene attivata utilizzando meccanismi di creazione della piattaforma standard.

Il meccanismo di creazione della piattaforma viene dettagliatamente descritto nella sezione relativa ai generatori di risorse.

Compilazione del codice

E possibile compilare in modo programmatico i file sorgente Java in un progetto utilizzando l'API di build.

   IProject myProject;
   IProgressMonitor myProgressMonitor;
   myProject.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, myProgressMonitor);

Per un progetto Java, questa richiama il generatore incrementale di progetto Java (insieme a qualsiasi altro generatore incrementale di progetto aggiunto alla specifica di build del progetto). I file .class generati vengono scritti nella cartella di output designata. Nel caso di una build di batch completa, tutti i file .class della cartella di output vengono 'ripuliti' per garantire che non vengano rilevati file non aggiornati. Accertarsi di inserire tutti i file .class per i quali non sono presenti file di origine corrispondenti in cartelle di file di classe separate nel percorso classi e non nella cartella di output.

Nella cartella di output vengono copiati anche altri file di risorse. E possibile controllare quali file di risorse vengono copiati utilizzando il filtro delle risorse. Per filtrare, ad esempio i file che terminano con '.ignore' e le cartelle denominate 'META-INF', utilizzare:

   Hashtable options = JavaCore.getOptions();
options.put(JavaCore.CORE_JAVA_BUILD_RESOURCE_COPY_FILTER, "*.ignore,META-INF/");
JavaCore.setOptions(options);

I nomi file vengono filtrati se corrispondono a uno dei modelli forniti. Intere cartelle vengono filtrate se i relativi nomi corrispondono a uno dei nomi di cartella forniti terminanti con un separatore di percorso.

E anche possibile configurare i generatori di batch e incrementali in modo che generino un unico errore quando il file .classpath presenta errori. Questa opzione è attiva per impostazione predefinita ed elimina numerosi errori, tutti generalmente determinati da un file jar mancante. Vedere l'opzione CORE_JAVA_BUILD_INVALID_CLASSPATH di JavaCore .

Utilizzo dell'adattatore javac ant

Utilizzando l'adattatore javac, è possibile utilizzare il compilatore Eclipse all'interno di uno script Ant. Per utilizzare il compilatore Eclipse, è sufficiente semplicemente definire la proprietà build.compiler nello script. Di seguito viene riportato un breve esempio.
<?xml version="1.0" encoding="UTF-8" ?>
<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>
La sintassi utilizzata per l'attività javac ant si trova nella documentazione relativa alle attività javac ant . L'adattatore corrente supporta l'attività Javac Ant 1.4.1. La versione 1.5 sarà disponibile quando verrà rilasciato Ant 1.5.

Determinazione dei problemi

Il nucleo di JDT definisce un indicatore specializzato (tipo di indicatore"org.eclipse.jdt.core.problem ") per evidenziare problemi di compilazione. Per scoprire in modo programmatico i problemi rilevati dal compilatore, utilizzare il protocollo degli indicatori di piattaforma standard. Per una panoramica sull'utilizzo degli indicatori, fare riferimento alla sezione relativa agli indicatori di risorse.

Il seguente frammento di codice rileva tutti gli indicatori di problemi Java all'interno di un'unità di compilazione.

   public IMarker[] findJavaProblemMarkers(ICompilationUnit cu) 
throws CoreException {
IResource javaSourceFile = cu.getUnderlyingResource();
IMarker[] markers =
javaSourceFile.findMarkers(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER,
true, IResource.DEPTH_INFINITE);
}

Gli indicatori di problemi Java vengono conservati dal generatore di progetto Java e vengono automaticamente rimossi nel momento in cui i problemi vengono risolti e il codice sorgente Java viene nuovamente compilato.

Il valore id del problema è impostato da una delle costanti in IProblem . L'id del problema è affidabile, tuttavia il messaggio è localizzato, pertanto è possibile modificarlo in base alla locale predefinita. Le costanti definite in IProblem si descrivono autonomamente.

Per raccogliere i problemi rilevati durante un'operazione Java, ènecessario definire un'implementazione di IProblemRequestor. E possibile riconciliare le copie di lavoro con la rilevazione dei problemi se è stato fornito un IProblemRequestor per la creazione della copia di lavoro. A questo scopo, è possibile utilizzare il metodo reconcile. Ad esempio:

  ICompilationUnit unit = ..; // richiamare un'unità di compilazione
			
  // creare il richiedente per la raccolta dei problemi rilevati
  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; } // se attivo, rileva i problemi
  };
    
  // utilizzare la copia di lavoro per conservare l'originale con l'errore
  IWorkingCopy workingCopy = (IWorkingCopy)unit.getWorkingCopy(null, null, problemRequestor);
  ((IOpenable)workingCopy).getBuffer().setContents("public class X extends Zork {}");

  // riconciliazione trigger			
  workingCopy.reconcile(true, null);
E possibile aggiungere un'azione ai problemi riportati nel metodoacceptProblem(IProblem). In questo esempio, il problema riportato è cheZork non può essere risolto oppure non è una superclasse valida e il relativo id è IProblem.SuperclassNotFound.

Copyright IBM Corporation e altri 2000, 2002. Tutti i diritti riservati.