JDT-plugins inkluderer en trinvis Java-compiler, der udføres i baggrunden, til bygning af Java .class-filer fra kildekode. Compileren indeholder ikke noget direkte API, og den installeres som et byggeprogram i Java-projekter. Kompileringen udløses via standardplatformens byggemekanismer.
Platformens byggemekanisme beskrives i detaljer i Programmer til trinvis bygning af projekter.
Du kan kompilere Java-kildefiler programmatisk i et projekt ved at bruge bygge-API'et.
IProject myProject; IProgressMonitor myProgressMonitor; myProject.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, myProgressMonitor);
For et Java-projekt startes det trinvise Java-projektbyggeprogram (sammen med andre trinvise projektbyggeprogrammer, der er blevet tilføjet til projektets byggespecifikationer). De genererede .class-filer er skrevet til den angivne outputfolder. Der kopieres også flere ressourcefiler til outputfolderen.
Ved en fuldstændig baggrundsbygning bliver der måske ryddet op i alle .class-filerne i outputfolderen for at sikre, at der ikke er nogen forældede filer. Det kontrolleres ved hjælp af en indstilling i JDT-kernebyggeprogrammet (CORE_JAVA_BUILD_CLEAN_OUTPUT_FOLDER). Standardværdien for denne indstilling er at rydde op i outputfoldere. Medmindre indstillingen nulstilles, skal du sørge for at placere alle .class-filer, som du ikke har tilsvarende kildefiler til, i en adskilt klassefilsfolder i classpath - og ikke i outputfolderen.
De trinvise baggrundsbyggeprogrammer kan konfigureres med andre indstillinger, der
kontrollerer de ressourcer, som skal kopieres til outputfolderen. Følgende eksempel
viser, hvordan et ressourcefilter indstilles, så filer, der ender med '.ignore', og filer
ved navn 'META-INF' ikke kopieres til outputfolderen:
Hashtable options = JavaCore.getOptions();
options.put(JavaCore.CORE_JAVA_BUILD_RESOURCE_COPY_FILTER, "*.ignore,META-INF/");
JavaCore.setOptions(options);
Filnavne bortfiltreres, hvis de matcher et af de angivne mønstre. Hele foldere bortfiltreres, hvis deres navn matcher et af de angivne foldernavne, som ender med en stiseparator.
De trinvise baggrundsbyggeprogrammer kan også konfigureres, så de kun genererer en enkelt fejl, når der er fejl i .classpath-filen. Denne indstilling, der som standard er aktiveret, eliminerer mange fejl. Se Tilpasning af JDT-kernebyggeprogram, hvis du vil have en fuldstændig liste over byggeprogramrelaterede indstillinger og deres standardværdier.
Compileren kan også konfigureres ved hjælp af JavaCore-indstillinger. Du kan for eksempel definere, hvilket niveau der skal bruges til forskellige problemtyper, som bliver fundet under kompileringen. Se Tilpasning af JDT-kernekompilering, hvis du vil have en fuldstændig liste over compilerrelaterede indstillinger og standardværdier.
Når du konfigurerer indstillinger til byggeprogrammet eller compileren fra et program, skal du angive indstillingens omfang. Angivelsen af f.eks. et ressourcefilter gælder måske kun for et bestemt projekt:
Hashtable options = myProject.getOptions(false); // hent kun de indstillinger, der er angivet i projektet options.put(JavaCore.CORE_JAVA_BUILD_RESOURCE_COPY_FILTER, "*.ignore,META-INF/"); myProject.setOptions(options);
Klassen for batchcompileren er placeret i de interne klasser i
JDT Core-plugin'en. Navnet på klassen er
org.eclipse.jdt.internal.compiler.batch.Main.
Den er pakket i plugins/org.eclipse.jdt.core_3.2.0.jar
. Siden 3.2 kan den også fås som en separat overførsel.
Navnet på filen er ecj.jar. Dens tilhørende kilde er også tilgængelig. Du kan hente filerne ved at gå til overførselssiden og søge efter afsnittet JDT Core Batch Compiler. Denne JAR-fil indeholder batchcompileren og Javac Ant-adapteren.
Den kan således både bruges som et enkeltstående program og i et Ant-byg uden for Eclipse.
java -classpath org.eclipse.jdt.core_3.2.0.jar org.eclipse.jdt.internal.compiler.batch.Main
-classpath rt.jar A.java
eller:
java -jar org.eclipse.jdt.core_3.2.0.jar -classpath rt.jar A.java
org.eclipse.jdt.internal.compiler.batch.Main.main(new
String[] {"-classpath", "rt.jar", "A.java"});
Metoden compile(String)
er nyttig til at starte batchcompileren på
i et Java-program. I stedet for
org.eclipse.jdt.internal.compiler.batch.Main.main(new
String[] {"-classpath", "rt.jar", "A.java"});
kan du ganske enkelt skrive
org.eclipse.jdt.internal.compiler.batch.Main.compile("-classpath
rt.jar A.java");
De foreslåede indstillinger vises med orange baggrund.
Navn | Brug | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Tilpasning af Classpath | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-bootclasspath <bibl 1>;<bibl 2>;...;<bibl P> | Dette er en liste over biblioteker eller JAR-filer,
som bruges til Bootstrap-funktionen for de klassefiler, der benyttes af compileren.
Som standard anvendes bibliotekerne på den igangværende VM. Indgange adskilles af platformens stiseparator. Hvert bibliotek eller fil kan angive adgangsregler for typer mellem '[' og ']'. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-cp -classpath <bibl 1>;<bibl 2>;...;<bibl P> |
Dette er en liste over biblioteker eller JAR-filer, der
bruges til at kompilere kildefilerne. Standardværdien er værdien af egenskaben
"java.class.path". Indgange adskilles af platformens stiseparator. Hvert bibliotek eller fil kan angive adgangsregler for typer mellem '[' og ']' (f.eks. [-X] for at forbyde adgang til type X, [~X] for at fraråde adgang til type X, [+p/X:-p/*] for at forbyde adgang til alle typer i pakken, men tillade adgang til p/X). |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-extdirs <bibl 1>;<bibl 2>;...;<bibl P> | Dette er en liste over biblioteker, der bruges til at angive placeringen af filer med filtypen .zip eller .JAR. Indgange adskilles af platformens stiseparator. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-endorseddirs <bibl 1>;<bibl 2>;...;<bibl P> | Dette er en liste over biblioteker, der bruges til at angive placeringen af godkendte ZIP/JAR-filer. Indgange adskilles af platformens stiseparator. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-sourcepath <bibl 1>;<bibl 2>;...;<bibl P> | Dette er en liste over biblioteker, der bruges til at angive kildefilerne.
Indgange adskilles af platformens stiseparator. Hvert bibliotek kan angive adgangsregler for typer mellem '[' og ']'. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-d <dir 1>|none | Med dette angives, i hvilket bibliotek de genererede klassefiler
skal dumpes. Hvis det udelades, oprettes der ikke nogen biblioteksstruktur. Brug -d none, hvis du slet ikke vil generere nogen .class-fil. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-encoding <kodningsnavn> | Angiver standardformatet for kildekodning (en tilpasset kodning kan også angives ved for hver enkelt fil at tilføje dette suffiks til navnet på hver inputkildefil/folder: [<kodningsnavn>], f.eks. X.java[utf8]). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Tilpasning af kompatibilitet | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-target 1.1|1.2|1.3|1.4|1.5|5|5.0|1.6|6|6.0 | Med dette angives målindstillingen for .class-file.
De mulige værdier er:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-1.3 | Angiv overholdelsesniveau til 1.3. Implicit -source 1.3 -target 1.1. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-1.4 | Angiv overholdelsesniveau til 1.4 (standard). Implicit -source 1.3 -target 1.2. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-1.5 | Angiv overholdelsesniveau til 1.5. Implicit -source 1.5 -target 1.5. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-1.6 | Angiv overholdelsesniveau til 1.6. Implicit -source 1.6 -target 1.6. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-source 1.3|1.4|1.5|5|5.0|1.6|6|6.0 | Bruges til at angive det kildeniveau, som forventes af compileren. De mulige værdier er:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Tilpasning af advarsler | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-warn:allDeprecation |
Angiv advarselsniveau. Eksempel: -warn:unusedLocal,deprecation Standardindstillingerne er markeret med rødt.
-warn:none deaktiverer alle advarsler -warn:<advarsler adskilt med ,> aktiverer præcist de angivne advarsler -warn:+<advarsler adskilt med ,> aktiverer ekstra advarsler -warn:-<advarsler adskilt med ,> deaktiverer bestemte advarsler
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-nowarn | Ingen advarsel (svarer til -warn:none) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-deprecation | Svarer til -warn:deprecation. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Tilpasning af fejlfinding | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-g[:none|:lines,vars,source] | Angiv niveauet for fejlfindingsattributter.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-preserveAllLocals | Anmod eksplicit compileren om at bevare alle lokale variabler (med henblik på fejlfinding). Hvis den udelades, fjerner compileren ubrugte lokale variabler. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Ignorerede paramametre (af hensyn til kompatibilitet med Javac-parametre) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-J<parameter> | overfør parameter til VM (Virtual Machine) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-X<parameter> | angiv parameter, der ikke er standard. -Xemacs ignoreres ikke. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-X | udskriv ikke-standardparametre, og afslut | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-O | optimér til udførelsestid | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Udvidede indstillinger | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@<file> | Læs kommandolinjeargumenter fra fil. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-maxProblems <n> | Det maksimale antal problemer pr. kompileringsenhed (standardværdi er 100). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-log <filename> | Angiv en logfil, hvor alt output fra compileren bliver dumpet. Det er meget nyttigt, hvis du vil foretage fejlfinding af baggrundscompileren eller hente en fil, som indeholder alle fejl og advarsler fra et baggrundsbyg. Hvis filtypen er .xml, vil den genererede logfil være en xml-fil. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-Xemacs | Brug emacs-syntaks til at vise fejl- og advarselsplaceringer i konsollen og almindelige tekstlogfiler. XML-logfiler berøres ikke af parameteren. Når parameteren er aktiv, vil meddelelsen:
2. WARNING in /workspace/X.java blive vist som:
/workspace/X.java:8: warning: The method... |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-proceedOnError | Fortsæt kompilering på trods af fejl, og dump klassefiler med fejlbehæftede metoder eller typer. Det kan kun anbefales, hvis du vil kunne udføre programmet, selvom der stadig er fejl. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-verbose | Udskriv de åbnede/behandlede kompileringsenheder i konsollen eller logfilen, hvis det er angivet. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-referenceInfo | Beregn referenceoplysninger. Dette er kun nyttig i forbindelse med byggeprogrammet. I andre sammenhænge er referenceoplysningerne uden betydning. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-progress | Vis status (kun i tilstanden -log). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-time | Vis hastighedsoplysninger. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-noExit | Undlad at kalde System.exit(n) i slutningen af kompileringen (n=0, hvis der ikke er nogen fejl). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-repeat <n> | Gentag kompileringsprocessen <n> gange (udfør analyse). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-inlineJSR | Inline JSR-bytekode (implicit, hvis målet >= 1.5). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-enableJavadoc | Tag referencer i Javadoc i betragtning. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Tilpasning af Hjælp | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-? -help | Vis hjælpemeddelelse. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-v -version | Vis compilerens bygnummer. Nummeret får du brug for ved rapportering af fejl. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-showversion | Vis compilerens bygnummer, og fortsæt. Nummeret får du brug for ved rapportering af fejl. |
d:\temp -classpath rt.jar -time -g -d d:/tmp
|
Alle kildefiler kompileres i d:\temp og tilhørende underfoldere. Classpath er simpelthen rt.jar. Alle fejlfindingsattributter genereres, og alle genererede .class-filer dumpes i d:\tmp. Compilerens hastighed bliver vist, når baggrundskørslen er færdig. |
d:\temp\Test.java -classpath d:\temp;rt.jar -g:none
|
Kun Test.java og dens eventuelle afhængige filer kompileres, og afhængige filer hentes fra d:\temp. Classpath er d:\temp efterfulgt af rt.jar, hvilket betyder, at der først søges efter alle nødvendige klasser i d:\temp og derefter i rt.jar. Der genereres ingen fejlfindingsattributter, og alle genererede .class-filer dumpes i d:\temp. |
<?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>Den anvendte syntaks til Javac Ant-opgaven kan findes under Ant javac task documentation. Den aktuelle adapter understøtter opgaven i Javac Ant version 1.4.1 til 1.6.5.
Hvis du bruger en nyere version end 1.5.0, kan du bruge det indlejrede compilerargumentelement til at angive compilerspecifikke indstillinger.
... <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> ...
Det tilrådes at bruge compilerargumentet indstillet til
org.eclipse.jdt.core.JDTCompilerAdapter
for at undgå at få
compilerafhængige script. Hvis denne indstilling ikke anvendes, kan script kun bruges
sammen med Eclipse-compileren. Hvis den anvendes, ignoreres det indlejrede
compilerargument, hvis navnet er forskelligt fra det compilernavn, der angives af
egenskaben build.compiler
.
JDT-kernen definerer en speciel markering (markeringstypen "org.eclipse.jdt.core.problem") til angivelse af kompileringsproblemer. Hvis de problemer, compileren har registreret, skal findes programmatisk, skal platformens standardmarkeringsprotokol anvendes. Se Ressourcemarkeringer for at få vist en oversigt over brugen af markeringer.
Med nedenstående kodestykke bliver alle markeringer af Java-problemer i en kompileringsenhed fundet.
public IMarker[] findJavaProblemMarkers(ICompilationUnit cu) throws CoreException { IResource javaSourceFile = cu.getUnderlyingResource(); IMarker[] markers = javaSourceFile.findMarkers(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER, true, IResource.DEPTH_INFINITE); }
Markeringer af Java-problemer vedligeholdes af Java-projektbyggeprogrammer og fjernes automatisk, når problemer er løst, og Java-kilden igen kompileret.
Problem-id'ens værdi angives til en af de konstanter, der er defineret i IProblem. Problem-id'en er pålidelig, men meddelelsen er lokaliseret, og kan derfor være ændret i overensstemmelse med de sprogkonventioner, der er standard. De konstanter, der defineres i IProblem er selvbeskrivende.
En implementering af
IProblemRequestor skal defineres, så de problemer, der findes under udførelse
af en Java-funktion, opsamles. Arbejdskopier kan afstemmes med fejlfinding, hvis der er
leveret en
IProblemRequestor ved oprettelse af arbejdskopien. Det kan du gøre ved at bruge
metoden
reconcile. Her er et eksempel:
ICompilationUnit unit = ..; // hent en kompileringsenhed
// opret anmoder til akkumulering af fundne fejl
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; } // registrerer problemer, hvis aktiv
};
// brug arbejdskopi til at rumme fejlbehæftet kilde
ICompilationUnit workingCopy = unit.getWorkingCopy(new WorkingCopyOwner() {}, problemRequestor, null);
((IOpenable)workingCopy).getBuffer().setContents("public class X extends Zork {}");
// udløser afstemning
workingCopy.reconcile(NO_AST, true, null, null);
Du kan tilføje en funktion til de rapporterede problemer i metoden
acceptProblem(IProblem). I dette eksempel vil det rapporterede problem være, at Zork
ikke kan fortolkes eller ikke er en gyldig superklasse og id'en er
IProblem.SuperclassNotFound.
SuppressWarnings
Java 5.0 giver brugeren mulighed for at deaktivere kompileringsadvarsler i forhold til en delmængde af en kompileringsenhed vha. annotationen java.lang.SuppressWarning
.
@SuppressWarning("unused") public void foo() { String s; }
Uden annotationen ville compileren rapportere, at den lokale variabel s
ikke benyttes.
Med annotationen vil compileren ignorere advarslen lokalt i forhold til metoden foo
uden at rapportere den. Derved kan advarsler andre steder i samme kompileringsenhed eller samme projekt bevares.
Følgende tokens kan bruges i annotationen SuppressWarning
: