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.
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 mit Hilfe einer JDT-Kernerstellungsprogrammoption (CORE_JAVA_BUILD_CLEAN_OUTPUT_FOLDER) gesteuert. Der Standardwert für diese Option ist das Bereinigen der Ausgabeordner. Sofern diese Option nicht zurückgesetzt ist, stellen Sie sicher, dass Sie alle .class-Dateien, für die keine entsprechenden Quellendateien vorhanden sind, in einen separaten Klassendateiordner im Klassenpfad platzieren und nicht im Ausgabeordner.
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, dass Dateien 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 eingerichtet 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 unter Verwendung von 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 soll. 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 über das Programm konfigurieren, sollten Sie den jeweiligen Geltungsbereich der betreffenden Option festlegen. Ein Ressourcenfilter beispielsweise kann so eingerichtet werden, dass er nur für ein bestimmtes Projekt gilt. 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);
Die Stapelcompilerklasse befindet sich in den internen Klassen des Plug-ins JDT/Core. Sie befindet sich also in der Datei jdtcore.jar im Verzeichnis plugins/org.eclipse.jdt.core. Der Name der Klasse ist org.eclipse.jdt.internal.compiler.batch.Main.
java -classpath org.eclipse.jdt.core_3.1.1.jar org.eclipse.jdt.internal.compiler.batch.Main
-classpath rt.jar A.java
oder:
java -jar org.eclipse.jdt.core_3.1.1.jar -classpath rt.jar A.java
org.eclipse.jdt.internal.compiler.batch.Main.main(new
String[] {"-classpath", "rt.jar", "A.java"});
Die Methode compile(String)
ist eine gut geeignete Methode zum Aufruf eines Stapelcompilers in einer Java-Anwendung. Anstelle von
org.eclipse.jdt.internal.compiler.batch.Main.main(new
String[] {"-classpath", "rt.jar", "A.java"});
können Sie einfach schreiben org.eclipse.jdt.internal.compiler.batch.Main.compile("-classpath
rt.jar A.java");
Die Optionen mit orangenem Hintergrund sind die empfohlenen Optionen.
Name | Verwendung | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Klassenpfad-Optionen | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-bootclasspath <dir 1>;<dir 2>;...;<dir P> | Dies ist eine Liste von Verzeichnis- oder JAR-Dateien, die zum Laden der durch den Compiler verwendeten Klassendateien verwendet werden. Standardmäßig werden die Bibliotheken der aktiven VM verwendet. Die Einträge werden durch das Pfadtrennzeichen der Plattform getrennt. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-cp -classpath <dir 1>;<dir 2>;...;<dir P> |
Dies ist eine Liste von Verzeichnis- oder JAR-Dateien, die für die Kompilierung der Quellendateien verwendet werden. Der Standardwert ist der Wert der Eigenschaft "java.class.path". Die Einträge werden durch das Pfadtrennzeichen der Plattform getrennt. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-extdirs <dir 1>;<dir 2>;...;<dir P> | Dies ist eine Liste der Verzeichnisse, die zur Angabe der Position von Dateien mit der Erweiterung zip/jar verwendet werden. Die Einträge werden durch das Pfadtrennzeichen der Plattform getrennt. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-sourcepath <dir 1>;<dir 2>;...;<dir P> | Dies ist eine Liste der Verzeichnisse, die zur Angabe der Quellendateien verwendet werden. Die Einträge werden durch das Pfadtrennzeichen der Plattform getrennt. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-d <dir 1>|none | Dies wird verwendet um anzugeben, in welchem Verzeichnis Speicherauszüge der generierten .class-Dateien erstellt werden sollen. Wird dies übergangen, wird keine Paketverzeichnisstruktur erstellt. Wenn Sie keine .class-Dateien generieren möchten, verwenden Sie -d none. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-encoding <encoding name> | Standardformat der Quellcodierung angeben (eine angepasste Codierung kann auch für jede Datei einzeln angegeben werden, indem jeder Eingabequellendatei-/Ordnername mit dem Suffix [encoding <encoding name>]) versehen wird. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Optionen für Kompatibilität | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-target 1.1|1.2|1.3|1.4|1.5|5|5.0 | Dadurch wird die Zieleinstellung der .class-Datei angegeben.
Folgende Werte sind möglich:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-1.3 | Konformitätsstufe auf 1.3 setzen. Implizit -source 1.3 -target 1.1. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-1.4 | Konformitätsstufe auf 1.4 (Standard) setzen. Implizit -source 1.3 -target 1.2. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-1.5 | Konformitätsstufe auf 1.5 setzen. Implizit -source 1.5 -target 1.5. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-source 1.3|1.4|1.5|5|5.0 | Dadurch wird die Quellenebene des Compilers aktiviert. Folgende Werte sind möglich:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Optionen für Warnung | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-warn:allDeprecation |
Legt die Stufe für Warnungen fest. z.B. -warn:unusedLocals,deprecation Die Standardeinstellungen sind in rot angegeben.
-warn:<Warnungen getrennt durch ,> Nur aufgelistete Warnungen aktivieren -warn:+<Warnungen getrennt durch ,> Zusätzliche Warnungen aktivieren -warn:-<Warnungen getrennt durch ,> Spezifische Warnungen inaktivieren
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-nowarn | Keine Warnung (entspricht -warn:none) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-deprecation | Entspricht -warn:deprecation. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Optionen für Debug | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-g[:none|:lines,vars,source] | Debug-Attributstufen festlegen
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-preserveAllLocals | Den Compiler explizit auffordern, alle lokalen Variablen beizubehalten (für Debug-Zwecke). Wenn dies nicht erfolgt, wird der Compiler nicht verwendete lokale Variablen entfernen. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Erweiterte Optionen | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@<file> | Befehlszeilenargumente aus Datei lesen | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-maxProblems <n> | Maximale Anzahl an Fehlern pro Kompiliereinheit (standardmäßig 100) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-log <filename> | Angabe einer Protokolldatei, in der ein Speicherauszug aller Ausgaben des Compilers erstellt wird. Dies ist sehr hilfreich, wenn Sie ein Debug für den Stapelcompiler ausführen oder eine Datei abrufen möchten, die alle Fehler und Warnungen aus einer Stapelerstellung enthält. Wenn die Erweiterung .xml ist, ist die generierte Protokolldatei eine xml-Datei. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-proceedOnError | Kompilierung im Falle von Fehlern, Speicherauszug mit Problemmethoden oder Problemtypen beibehalten. Dies ist nur dann zu empfehlen, wenn Sie Ihre Anwendnung selbst dann ausführen möchten, wenn noch Fehler vorhanden sind. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-verbose | Druckt, wenn angegeben, zugegriffene/verarbeitete Kompiliereinheiten in der Konsole oder der Protokolldatei. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-referenceInfo | Verweisinformationen berechnen. Dies ist nur dann hilfreich, wenn eine Verbindung zu dem Erstellungsprogramm besteht. Andernfalls sind die Verweisinformationen nutzlos. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-progress | Fortschritt anzeigen (nur im -log-Modus) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-time | Display speed information | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-noExit | Kein Aufruf von System.exit(n) am Ende der Kompilierung (n=0 wenn kein Fehler vorliegt) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-repeat <n> | Kompilierungprozess <n>-mal wiederholen (perf-Analyse). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-inlineJSR | JSR-Bytecode integrieren (implizit wenn Ziel >= 1.5) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-enableJavadoc | Verweise innerhalb des Javadoc berücksichtigen | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Optionen für die Hilfe | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-? -help | Hilfenachrichtanzeigen | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-v -version | Build-Nummer des Compilers anzeigen. Dies ist sehr nützlich, um einen Programmfehler zu melden. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-showversion | Build-Nummer des Compilers anzeigen und fortfahren. Dies ist sehr nützlich, um einen Programmfehler zu melden. |
d:\temp -classpath rt.jar -time -g -d d:/tmp
|
Es kompiliert alle Quellendatei in d:\temp und dessen Unterordnern. Der Klassenpfad ist einfach rt.jar. Es generiert alle Debug-Attribute und von allen generierten .class-Dateien wird ein Speicherauszug erstellt in d:\tmp. Die Geschwindigkeit des Compilers wird angezeigt, wenn der Stapelprozess abgeschlossen ist. |
d:\temp\Test.java -classpath d:\temp;rt.jar -g:none
|
Nur Test.java wird kompiliert und alle abhängigen Dateien werden aus d:\temp abgerufen. Der Klassenpfad ist rt.jar und d:\temp, was bedeutet, dass alle notwendigen Klassen zuerst in d:\temp und dann in rt.jar gesucht werden. Es werden keine Debug-Attribute generiert und von allen generierten .class-Dateien wird ein Speicherauszug erstellt in d:\tmp. |
<?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 Javac Ant_Task der Versionen 1.4.1 bis 1.6.5.
Wenn Sie eine Version höher als 1.5.0 verwenden, können Sie das verschachtelte Compilerargument-Element verwenden, um compiler-spezifische Optionen anzugeben.
... <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> <compilerarg compiler="org.eclipse.jdt.core.JDTCompilerAdapter" line="-1.5 -warn:+boxing"/> </javac> ...
Um den Abruf compiler-abhängiger Scripts zu verhindern, empfehlen wir die Einstellung des Compiler-Arguments auf org.eclipse.jdt.core.JDTCompilerAdapter
.
Ist dieses nicht eingestellt, kann das Script nur mit dem Eclipse-Compiler verwendet werden. Ist dieses eingestellt, wird das verschachtelte Compiler-Argument ignoriert, falls der Name anders ist als der Compilername, der durc h die Eigenschaft build.compiler
angegeben wird.
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.
Der folgende Ausschnitt 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
ICompilationUnit workingCopy = unit.getWorkingCopy(new WorkingCopyOwner() {}, problemRequestor, null);
((IOpenable)workingCopy).getBuffer().setContents("public class X extends Zork {}");
// trigger reconciliation
workingCopy.reconcile(NO_AST, true, null, 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.