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

   
   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 a JDT Core bedolgozó belső osztályaiban található. Az osztály neve org.eclipse.jdt.internal.compiler.batch.Main. A plugins/org.eclipse.jdt.core_3.2.0.jar fájlba van csomagolva. A 3.2-es változat óta különálló letöltésként is elérhető. A fájl neve ecj.jar. A megfelelő forrás is rendelkezésre áll. Megszerzéséhez látogasson el a letöltés oldalra, és keresse meg a JDT törzsköteg fordító részt. Ez a JAR fájl tartalmazza a kötegelt fordítót és a javac Ant illesztőt.

Így önálló alkalmazásként és az Eclipse platformon kívüli Ant összeépítésben is használható.

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.
Minden könyvtár vagy fájl meghatározhat elérési szabályokat a típusoknak a '[' és ']' között.
-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.
Minden könyvtár vagy fájl meghatározhat elérési szabályokat a típusoknak a '[' és ']' között (például [-X] az X típus hozzáférésének tiltásához, [~X] az X típus elérésének nem ajánlásához, [+p/X:-p/*] a p csomagban levő minden típus elérésének tiltásához, de a p/X elérésének engedélyezéséhez).
-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.
-endorseddirs <dir 1>;<dir 2>;...;<dir P> Ez a jóváhagyott zip/jar fájlok helyének meghatározásához 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.
Minden könyvtár meghatározhat elérési szabályokat a típusoknak a '[' és ']' között.
-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 [<kódolás neve>] taggal; például X.java[utf8]).
Megfelelési beállítások
-target 1.1|1.2|1.3|1.4|1.5|5|5.0|1.6|6|6.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)
  • 1.6, 6 vagy 6.0 (főverziószám: 50 alverziószám: 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.6 -1.6 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.
-1.6 1.6 értékre állítja a megfelelési szintet. Vonatkozó paraméterek: -source 1.6 -target 1.6.
-source 1.3|1.4|1.5|5|5.0|1.6|6|6.0 Ez adja meg a fordító által várt forrásszintet.
A lehetséges értékek:
  • 1.3
  • 1.4
  • 1.5, 5 vagy 5.0
  • 1.6, 6 vagy 6.0
Az alapértelmezett értékek:
  • 1.3, -1.3 módban
  • 1.3 -1.4 módban
  • 1.5, -1.5 módban
  • 1.6 -1.6 módban
1.4 esetén az assert kulcsszónak számít. 1.5 és 1.6 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
ellenjavallt
emptyBlock
enumSwitch
fallthrough
fieldHiding
finalBound
finally
tiltott
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(<feladat1>|...|<feladatN>)
typeHiding
unchecked
unnecessaryElse
unqualified-field-access
unqualifiedField
unused
unusedArgument
unusedImport
unusedLabel
unusedLocal
unusedPrivate
unusedThrown
uselessTypeCheck
varargsCast
warningToken
Figyelmeztetési szint beállítása.
pl. -warn:unusedLocal,deprecation

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

    -warn:none                               minden figyelmeztetés tiltása
    -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 típusá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
ellenjavallt ellenjavallt hozzáférési szabálynak megfelelő típusok használata
emptyBlock nem dokumentált üres blokk
enumSwitch,
incomplete-switch
befejezetlen enum switch
fallthrough lehetséges átesés eset
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
tiltott tiltott hozzáférési szabálynak megfelelő típusok használata
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 hozzárendelés
null hiányzó vagy redundáns null ellenőrzés
over-ann hiányzó @Override feljegyzés
paramAssign hozzárendelés paraméterhez
pkgDefaultMethod kísérlet csomag alapértelmezett metódus újradefiniálására
raw nyers típus használata (paraméterezett típus helyett)
semicolon szükségtelen pontosvessző vagy üres utasítás
serial hiányzó serialVersionUID
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, unusedLabel, unusedLocal, unusedPrivate és unusedThrown metódusokhoz
unusedArgument nem használt metódusparaméter
unusedImport nem használt importálási hivatkozás
unusedLabel használaton kívüli címke
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 @SuppressWarnings é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.
figyelmen kívül hagyott beállítások (a javac beállításokkal való kompatibilitás végett)
-J<beállítás> a beállítás továbbadása a virtuális gépnek
-X<beállítás> nem szabványos beállítás megadása. A -Xemacs nem hagyja figyelmen kívül.
-X nem szabványos beállítások nyomtatása, majd kilépés.
-O optimalizálás végrehajtási időre
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.
-Xemacs Az emacs stílus használata a hibák és figyelmeztetések konzolbeli és szabályos szövegnaplóbeli helyének bemutatásához. Az XML naplókra ez a beállítás nincs hatással. Ezzel a beállítással a következő üzenet:
2. WARNING in /workspace/X.java
(at line 8)...

a következőképp jelenik meg:
/workspace/X.java:8: warning: The method...
-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. Ez 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 és az attól függő fájlokat 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:\temp 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éke az IProblem egyik konstansa. 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.

Figyelmeztetések kizárása a SuppressWarnings értékkel

A Java 5.0 megadja a lehetőséget a fordítási üzenetek letiltására a java.lang.SuppressWarning feljegyzés használatával, egy fordítási egység részhalmazára relatívan.

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

A feljegyzés nélkül a fordító jelezné, hogy az s helyi változó nincs használva. A feljegyzéssel a fordító csendben mellőzi ezt a figyelmeztetést a helyi foo metódusnál. Így engedélyezve maradnak a figyelmeztetések a fordítási egység vagy a projekt más helyein.

A SuppressWarning feljegyzésben használható jelsorok listája a következő: