Kompilér Java-kode

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.

Kompilér kode

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);

Brug batchcompileren

Søg efter batchcompileren

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.

Udfør batchcompileren

Tilgængelige indstillinger

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.1 (større version: 45 mindre: 3)
  • 1.2 (større version: 46 mindre: 0)
  • 1.3 (større version: 47 mindre: 0)
  • 1.4 (større version: 48 mindre: 0)
  • 1.5, 5 eller 5.0 (større version: 49 mindre: 0)
  • 1.6, 6 eller 6.0 (større version: 50 mindre: 0)
Standardværdier er:
  • 1.1 i -1.3-tilstand
  • 1.2 i -1.4-tilstand
  • 1.5 i -1.5-tilstand
  • 1.6 i -1.6-tilstand
-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:
  • 1.3
  • 1.4
  • 1.5, 5 eller 5.0
  • 1.6, 6 eller 6.0
Standardværdier er:
  • 1.3 i -1.3-tilstand
  • 1.3 i -1.4-tilstand
  • 1.5 i -1.5-tilstand
  • 1.6 i -1.6-tilstand
I 1.4 behandles assert som et nøgleord. I 1.5 og 1.6 behandles enum og assert som nøgleord.
Tilpasning af advarsler
-warn:
allDeprecation
allJavadoc
assertIdentifier
boxing
charConcat
conditionAssign
constructorName
dep-ann
deprecation
discouraged
emptyBlock
enumSwitch
fallthrough
fieldHiding
finalBound
finally
forbidden
hiding
incomplete-switch
indirectStatic
intfAnnotation
intfNonInherited
javadoc
localHiding
maskedCatchBlocks
nls
noEffectAssign
null
over-ann
paramAssign
pkgDefaultMethod
raw
semicolon
serial
specialParamHiding
static-access
staticReceiver
suppress
synthetic-access
syntheticAccess
tasks(<task1>|...|<taskN>)
typeHiding
ikke markeret
unnecessaryElse
unqualified-field-access
unqualifiedField
unused
unusedArgument
unusedImport
unusedLabel
unusedLocal
unusedPrivate
unusedThrown
uselessTypeCheck
varargsCast
warningToken
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
allDeprecation afvisning endog inde i forældet kode
allJavadoc ugyldig eller manglende javadoc
assertIdentifier forekomst af assert anvendt som id
boxing autoboxing-konvertering
charConcat når et char-array bruges i en sammenkædning af strenge uden at blive konverteret eksplicit til en streng
conditionAssign mulig tilfældig Boolesk tildeling
constructorName metode med konstruktørnavn
dep-ann annotationen @Deprecated mangler
deprecation brug af forældet type eller medlem uden for forældet kode
discouraged brug af typer, der matcher en frarådet adgangsregel
emptyBlock ikke-dokumenteret tom blok
enumSwitch,
incomplete-switch
ufuldstændig enum-parameter
fallthrough mulig udbrydnings-case
fieldHiding felt skjuler en anden variabel
finalBound parameter med binding af afsluttende type
finally afsluttende blok afslutter ikke normalt
forbidden brug af typer, der matcher en forbudt adgangsregel
hiding makro til fieldHiding, localHiding, typeHiding og maskedCatchBlock
indirectStatic indirekte reference til statisk medlem
intfAnnotation annotationstype brugt som supergrænseflade
intfNonInherited grænseflade med ikke-overtaget metodekompatibilitet
javadoc ugyldigt Javadoc
localHiding lokal variabel, der skjuler en anden variabel
maskedCatchBlocks skjult catch-blok
nls ikke-nls strengkonstanter (mangel på koder //$NON-NLS-<n>)
noEffectAssign tildeling uden virkning
null manglende eller overflødig Null-kontrol
over-ann annotationen @Override mangler
paramAssign tildeling til en parameter
pkgDefaultMethod forsøg på at overskrive pakke-standardmetoden
raw brug af en rå type (i stedet for en type med parametre)
semicolon unødvendigt semikolon eller tom sætning
serial manglede serialVersionUID
specialParamHiding konstruktør- eller setter-parameter skjuler andet felt
static-access makro til indirectStatic og staticReceiver
staticReceiver hvis en ikke-statisk modtager bruges til at hente et statisk felt eller kalde en statisk metode
suppress aktiverer @SuppressWarnings
syntheticAccess,
synthetic-access
ved udførelse af syntetisk adgang for innerclass
tasks aktiverer understøttelse til opgavekoder i kildekode
typeHiding parametertype, der skjuler en anden type
unchecked ikke-markeret funktion
unnecessaryElse unødvendigt else-udtryk
unqualified-field-access,
unqualifiedField
ikke-kvalificeret reference til felt
unused makro til unusedArgument, unusedImport, unusedLabel, unusedLocal, unusedPrivate og unusedThrown
unusedArgument ubrugt metodeargument
unusedImport ubrugt importreference
unusedLabel ubrugt etiket
unusedLocal ubrugt lokal variabel
unusedPrivate ubrugt privat medlemserklæring
unusedThrown ubrugt, erklæret returneret undtagelse
uselessTypeCheck unødvendig cast/instanceof-funktion
varargsCast varargs-argument kræver eksplicit cast
warningToken ikke-håndteret advarsels-token i @SuppressWarnings

-nowarn Ingen advarsel (svarer til -warn:none)
-deprecation Svarer til -warn:deprecation.
Tilpasning af fejlfinding
-g[:none|:lines,vars,source] Angiv niveauet for fejlfindingsattributter.
-g Alle fejlfindingsoplysninger (svarer til -g:lines,vars,source).
-g:none Ingen fejlfindingsoplysninger.
-g:[lines,vars,source] Udvalgte fejlfindingsoplysninger.
-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
(i linje 8)...

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.

Eksempler

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.

Brug Ant Javac-adapter

Eclipse-compileren kan bruges i et Ant-script ved hjælp af Javac-adapteren. Hvis du vil bruge Eclipse-compileren, skal du blot definere egenskaben build.compiler i scriptet. Her er et lille eksempel.
<?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.

Fejlfinding

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.

Udelad advarsler vha. 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: