Kompilera Java-kod

JDT-insticksprogrammen innehåller en inkrementell och batch Java-kompilator för byggande av Java .class-filer från källkod. Det finns inget direkt API som tillhandahålls av kompilatorn. Det installeras som en byggare på Java-projekt. Kompileringen aktiveras av vanliga plattformsbyggmekanismer.

Plattformsbyggmekanismer beskrivs utförligt i Inkrementella projektbyggare .

Kompilera kod

Du kan programmatiskt kompilera Java-källfilerna till ett projekt med hjälp av bygg-API:t.

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

För ett Java-projekt som anropar den inkrementella Java-projektbyggaren (tillsammans med andra inkrementella projektbyggare som har lagts till i projektets byggspecifikation). De genererade klassfilerna skrivs till den angivna utdatamappen. Ytterligare resursfiler kopieras även till utdatamappen. 

Vid ett fullständigt batchbygge kan det hända att alla klassfiler i utdatamappen rensas för säkerställa att inga gamla filer finns kvar. Detta styrs av ett alternativ i JDT Core Builder (CORE_JAVA_BUILD_CLEAN_OUTPUT_FOLDER).  Standardvärdet för detta alternativ är att rensa utdatamappar. Såvida detta alternativ inte återställs, måste du se till att placerar alla klassfiler för vilka du inte har motsvarande källfiler i en separat klassfilsmapp i classpath istället för i utdatamappen.

De inkrementella byggarna och batchbyggarna kan konfigureras med andra alternativ som styr vilka resurser som kopieras till utdatamappen.  Följande exempel visar hur du konfigurerar ett resursfilter så att filer som slutar med '.ignore' och mappar med namnet 'META-INF' inte kopieras till utdatamappen:

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

Filnamn filtreras bort om de matchar ett av de angivna mönstren. Hela mappar filtreras bort om deras namn matchar ett an de angivna mappnamnen som slutar med en sökvägsavgränsare.

De inkrementella byggarna och batchbyggarna kan även konfigureras till att enbart generera ett enda fel när .classpath-filen innehåller fel. Det här alternativet anges som standard och eliminerar flera fel.  Mer information om byggrelaterade alternativ och deras standardvärden finns i JDT Core-byggalternativ.

Kompilatorn kan även konfigureras med JavaCore-alternativ.  Ett exempel: du kan definiera den stränghet som ska användas för olika typer av problem som påträffas under kompilering.  Mer information om kompileringsrelaterade alternativ och deras standardvärden finns i JDT Core-alternativ för kompilering.

När du konfigurerar alternativ för byggaren eller kompilatorn programmatiskt, bör du ange omfattningen för alternativet.  Ett exempel: om du konfigurerar ett resursfilter kanske det bara gäller ett visst projekt.

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

Använda batchkompilatorn

Leta upp batchkompilatorn

Batchkompilatorklassen finns i de interna klasserna i JDT Core-insticksprogrammet. Namnet på klassen är org.eclipse.jdt.internal.compiler.batch.Main. Den är paketerad i plugins/org.eclipse.jdt.core_3.2.0.jar. Detta därför att 3.2, också är tillgängligt som separat inläsning. Filen heter ecj.jar. Dess motsvarande källa är också tillgänglig. Du får tag i dem genom att gå till hämtningssidan och söker efter avsnittet JDT Core Batch Compiler. Denna jar innehåller batch-kompilatorn och javac-ant-adaptern.

Därför kan den användas som fristående tillämpning och inuti ett ant-bygge utanför Eclipse.

Köra batchkompilatorn

Vilka alternativ är tillgängliga?

Med orange bakgrund, dessa är föreslagna alternativ.

Namn Användning
Classpath-alternativ
-bootclasspath <dir 1>;<dir 2>;...;<dir P> Det här är en lista med kataloger eller jar-filer som används för bootstrap-inläsning av de klassfiler som används av kompilatorn. Som standard används biblioteken i den VM som är igång. Poster avgränsas med plattformssökvägens avgränsare.
Varje katalog eller fil kan ange accessregler för typer mellan "'[' och ']".
-cp
-classpath <dir 1>;<dir 2>;...;<dir P>
Det här är en lista med kataloger eller jar-filer som används till att kompilera källfilerna. Standardvärdet är värdet för egenskapen "java.class.path". Poster avgränsas med plattformssökvägens avgränsare.
Varje katalog eller fil kan ange accessregler för typer mellan "'[' och ']" (t.ex. [-X] för att förbjuda access till typ X, [~X] inte uppmuntra access till typ X, [+p/X:-p/*] förbjuda access till alla typer i paket p men tillåta access till p/X).
-extdirs <dir 1>;<dir 2>;...;<dir P> Det här är en lista med kataloger som används till att ange platsen för tilläggets zip-/jar-filer. Poster avgränsas med plattformssökvägens avgränsare.
-endorseddirs <dir 1>;<dir 2>;...;<dir P> Det här är en lista med kataloger som används till att ange platsen för godkända zip-/jar-filer. Poster avgränsas med plattformssökvägens avgränsare.
-sourcepath <dir 1>;<dir 2>;...;<dir P> Det här är en lista med kataloger som används till att ange källfilerna. Poster avgränsas med plattformssökvägens avgränsare.
Varje katalog kan ange accessregler för typer mellan "'[' och ']".
-d <dir 1>|none Detta används till att ange i vilken katalog de genererade klassfilerna ska dumpas. Om värdet utelämnas, skapas ingen paketkatalogstruktur.
Om du inte vill generera någon klassfil alls, använder du -d none.
-encoding <encoding name> Ange standardformat för källkodning (anpassad kodning kan även anges på filbas genom att ange olika suffix för indatakällfiler/mappnamn med [<kodningsnamn>], t.ex. X.java[utf8]).
Kompatibilitetsalternativ
-target 1.1|1.2|1.3|1.4|1.5|5|5.0|1.6|6|6.0 Detta ange klassfilens målinställning. Möjliga värden är:
  • 1.1 (stor version: 45 liten: 3)
  • 1.2 (stor version: 46 liten: 0)
  • 1.3 (stor version: 47 liten: 0)
  • 1.4 (stor version: 48 liten: 0)
  • 1.5, 5 eller 5.0 (stor version: 49 liten: 0)
  • 1.6, 6 eller 6.0 (stor version: 50 liten: 0)
Standardvärden är:
  • 1.1 i läge -1.3
  • 1.2 i läge -1.4
  • 1.5 i läge -1.5
  • 1.6 i läge -1.6
-1.3 Ange kompatibilitetsnivå till 1.3. Implicit -source 1.3 -target 1.1.
-1.4 Ange kompatibilitetsnivå till 1.4 (standard). Implicit -source 1.3 -target 1.2.
-1.5 Ange kompatibilitetsnivå till 1.5. Implicit -source 1.5 -target 1.5.
-1.6 Ange kompatibilitetsnivå till 1.6. Implicit -source 1.6 -target 1.6.
-source 1.3|1.4|1.5|5|5.0|1.6|6|6.0 Den används till att specificera den källnivå som kompilatorn förväntar sig.
Möjliga värden är:
  • 1.3
  • 1.4
  • 1.5, 5 eller 5.0
  • 1.6, 6 eller 6.0
Standardvärden är:
  • 1.3 i läge -1.3
  • 1.3 i läge -1.4
  • 1.5 i läge -1.5
  • 1.6 i läge -1.6
I 1.4, behandlas assert som ett nyckelord. I 1.5 och 1.6 behandlas enum som assert nyckelord.
Varningsalternativ
-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
unchecked
unnecessaryElse
unqualified-field-access
unqualifiedField
unused
unusedArgument
unusedImport
unusedLabel
unusedLocal
unusedPrivate
unusedThrown
uselessTypeCheck
varargsCast
warningToken
Ange varningsnivå.
t.ex. -warn:unusedLocal,deprecation

Standardinställningar anges i rött.

    -warn:none                               avaktiverar alla varningar
    -warn:<varningar avgränsade med ,>    aktivera exakt de avlyssnade varningarna
    -warn:+<varningar avgränsade med ,>   aktivera ytterligare varningar
    -warn:-<varningar avgränsade med ,>   inaktivera specifika varningar
allDeprecation avskrivning även inuti avskriven kod
allJavadoc ogiltig eller saknad javadoc
assertIdentifier förekomst av assert används som identifierare
boxing autoboxing-omvandling
charConcat när en char-matris används i en strängsammanfogning utan att konverteras explicit till en sträng
conditionAssign möjlig oavsiktlig boolesk tilldelning
constructorName metod med konstruktörsnamn
dep-ann saknad @Deprecated-anteckning
deprecation användning av avskriven typ eller medlem utanför avskriven kod
discouraged används om typer överensstämmer med en avrådd accessregel
emptyBlock odokumenterat tomt block
enumSwitch,
incomplete-switch
ofullständig enumerationsväxel
fallthrough möjligt fall som fångas upp
fieldHiding fält som döljer en annan variabel
finalBound typparameter med slutlig bindning
finally slutligt block som inte slutförts normalt
forbidden används om typer överensstämmer med en förbjuden accessregel
hiding makro för fieldHiding, localHiding, typeHiding och maskedCatchBlock
indirectStatic indirekt hänvisning till statisk medlem
intfAnnotation anteckningstyp som används som supergränssnitt
intfNonInherited gränssnitt för kompatibilitet med icke ärvd metod
javadoc ogiltigt javadoc
localHiding lokal variabel som döljer en annan variabel
maskedCatchBlocks dolt catch-block
nls strängkonstant utan andra märkord än nls (märkord saknas //$NON-NLS-<n>)
noEffectAssign tilldelning utan effekt
null saknad eller redundant null-kontroll
over-ann saknad @Override-anteckning
paramAssign tilldelning till en parameter
pkgDefaultMethod försök att åsidosätta paketstandardmetod
raw användning av rå typ (i stället för en parametriserad typ)
semicolon onödigt semikolon eller tom sats
serial saknat serialVersionUID
specialParamHiding konstruktör eller sättparameter som döljer annat fält
static-access makro för indirectStatic och staticReceiver
staticReceiver om en icke statisk mottagare används till att hämta ett statiskt fält eller anropa en statisk metod
suppress aktivera @SuppressWarnings
syntheticAccess,
synthetic-access
vid utförande av syntetisk åtkomst för innerclass
tasks aktivera stöd för aktivitetsmärkord i källkod
typeHiding typ-parameter som döljer en annan typ
unchecked ej kontrollerad typoperation
unnecessaryElse onödig else-sats
unqualified-field-access,
unqualifiedField
okvalificerad hänvisning till fält
unused makro för unusedArgument, unusedImport, unusedLabel, unusedLocal, unusedPrivate och unusedThrown
unusedArgument oanvänt metodargument
unusedImport oanvänd importhänvisning
unusedLabel oanvänd etikett
unusedLocal oanvänd lokal variabel
unusedPrivate oanvänd privat medlemsdeklaration
unusedThrown oanvänd deklarerat utgivet undantag
uselessTypeCheck onödig omvandling/förekomst av operation
varargsCast varargs-argument behöver explicit omvandling
warningToken ej hanterat varningstoken i @SuppressWarnings

-nowarn Ingen varning (motsvarande -warn:none)
-deprecation Motsvarande -warn:deprecation.
Felsökningsalternativ
-g[:none|:lines,vars,source] Ange nivån för felsökningsattribut
-g All felsökningsinformation (motsvarande -g:lines,vars,source)
-g:none Ingen felsökningsinformation
-g:[lines,vars,source] Selektiv felsökningsinformation
-preserveAllLocals Explicit begäran till kompilatorn att behålla alla lokala variabler (i felsökningssyfte). Om värdet utelämnas tar kompilatorn bort oanvända lokaler.
Åsidosatta alternativ (för kompatibilitet med javac-alternativ)
-J<alternativ> överför alternativ till den virtuella datorn
-X<alternativ> anger ett alternativ som inte är standard. -Xemacs åsidosätts inte.
-X skriver alternativ som inte är standard och avslutar
-O optimerar för körningstid
Avancerade alternativ
@<file> Läs kommandoradsargument från fil
-maxProblems <n> Max. antal problem per kompileringsenhet (100 som standard)
-log <filnamn> Ange en loggfil där all utdata från kompilatorn dumpas. Detta är verkligen användbart om du vill felsöka batchkompilatorn eller få en fil som innehåller alla fel och varningar från ett batchbygge. Om tillägget är .xml, blir den genererade loggen en xml-fil.
-Xemacs Använd emacs-stil för att presentera fel och varningsplatser i konsolen och vanliga textloggar. XML-loggar påverkas inte av alternativet. När alternativet är aktivt visas meddelandet:
2. WARNING in /workspace/X.java
(at line 8)...

som:
/workspace/X.java:8: warning: The method...
-proceedOnError Fortsätt kompilera trots fel, dumpa klassfiler med problemmetoder eller problemtyper. Detta rekommenderas bara om du vill kunna köra tillämpningen även om det finns återstående fel.
-verbose Skriv ut använda/bearbetade kompileringsenheter i konsolen eller loggfilen om den angetts.
-referenceInfo Beräkna referensinformation. Detta är bara användbart om du är ansluten till byggaren. Hänvisningsinformationen är i annat fall oanvändbar.
-progress Visa förlopp (endast i -log-läge).
-time Visa hastighetsinformation
-noExit Anropa inte System.exit(n) i slutet av kompileringen (n=0 om inget fel).
-repeat <n> Upprepa kompileringsprocessen <n> gånger (prestandaanalys).
-inlineJSR Inbäddad JSR-bytekod (implicit om target >= 1.5).
-enableJavadoc Behandla hänvisningar inuti javadoc.
Hjälpande alternativ
-? -help Visa hjälpmeddelandet.
-v -version Visa kompilatorns byggnummer. Detta är väldigt användbart för rapportering av ett programfel.
-showversion Visa kompilatorns byggnummer och fortsätt. Detta är väldigt användbart för rapportering av ett programfel.

Exempel

d:\temp -classpath rt.jar -time -g -d d:/tmp Den kompilerar alla källfiler i d:\temp och dess undermappar. Classpath är rt.jar. Den genererar alla felsökningsattribut och alla genererade klassfiler dumpas i d:\tmp. Kompilatorns hastighet visas när batchprocessen har slutförts.
d:\temp\Test.java -classpath d:\temp;rt.jar -g:none Den kompilerar bara Test.java och dess beroende filer, om sådana finns, och hämtar beroende filer från d:\temp. Classpath är d:\temp följt av rt.jar, vilket betyder att alla nödvändiga klasser söks efter först i d:\temp och sedan i rt.jar. Den genererar inga felsökningsattribut och alla genererade klassfiler dumpas i d:\temp.

Använda ant javac-adaptern

Eclipse-kompilatorn kan användas i ett Ant-skript med hjälp av javac-adaptern. Om du vill använda Eclipse-kompilatorn behöver du bara definiera egenskapen build.compiler i ditt skript. Här är ett litet exempel.
<?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 syntax som används för javac Ant-åtgärden finns i Ant javac task-dokumentationen. Den aktuella adaptern stöder Javac Ant-åtgärderna version 1.4.1 upp till 1.6.5.

Om du använder en version över 1.5.0 kan du använda det nästlade kompilatorargumentet element till att ange kompilatorspecifika alternativ.

...
<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>		
...

För att förhindra att du får kompilatorberoende skript råder vi dig att använda kompilatorargumentet angivet till org.eclipse.jdt.core.JDTCompilerAdapter. Om du inte anger detta, kan skriptet bara användas med Eclipse-kompilatorn. Om du anger detta, ignoreras det kapslade kompilatorargumentet om namnet skiljer sig från det kompilatornamn som anges av egenskapen build.compiler.

Felsökning

JDT Core definierar en specialiserad markör (markörtyp "org.eclipse.jdt.core.problem") som anger kompileringsproblem. Om du programmatiskt vill upptäcka problem orsakade av kompilatorn, ska standardplattformens markörprotokoll användas. Se Resursmarkeringar för en översikt av markeringsanvändning.

Följande stycke letar upp alla Java-problemmarkörer i en kompileringsenhet.

   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-problemmarkörer underhålls av Java-projektbyggaren och tas automatiskt bort när problemen löses och Java-källkoden kompileras om.

Problemets ID-värde anges av en av konstanterna som definierats i IProblem . Problemets ID är tillförlitligt, men meddelandet är lokaliserat och kan därför ändras utifrån standardspråkversionen. De konstanter som definieras i IProblem är självbeskrivande.

En implementation av IProblemRequestor bör definieras för att samla in de problem som upptäcks under en Java-operation. Arbetskopior kan stämmas av med problemavkänning om en IProblemRequestor har tillhandahållits vid skapandet av arbetskopian. För att uppnå detta kan du använda metoden reconcile. Exempel:

  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);
Du kan lägga till en åtgärd för de rapporterade problemen i metoden acceptProblem(IProblem). I det här exemplet blir det rapporterade problemet att Zork inte kan tolkas eller att det inte är en giltig superklass och dess ID är IProblem.SuperclassNotFound.

Utesluter varningar som använder SuppressWarnings

Java 5.0-användare kan inaktivera kompileringsvarningar i relation till en delmängd av en kompileringsenhet som använder anteckningen java.lang.SuppressWarning.

	@SuppressWarning("unused") public void foo() {
		String s;
	}

Utan anteckningen skulle kompilatorn klaga på att den lokala variabeln s aldrig används. Med anteckningen åsidosätter kompilatorn tyst varningen lokalt till metoden foo. Det gör det möjligt att bevara varningarna på andra platser för samma kompileringsenhet eller samma projekt.

De token som kan användas inuti en SuppressWarning-anteckning är följande: