Java-Code kompilieren

Die JDT-Plug-ins umfassen einen Java-Compiler, mit dem Java-Klassendateien (.class) entweder schrittweise oder im Stapelmodus aus dem Quellcode erstellt werden können. Der Compiler stellt keine direkte API zur Verfügung. Sie wird als Erstellungsprogramm für Java-Projekte installiert. Die Kompilierung wird mit Hilfe von Standarderstellungsmechanismen der Plattform ausgelöst.

Der Erstellungsmechanismus der Plattform ist unter Programme für die schrittweise Projekterstellung ausführlich beschrieben.

Code kompilieren

Mit der Erstellungs-API können Sie die Java-Quellendateien in einem Projekt programmgestützt kompilieren.

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

Auf diese Weise wird das Programm zur schrittweisen Java-Projekterstellung für ein Java-Projekt aufgerufen (zusammen mit anderen Programmen zur schrittweisen Projekterstellung, die zur Erstellungsspezifikation des Projekts hinzugefügt wurden). Die generierten .class-Dateien werden in den designierten Ausgabeordner geschrieben. Zusätzliche Ressourcendateien werden ebenso in den Ausgabeordner kopiert.

Im Falle einer vollständigen Stapelerstellung werden möglicherweise alle .class-Dateien im Ausgabeordner "bereinigt", um sicherzustellen, dass keine alten Dateien gefunden werden. Dies wird unter Verwendung einer Option des JDT-Kernerstellungsprogramms(CORE_JAVA_BUILD_CLEAN_OUTPUT_FOLDER) gesteuert.  Die Standardeinstellung für diese Option ist die Bereinigung der Ausgabeordner.  Sofern diese Option nicht zurückgesetzt wird, müssen Sie sicherstellen, dass sich alle .class-Dateien, für die keine entsprechenden Quellendateien vorhanden sind, nicht im Ausgabeordner, sondern stattdessen in einem separaten Klassendateiordner im Klassenpfad befinden.

Die Programme für die schrittweise Erstellung und die Stapelerstellung können mit weiteren Optionen konfiguriert werden, die steuern, welche Ressourcen in den Ausgabeordner kopiert werden.   Das folgende Beispiel veranschaulicht, wie ein Ressourcenfilter so definiert wird, dassDateien mit der Endung ".ignore" und Ordner namens "META-INF" nicht in den Ausgabeordner kopiert werden:

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

Die Dateinamen werden gefiltert, wenn sie mit einem der vorgegebenen Muster übereinstimmen. Es werden ganze Ordner gefiltert, wenn deren Name mit einem der vorgegebenen Ordnernamen, die mit einem Pfadtrennzeichen enden, übereinstimmt.

Die schrittweisen Erstellungsprogramme und die Stapelerstellungsprogramme können auch so konfiguriert werden, dass sie nur einen einzigen Fehler generieren, wenn die .classpath-Datei Fehler enthält. Diese Option wird standardmäßig definiert und eliminiert zahlreiche Fehler.  Eine vollständige Liste der Optionen und Standardwerte für die Erstellungsprogramme finden Sie unter Optionen für JDT-Kernerstellungsprogramme.

Der Compiler kann auch mit JavaCore-Optionen konfiguriert werden.  Sie können beispielsweise die Wertigkeit definieren, die für unterschiedliche Typen von Fehlern, die während der Kompilierung festgestellt werden, verwendet werden sollen.  Eine vollständige Liste der Optionen und Standardwerte für die Compiler finden Sie unter Optionen für JDT-Kerncompiler.

Wenn Sie Optionen für das Erstellungsprogramm oder den Compiler programmgestützt konfigurieren, sollten Sie den Geltungsbereich der Optionen festlegen.  Beispielsweise könnten Sie angeben, dass die Definition eines Ressourcenfilters nur auf ein bestimmtes Projekt angewendet werden soll.  Das folgende Beispiel definiert den bereits gezeigten Ressourcenfilter, legt ihn jedoch nur für ein einziges Projekt fest.

   
   Hashtable options = myProject.getOptions(false);  // get only the options set up in this project
   options.put(JavaCore.CORE_JAVA_BUILD_RESOURCE_COPY_FILTER, "*.ignore,META-INF/");
   myProject.setOptions(options);

ant javac-Adapter verwenden

Der Eclipse-Compiler kann unter Verwendung des javac-Adapters innerhalb eines Ant-Scripts verwendet werden. Um den Eclipse-Compiler zu verwenden, definieren Sie einfach das Merkmal build.compiler in Ihrem Script. Beispiel:
<?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>
Die für die ant javac-Task verwendete Syntax finden Sie in der Dokumentation zur ant javac-Task. Der aktuelle Adapter unterstützt die ant javac-Task der Version 1.4.1. Version 1.5 wird verfügbar sein, wenn Ant 1.5 freigegeben wird.

Probleme ermitteln

Der JDT-Kern definiert eine spezielle Markierung (Markierungstyp "org.eclipse.jdt.core.problem"), die auf Kompilierungsprobleme hinweist. Damit durch den Compiler festgestellte Probleme programmgestützt ermittelt werden können, sollte das Standardmarkierungsprotokoll der Plattform verwendet werden. Eine Übersicht über die Verwendung von Markierungen finden Sie unter Ressourcenmarkierungen.

Das folgende Snippet sucht in einer Kompiliereinheit nach allen Java-Problemmarkierungen.

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

Java-Problemmarkierungen werden durch das Programm für die Java-Projekterstellung verwaltet und automatisch entfernt, sobald die Probleme gelöst wurden und die Java-Quelle erneut kompiliert wird.

Der Wert für die Fehler-ID wird von einer der Konstanten in IProblem festgelegt. Die Fehler-ID ist zwar zuverlässig, die Nachricht wird jedoch lokalisiert und kann daher entsprechend der standardmäßigen Ländereinstellung geändert werden. Die in IProblem definierten Konstanten erklären sich selbst.

Eine Implementierung von IProblemRequestor sollte definiert werden, um die während einer Java-Verarbeitung aufgespürten Fehler zu sammeln. Arbeitskopien können mit der Fehlererkennung ausgeglichen werden, wenn ein IProblemRequestor für die Erstellung der Arbeitskopie zur Verfügung gestellt wurde. Zu diesem Zweck können Sie die Methode Ausgleich verwenden. Beispiel:

  ICompilationUnit unit = ..; // get some compilation unit
			
  // create requestor for accumulating discovered problems
  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; } // will detect problems if active
  };
    
  // use working copy to hold source with error
  IWorkingCopy workingCopy = (IWorkingCopy)unit.getWorkingCopy(null, null, problemRequestor);
  ((IOpenable)workingCopy).getBuffer().setContents("public class X extends Zork {}");

  // trigger reconciliation			
  workingCopy.reconcile(true, null);
Sie können mit der Methode acceptProblem (IProblem) eine Aktion für die gemeldeten Fehler hinzufügen . In diesem Beispiel ist die Fehlermeldung, dass Zork nicht aufgelöst werden kann oder keine gültige Superklasse ist. Die Fehler-ID ist IProblem.SuperclassNotFound.

Copyright IBM Corporation und Andere 2000, 2003. Alle Rechte vorbehalten.