Java kód fordítása

A JDT bedolgozók egy növekményes és egy kötegelt Java fordítót is tartalmaznak Java .class fájlok forráskódból összeépítéséhez. A fordító nem biztosít közvetlen API felületet. Java projektek összeépítőjeként kerül telepítésre. A fordítást a szabványos platform összeépítési mechanizmusai aktiválják.

A platform összeépítő mechanizmusának részletes leírása a Növekményes projekt összeépítők fejezetben található.

Kód fordítása

Az összeépítési API használatával egy projekt Java forrásfájlai programozási eljárással lefordíthatók.

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

Java projekt esetében ez meghívja a Java növekményes projekt összeépítőt (minden más növekményes összeépítővel együtt, amely a projekt összeépítési meghatározásában található). Az eredményként előállított .class fájlokat a kijelölt kimeneti mappába helyezi. További erőforrásfájlokat is másol a kimeneti mappába. 

Teljes kötegelt összeépítés esetében a rendszer átfésüli a kimeneti mappa minden .class fájlját, hogy kiszűrje az elévült fájlokat. Ez a JDT törzs összeépítési beállítás (CORE_JAVA_BUILD_CLEAN_OUTPUT_FOLDER) használatával vezérelhető.  A beállítás alapértelmezésben kitakarítja a kimeneti mappákat.  Hacsak nincs ez a beállítás alaphelyzetbe állítva, meg kell győződnie, hogy minden .class fájlt, amelyhez nincs megfelelő forrásfájl, a kimeneti mappa helyett egy az osztályútvonalon található különálló osztályfájl mappába helyez.

A növekményes és kötegelt összeépítők más paraméterekkel is beállíthatók, amelyek vezérlik, hogy a rendszer mely erőforrásokat másol át a kimeneti mappába.  A következő példa bemutatja, hogy hogyan kell egy erőforrás szűrőt beállítani úgy, hogy az '.ignore' végződésű fájlok és 'META-INF' nevű könyvtárak ne legyenek átmásolva a kimeneti mappába:

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

Ha fájlnevek egyeznek valamelyik megadott mintával, akkor szűrésre kerülnek. Teljes mappák kerülnek szűrésre, ha nevük megegyezik valamelyik megadott, útvonal elválasztóval végződő mappa névvel.

A növekményes és kötegelt összeépítőket úgy is be lehet állítani, hogy a .classpath fájl hibája esetén csak egy hibát állítson elő. Ez a lehetőség alapértelmezésben be van állítva és így számos hibát kiküszöböl.  Tekintse meg a JDT törzs összeépítési beállítások listáját, ahol megtalálhatja az összeépítőhöz kapcsolódó beállítások teljes listáját és a beállítások alapértékeit.

A fordítót a JavaCore beállítások használatával is be lehet állítani.  Például beállítható az a súlyosság, amit a fordítás során talált különböző típusú problémákhoz kell rendelni.  Tekintse meg a JDT törzs fordítási beállítások listáját, ahol megtalálhatja az fordítóhoz kapcsolódó beállítások teljes listáját és a beállítások alapértékeit.

Ha programozási eljárással állít be összeépítő vagy fordító beállításokat, akkor meg kell határoznia a beállítás hatókörét.  Például egy erőforrás szűrő beállítása lehet, hogy csak egy bizonyos projektre vonatkozik.  A következő példa a korábban már látott erőforrás szűrőt állítja be, de a beállítás ezúttal csak az egyedi projektre érvényes.

   
   Hashtable options = myProject.getOptions(false);  // csak az ebben a
projektben beállított lehetőségeket adja meg
   options.put(JavaCore.CORE_JAVA_BUILD_RESOURCE_COPY_FILTER, "*.ignore,META-INF/");
   myProject.setOptions(options);

Kötegelt fordító használata

Kötegelt fordító keresése

A kötegelt fordító osztály aJDT/Core bedolgozó belső osztályaiban található. Tehát a plugins/org.eclipse.jdt.core mappában van, a jdtcore.jar fájlban. Az osztály neve org.eclipse.jdt.internal.compiler.batch.Main.

Kötegelt fordító futtatása

Mely beállítások állnak rendelkezésre?

Narancssárga háttérrel ezek a javasolt beállítások.

Név Felhasználás
Osztályútvonal beállítások
-bootclasspath <dir 1>;<dir 2>;...;<dir P> Ez a lista azokról a könyvtárakról vagy jar fájlokról, amikkel a fordító betölti az osztályfájlokat. Alapértelmezésben a futó virtuális gép függvénytárai vannak használatban. A bejegyzéseket bejegyzés útvonal elválasztók választják el.
-cp
-classpath <dir 1>;<dir 2>;...;<dir P>
Ez a forrásfájlok fordításához használt könyvtárak vagy jar fájlok listája. Az alapértelmezett érték a "java.class.path" tulajdonság értéke. A bejegyzéseket bejegyzés útvonal elválasztók választják el.
-extdirs <dir 1>;<dir 2>;...;<dir P> Ez a zip/jar kiterjesztésű fájlok helyének meghatározáshoz használt könyvtárak listája. A bejegyzéseket bejegyzés útvonal elválasztók választják el.
-sourcepath <dir 1>;<dir 2>;...;<dir P> Ez a forrásfájlok meghatározáshoz használt könyvtárak listája. A bejegyzéseket bejegyzés útvonal elválasztók választják el.
-d <dir 1>|none Ez az előállított .class fájlok kiíratására szolgáló könyvtárat határozza meg. Ha nincs megadva, akkor nem jönnek létre a csomag könyvtár szerkezetek.
Ha nem kíván .class fájlokat előállítani, akkor használja a -d none beállítást.
-encoding <kódolás neve> Adja meg az alapértelmezett forráskódolási formátumot (fájlonként is meg lehet adni egyéni kódolást: toldja meg minden egyes beviteli forrásfáj vagy -mappa nevét [encoding <kódolás neve>] taggal).
Megfelelési beállítások
-target 1.1|1.2|1.3|1.4|1.5|5|5.0 Ez a .class fájl célját beállítását adja meg. A lehetséges értékek:
  • 1.1 (fő változat: 45 alváltozat: 3)
  • 1.2 (főváltozat: 46 alváltozat: 0)
  • 1.3 (főváltozat: 47 alváltozat: 0)
  • 1.4 (főváltozat: 48 alváltozat: 0)
  • 1.5, 5 vagy 5.0 (főváltozat: 49 alváltozat: 0)
Az alapértelmezett értékek:
  • 1.1, -1.3 módban
  • 1.2, -1.4 módban
  • 1.5, -1.5 módban
-1.3 A megfelelési szintet 1.3 értékre állítja. Vonatkozó paraméterek: -source 1.3 -target 1.1.
-1.4 A megfelelési szintet 1.4 értékre állítja (ez az alapértelmezett). Vonatkozó paraméterek: -source 1.3 -target 1.2.
-1.5 A megfelelési szintet 1.5 értékre állítja. Vonatkozó paraméterek: -source 1.5 -target 1.5.
-source 1.3|1.4|1.5|5|5.0 Ez a fordító forrásszintjét engedélyezi.
A lehetséges értékek:
  • 1.3
  • 1.4
  • 1.5, 5 vagy 5.0
Az alapértelmezett értékek:
  • 1.3, -1.3 módban
  • 1.4, -1.4 módban
  • 1.5, -1.5 módban
1.4 esetén az assert kulcsszónak számít. 1.5 esetén az enum és az assert kulcsszónak számít.
Figyelmeztetési beállítások
-warn:
allDeprecation
allJavadoc
assertIdentifier
boxing
charConcat
conditionAssign
constructorName
dep-ann
deprecation
emptyBlock
enumSwitch
fieldHiding
finalBound
finally
hiding
incomplete-switch
indirectStatic
intfAnnotation
intfNonInherited
javadoc
localHiding
maskedCatchBlocks
nls
noEffectAssign
null
over-ann
pkgDefaultMethod
semicolon
serial
specialParamHiding
static-access
staticReceiver
suppress
synthetic-access
syntheticAccess
tasks(<feladat1>|...|<feladatN>)
typeHiding
unchecked
unnecessaryElse
unqualified-field-access
unqualifiedField
uselessTypeCheck
unused
unusedArgument
unusedImport
unusedLocal
unusedPrivate
unusedThrown
varargsCast
warningToken
Figyelmeztetési szint beállítása.
pl. -warn:unusedLocals,deprecation

Vörös színnel vannak az alapértelmezett beállítások.

    -warn:<figyelmeztetések vesszővel elválasztva>    pontosan a felsorolt figyelmeztetések engedélyezése
    -warn:+<figyelmeztetések vesszővel elválasztva>   további figyelmeztetések engedélyezése
    -warn:-<figyelmeztetések vesszővel elválasztva>   adott figyelmeztetések tiltása
allDeprecation elévültés még elévült kódban is
allJavadoc érvénytelen vagy hiányzó Javadoc
assertIdentifier assert előfordulás azonosítóként használata
boxing automatikus typusátalakítás
charConcat char tömb karaktersorozat összefűzésben használata, anélkül, hogy a tömb kifejezetten át lenne alakítva karaktersorozattá
conditionAssign valószínűleg véletlen logikai hozzárendelés
constructorName metódus konstruktornévvel
dep-ann hiányzó @Deprecated feljegyzés
deprecation elévült típus vagy tag elévült kódon kívüli használata
emptyBlock nem dokumentált üres blokk
enumSwitch,
incomplete-switch
befejezetlen enum switch
fieldHiding egy mező elrejt egy másik változót
finalBound típusparaméter végleges határral
finally befejező blokk nem normálisan fejeződik be
hiding makró fieldHiding, localHiding, typeHiding és maskedCatchBlock metódusokhoz
indirectStatic közvetett hivatkozás statikus tagra
intfAnnotation feljegyzéstípus felső szintű felületként van használva
intfNonInherited felület nem örökölt metódus kompatibilitása
javadoc érvénytelen Javadoc
localHiding helyi változó elrejt egy másik változót
maskedCatchBlocks rejtett elfogási blokk
nls nem nls karaktersorozat literálok (hiányzó címkék: //$NON-NLS-<n>)
noEffectAssign hatástalan for hozzárendelés
null hiányzó vagy redundáns null ellenőrzés
over-ann hiányzó @Override feljegyzés
pkgDefaultMethod kísérlet csomag alapértelmezett metódus újradefiniálására
serial hiányzó serialVersionUID
semicolon szükségtelen pontosvessző vagy üres utasítás
specialParamHiding konstruktor vagy beállító paraméter elrejt egy másik mezőt
static-access makró indirectStatic és staticReceiver metódusokhoz
staticReceiver ha nem statikus fogadó próbál statikus mezőt megszerezni vagy statikus metódust meghívni
suppress @SuppressWarnings engedélyezése
syntheticAccess,
synthetic-access
mesterséges hozzáférés végrehajtása innerclass osztályhoz
tasks feladatcímkék támogatásának engedélyezése a forráskódban
typeHiding típusparaméter elrejt egy másik típust
unchecked nem ellenőrzött típusművelet
unnecessaryElse szükségtelen else záradék
unqualified-field-access,
unqualifiedField
minősítetlen mezőhivatkozás
unused makró unusedArgument, unusedImport, unusedLocal, unusedPrivate and unusedThrown metódusokhoz
unusedArgument nem használt metódusparaméter
unusedImport nem használt importálási hivatkozás
unusedLocal nem használt helyi változó
unusedPrivate nem használt priváttag deklaráció
unusedThrown nem használt deklarált kivételdobás
uselessTypeCheck szükségtelen cast/instanceof művelet
varargsCast varargs paraméterhez egyértelmű típusmódosítás kell
warningToken nem kezelt figyelmeztető jelsor a @SuppressWarningsb értékben

-nowarn Nincs figyelmeztetés (egyenértékű a -warn:none beállítással)
-deprecation Egyenértékű a -warn:deprecation beállítással.
Hibakeresési beállítások
-g[:none|:lines,vars,source] A hibakeresési jellemzők szintjének beállítása
-g Minden hibakeresési információ (egyenértékű a -g:lines,vars,source beállítással)
-g:none Semmilyen hibakeresési információ
-g:[lines,vars,source] Szelektív hibakeresési információk
-preserveAllLocals Kifejezetten kéri a fordítóprogramot, hogy őrizzen meg minden helyi változót (hibakeresés céljából). Kihagyása esetén a fordító eltávolítja a használaton kívüli helyi változókat.
További beállítások
@<fájl> Parancssori paramétereket olvas be fájlból
-maxProblems <n> Problémák maximális száma fordítási egységenként (alapértelmezésben 100)
-log <fájlnév> Adjon meg egy naplófájlt, amibe kiíratva lesz a fordító minden kimenete. Ez főleg akkor hasznos, ha a kötegfordítóban keres hibát, vagy ha olyan fájlja van, aminek minden hibáját vagy figyelmeztetését kötegelt összeépítésből tartalmazza. Ha a kiterjesztés .xml, akkor az előállított napló xml fájl lesz.
-proceedOnError Hiba esetén is folytatja a fordítást, az osztályfájlok kiíratását problémametódusokkal vagy problématípusokkal végezve. E akkor ajánlott, ha a fennmaradó hibák mellett is futtatni kívánja az alkalmazást.
-verbose A konzolra vagy a naplófájlba nyomtatja a hozzáfért/elvégzett fordítási egységeket.
-referenceInfo Hivatkozási információkat számít ki. Csak akkor hasznos, ha az összeépítőhöz csatlakozik. Egyébként a hivatkozási információknak semmi haszna.
-progress Jelzi az előrehaladást (csak -log módban)
-time Sebességinformációkat jelez ki
-noExit A fordítás végén nem hívja meg a System.exit(n) metódust (n=0, ha nincs hiba)
-repeat <n> <n> alkalommal megismétli a fordítási folyamatot (teljesítményelemzés).
-inlineJSR Beemelt JSR bytekód (implicit, ha a cél >= 1.5)
-enableJavadoc Megfontolja a Javadoc dokumentáción belüli hivatkozásokat
Sugó beállítások
-? -help Megjeleníti a súgóüzenetet
-v -version Megjeleníti a fordítóprogram összeépítési számát. Hiba bejelentésénél ez nagyon hasznos.
-showversion Megjeleníti a fordítóprogram összeépítési számát, majd továbblép. Hiba bejelentésénél ez nagyon hasznos.

Példák

d:\temp -classpath rt.jar -time -g -d d:/tmp Lefordít minden forrásfájlt a d:\temp könyvtárban, valamint annak alkönyvtáraiban. Az osztályútvonal egyszerűen rt.jar. Előállít minden hibakeresési attribútumot, és minden előállított .class fájl a d:\tmp könyvtárba lesz kiíratva. A fordító sebessége a kötegelt feldolgozás befejezte után jelenik meg.
d:\temp\Test.java -classpath d:\temp;rt.jar -g:none Csak a Test.java fájlt fordítja le; az alárendelt fájlokat a d:\temp könyvtárból szerzi meg. Az osztályútvonal rt.jar és d:\temp, tehát a szükséges osztályokat először a d:\temp könyvtárban, majd a rt.jar útvonalon keresi. Semmilyen hibakeresési attribútumot nem állít elő, és minden előállított .class fájl a d:\tmp könyvtárba lesz kiíratva.

Ant javac illesztő használata

A javac illesztő segítségével az Eclipse fordító használható Ant parancsfájlban is. Az Eclipse fordító használatához egyszerűen a build.compiler tulajdonságot kell megadni a parancsfájlban. Az alábbiakban egy kisebb példa látható.
<?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>
A javac Ant feladat szintaxisa az Ant javac feladat dokumentáció leírásban található meg. Az aktuális illesztő a Javac Ant feladat 1.4.1-1.6.5-ig terjedő változatait támogatja.

Ha 1.5.0 utáni változatot használ, akkor fordítóspecifikus beállítások megadásához használhatja a beágyazott fordítóparaméter elemets.

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

A fordítófüggő parancsfájlok elkerülése érdekében tanácsos a fordítóparamétert org.eclipse.jdt.core.JDTCompilerAdapter értékre állítani. Ha ez nincs beállítva, akkor a parancsfájlt csak az Eclipse fordítóprogramjával lehet használni. Ellenkező esetben, ha a név különbözik a build.compiler tulajdonságban megadottól, akkor a beágyazott fordító paraméter figyelmen kívül marad.

Hibafelderítés

A JDT törzs meghatároz egy különleges jelzőt ( "org.eclipse.jdt.core.problem" jelző típus) fordítási problémák megjelölésére. A fordító által észlelt problémák programozási eljárással feltérképezéséhez a szabványos platform jelző protokollt kell használni. A jelző használatának áttekintéséhez tekintse meg az Erőforrás jelzők leírást.

A következő kódrészlet a fordítási egységben megtalál minden Java problémajelzőt.

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

A Java problémajelzőket a Java projektösszeépítő tartja fenn és automatikusan el is távolítja, ha egy probléma megoldódik és a Java forrás újra lett fordítva.

A probléma azonosító értékét az IProblem egyik konstansa állítja be. A probléma azonosítója megbízható, de mivel az üzenet honosított, ezért az alapértelmezett területi beállítástól függően megváltoztatható. Az IProblem felületen meghatározott konstansok önleíróak.

Az IProblemRequestor felület egy megvalósítását kell meghatározni a Java műveletek során feltérképezett probléma összegyűjtéséhez. Munkamásolatokat össze lehet egyeztetni a problémaészleléssel, ha a munkamásolat létrehozás az IProblemRequestor felülettel is el lett látva. Ennek eléréséhez a reconcile metódust használható. Például:

  ICompilationUnit unit = ..; // fordítási egység megadása
			
  // kérdező létrehozása a feltérképezett problémák összegyűjtéséhez
  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; } // akkor észlel problémákat, ha aktív
  };
    
  // használja a munkamásolatot, hogy megtartsa a hibás forrást
  ICompilationUnit workingCopy = unit.getWorkingCopy(new WorkingCopyOwner() {}, problemRequestor, null);
  ((IOpenable)workingCopy).getBuffer().setContents("public class X extends Zork {}");

  // összeegyeztetés aktiválása
  workingCopy.reconcile(NO_AST, true, null, null);
Az acceptProblem(IProblem) metódusban a jelentett problémákhoz intézkedést vehet fel. A fenti példában a jelentett probléma a Zork nem oldható fel vagy érvénytelen szülőosztály lesz és az azonosítója IProblem.SuperclassNotFound.