Saturday, April 1, 2006

Java tutorial - Uitvoeren

Intro|Basics|Elementen|Bouwstenen|Datatypen|Operatoren|Toegangscontrole|Draaiboek|Foutenafhandeling|Objecten|Uitvoeren

Laat de Java code werken

Omgevingsvariabelen

We gaan hier even ervan uit dat je reeds minimaal een JDK op je Windows-computer geinstalleerd hebt zitten, zie ook Hello World in Eclipse. Zodra je deze hebt geïnstalleerd, dan moet je even een opdrachtprompt venster (oftewel, een commando console) opentrekken via Start, Programma's, Bureauaccessories, Opdrachtprompt of gewoon via Start, Uitvoeren, "cmd" invoeren, OK. In deze opdrachtprompt venster moet je even de commando java -version invoeren:

C:\>java -version
java version "1.5.0_10"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_10-b03)
Java HotSpot(TM) Client VM (build 1.5.0_10-b03, mixed mode, sharing)

C:\>_

Als je de bovenstaande resultaat krijgt (let op: de versienummer kan verschillen), dan is alles in orde. Maar je kan ook de pech hebben om een foutmelding te krijgen dat de commando niet wordt herkend:

C:\>java -version
java wordt niet herkend als een interne
of externe opdracht, programma of batchbestand.

C:\>_

Dan moet je even de omgevingsvariabelen JAVA_HOME en PATH goed zetten, dit wordt namelijk helaas (nog?) niet automatisch gedaan door de installatieprogramma van de JDK. Ga eerst na waar je de JDK precies hebt geïnstalleerd, standaard is dat in de richting van C:\jdk1.5.0_10. Zodra je dat eenmaal weet, open dan de Systeemeigenschappen van Windows met de sneltoets [Winkey + Pause], ga naar de Geavanceerd tab en klik op Omgevingsvariabelen. Bij de Gebruikersvariabelen moet je de volgende twee variabelen toevoegen:

Naam: JAVA_HOME
Waarde: C:\jdk1.5.0_10

Naam: PATH
Waarde: %JAVA_HOME%\bin;

Omgevingsvariabelen

Let wel op dat je de juiste directory opgeeft in de eerste variabele! Bij alle nieuwe opdrachtprompt vensters worden de nieuwe omgevingsvariabelen automatisch doorgevoerd. Sluit dus alle eventueel geopende vensters af en open een nieuwe. Nu moet de commando java -version wel goed werken.

Terug naar boven

Hello World in console

Even de Introductie van deze tutorial herhalend, in een fatsoenlijke IDE wordt de Java code (.java) al automatisch voor jou tot bytecode (.class) gecompileerd voordat het binnen de IDE wordt uitgevoerd. Wanneer je de Java code om een of andere reden per-se via een ordinaire teksteditor wil schrijven, dan kun je de volgende commando gebruiken om de Java code buiten een IDE om te compileren:

javac KlasseNaam.java

Hiermee wordt de Java code van KlasseNaam.java dus tot bytecode gecompileerd. Geef hierbij altijd de extensie van het bestand mee! Je mag Java bestanden namelijk een willekeurige extensie meegeven, het is niet altijd per-se ".java" en daar zal de compiler dus ook niet naar zoeken. Het resultaat van deze compilatie is het bestand KlasseNaam.class dat in dezelfde directory zal verschijnen. Je kunt tenslotte de KlasseNaam.class als volgt uitvoeren:

java KlasseNaam

Let op: hier geef je juist weer géén extensie van het bestand mee! De runtime gaat altijd uit van de extensie ".class" en deze zal dus altijd automatisch erachter geplakt worden.

Herschrijf de Hello World code uit de introductie als volgt en sla het op als C:\Documenten\Java\HelloWorld.java. De bestandsnaam moet exact overeenkomen met de naam van de klasse.

import java.util.Scanner;

// De HelloWorld klasse. Let op: deze klasse heeft inderdaad geen package!
public class HelloWorld {

    // De main() methode.
    public static void main(String[] args) {

        // Stel een scanner in op de systeem console.
        Scanner scanner = new Scanner(System.in);

        // Vraag om de naam.
        System.out.println("Voer jouw naam in:");

        // Wacht op de invoer en vang de regel op.
        String naam = scanner.nextLine();

        // Begroet de gebruiker in de systeem console.
        System.out.println("Hallo " + naam + "!");
    }

}

Compileer en voer deze als volgt uit:

C:\>cd documenten\java

C:\Documenten\Java>javac HelloWorld.java

C:\Documenten\Java>java HelloWorld
Voer jouw naam in:
BalusC
Hallo BalusC!

C:\Documenten\Java>_

Let op: de commando's zijn hoofdlettergevoelig, voer de bestandsnaam ook exact in zoals je het hebt opgeslagen.

Terug naar boven

Argumenten

Je kunt ook argumenten aan de main methode meegeven, getuige de String[] args parameter. Dit levert dus een ordinaire String array op en je kunt deze op z'n eenvoudigst als volgt verwerken:

// De ToonArgumenten klasse. Let op: deze klasse heeft inderdaad geen package!
public class ToonArgumenten {

    // De main() methode.
    public static void main(String[] args) {

        // Zijn er argumenten opgegeven?
        if (args.length > 0) {
            // Zo ja, laat ze allemaal zien.
            for (int i = 0; i < args.length; i++) {
                System.out.println("Argument #" + (i + 1) + ": " + args[i]);
            }
        } else {
            // Zo nee, laat zien dat dit niet de bedoeling is.
            System.out.println("Je hebt helemaal geen argumenten opgegeven!");
        }
    }

}

Sla deze op als C:\Documenten\Java\ToonArgumenten.java en compileer en voer deze als volgt uit:

C:\>cd documenten\java

C:\Documenten\Java>javac ToonArgumenten.java

C:\Documenten\Java>java ToonArgumenten
Je hebt helemaal geen argumenten opgegeven!

C:\Documenten\Java>java ToonArgumenten Nu heb ik wel argumenten opgegeven!
Argument #1: Nu
Argument #2: heb
Argument #3: ik
Argument #4: wel
Argument #5: argumenten
Argument #6: opgegeven!

C:\Documenten\Java>_

Let op: de commando's zijn hoofdlettergevoelig, voer de bestandsnaam ook exact in zoals je het hebt opgeslagen.

Terug naar boven

Classpath

De java runtime commando zoekt automatisch naar bestanden met de opgegeven klassenaam in de huidige directory (pad) en in alle andere paden die in de omgevingsvariabele classpath staan gedefinieerd. Bij de javac compiler commando moet je overigens ten allen tijde in dezelfde directory zitten of de volledige pad samen met de bestandsnaam meegeven met de commando.

De omgevingsvariabele classpath kun je op dezelfde manier toevoegen als de JAVA_HOME en PATH. Open de Systeemeigenschappen van Windows met de sneltoets [Winkey + Pause], ga naar de Geavanceerd tab en klik op Omgevingsvariabelen. Bij de Gebruikersvariabelen moet je de volgende variabele toevoegen:

Naam: CLASSPATH
Waarde: C:\Documenten\Java;

De gegeven pad is slechts een voorbeeld. Je kunt meerdere paden toevoegen, maar dan moet je ze wel scheiden met de puntkomma ;. Bij alle nieuwe opdrachtprompt vensters worden de nieuwe omgevingsvariabelen automatisch doorgevoerd. Sluit dus alle eventueel geopende vensters af en open een nieuwe. Voer nu de volgende commando's ter leering en vermaeck uit:

C:\>javac HelloWorld.java
error: cannot read: HelloWorld.java
1 error

C:\>javac c:\documenten\java\HelloWorld.java

C:\>java HelloWorld
Voer jouw naam in:
BalusC
Hallo BalusC!

C:\>_

Dit lijkt helemaal heel eenvoudig. En toch lijken alle beginners problemen met de classpath te hebben. Dit komt voornamelijk omdat de classpath afhankelijk is van de Java Virtual Machine dat je uitvoert. De omgevingsvariabele classpath wordt in feite alléén gebruikt door de JVM dat met de java.exe commando wordt uitgevoerd. Voor andere Java omgevingen, zoals een applicatieserver (Tomcat, Glassfish, etc), een IDE, een JAR, een WAR, een EAR, een applet, etcetera gelden heel andere regels.

De absolute paden van classpath van de gebruikte JVM kun je eenvoudig als volgt opvragen:

import java.io.IOException;
import java.net.URL;
import java.util.Enumeration;

public class Test {

    public static void main(String[] args) throws IOException {

        // Vraag alle classpath paden van de huidige classloader op.
        Enumeration<URL> resources =
            Thread.currentThread().getContextClassLoader().getResources("");

        // Laat ze allemaal zien.
        while (resources.hasMoreElements()) {
            System.out.println(resources.nextElement());
        }
    }

}

In plaats van de classpath omgevingsvariabele kun je bij de java runtime commando en de javac compiler commando ook het -cp of -classpath argument gebruiken. Het gebruik hiervan is exact dezelfde als bij de classpath omgevingsvariabele. Het verschil is dat je niet afhankelijk bent van hoe de lokale gebruiker de classpath omgevingsvariabele heeft ingesteld. Want als de -cp of -classpath argument is opgegeven, dan wordt er niet naar de classpath omgevingsvariabele gekeken.

Hieronder volgt een voorbeeld van het gebruik van het -cp argument in combinatie met de java runtime commando (we gaan hier trouwens ervan uit dat de classpath omgevingsvariabele niet bestaat of tenminste niet naar c:\documenten\java verwijst):

C:\>java HelloWorld
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld

C:\>java -cp c:\documenten\java HelloWorld
Voer jouw naam in:
BalusC
Hallo BalusC!

C:\>_

De NoClassDefFoundError wordt geworpen wanneer de gegeven klasse (in dit geval dus HelloWorld) aanwezig was in de classpath tijdens het compileren, maar niet tijdens het uitvoeren.

Let op: wanneer je spaties in een classpath pad hebt, dan moet je het pad omvatten met dubbele aanhalingstekens.

Terug naar boven

Uitvoerbare JAR bestanden

Wanneer je je Java code vanuit de Windows verkenner wil uitvoeren door erop te klikken, dan zul je niks hebben aan de .java en de .class bestanden. Je kunt erop dubbelklikken wat je wilt, maar ze zullen niet uitgevoerd worden. De gecomprimeerde JAR (Java ARchive) bestanden zijn daarentegen wél uitvoerbaar. Om zo'n uitvoerbare JAR bestand te kunnen maken moeten aan de volgende eisen worden voldaan:

1) Je moet tenminste één klasse met een main methode hebben.
2) Je moet de te uitvoeren main methode in een apart tekstbestand definieren.

Wanneer je een JAR via de Windows verkenner uitvoert met behulp van java.exe, dan wordt er automatisch een opdrachtprompt venster geopend, echter deze sluit ook automatisch wanneer het programma klaar is, waardoor je geen kans krijgt om de eventuele uitvoer te kunnen lezen. We zullen de HelloWorld.java dan ook even moeten aanpassen dat deze niet direct na de uitvoer stopt:

import java.util.Scanner;

public class HelloWorld {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Voer jouw naam in:");
        String naam = scanner.nextLine();
        System.out.println("Hallo " + naam + "!");

        // Laat de gebruiker op [enter] drukken om het programma te stoppen.
        System.out.println("Druk op [enter] om dit programma af te sluiten...");

        // Wacht op de volgende regel en stop dan direct.
        scanner.nextLine();
    }

}

Nu moeten we de zogenaamde manifest bestand opgeven, waarin je allerlei opties kunt instellen voor het uitvoerbare JAR bestand. Het belangrijkste is in dit geval de optie Main-Class. Hierin kun je aangeven van welke klasse de main methode aangeroepen moet worden wanneer je de JAR wilt uitvoeren. Je moet hierin altijd de volledige klasse naam opgeven en in ons voorbeeld is dat dus HelloWorld.

Zet dus de volgende inhoud in een nieuw tekstbestand aan en sla deze op als C:\Documenten\Java\manifest.mf.

Main-class: HelloWorld

Let op: eindig dit tekstbestand altijd met een lege regel! Bovenstaand voorbeeld bestaat dus uit 2 regels.

Nu kun je als volgt een JAR bouwen:

C:\>cd documenten\java

C:\Documenten\Java>javac HelloWorld.java

C:\Documenten\Java>jar -cfm HelloWorld.jar manifest.mf *.class

C:\Documenten\Java>_

Met de -cfm opties geef je dus respectievelijk aan dat er een JAR gebouwd moet worden (create), dat je zelf een bestandsnaam wilt opgeven (filename) en dat je zelf een manifest bestand wilt opgeven (manifest). De HelloWorld.jar wordt dus de nieuwe bestandsnaam van de JAR. Dit kun je helemaal naar eigen smaak kiezen, zolang het eindigt met de ".jar" extensie. De manifest.mf heb je zojuist zelf gemaakt. Tenslotte kun je meerdere bestanden opgeven die in de JAR moeten komen, elk gescheiden door een spatie. In dit voorbeeld is dat slechts *.class, wat betekent dat álle ".class" bestanden in de huidige directory worden opgepakt. Je kunt hier bijvoorbeeld ook gewoon HelloWorld.class opgeven.

Voordat we dit bestand gaan uitvoeren moet je eerst in verkenner controleren of de JAR bestanden wel zijn gekoppeld aan java.exe. Een standaard Java SDK installatie koppelt deze namelijk aan javaw.exe en daarmee wordt niet automatisch een opdrachtprompt venster geopend. Ga hiertoe in de verkenner via Extra, Mapopties naar de Bestandstypen tab. Zoek en selecteer de JAR extensie en klik op Geavanceerd. Klik hierin op de Actie "open" en klik op Bewerken. Bij "Toepassing die voor de actie wordt gestart" staat in het geval van een standaard Java SDK installatie het volgende:

"C:\jre1.5.0_10\bin\javaw.exe" -jar "%1" %*

Indien hier inderdaad javaw.exe wordt gebruikt, dan moet je deze aanpassen naar java.exe:

"C:\jre1.5.0_10\bin\java.exe" -jar "%1" %*

JAR bestandatype

Nu kun je de JAR opzoeken via de Windows verkenner en deze uitvoeren door erop te dubbelklikken. Je zult nu een opdrachtprompt venster krijgen:

Voer jouw naam in:
BalusC
Hallo BalusC!
Druk op [enter] om dit programma af te sluiten...
_

Terug naar boven

Packages gebruiken

Zoals eerder in de hoofdstuk Toegangscontrole uitgelegd vormen de packages een soort directorystructuur voor de Java code. Je moet de Java code in dezelfde pad opslaan zoals in de package declaratie staat gedefinieerd. Wanneer je packages wil gebruiken binnen jouw uitvoerbare Java code, dan moet je deze paden ook opgeven bij de javac, java en jar commando's.

Laten we de HelloWorld.java een nieuwe package naam geven:

package nl.balusc.test; // De package declaratie.

import java.util.Scanner;

public class HelloWorld {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Voer jouw naam in:");
        String naam = scanner.nextLine();
        System.out.println("Hallo " + naam + "!");
        System.out.println("Druk op [enter] om dit programma af te sluiten...");
        scanner.nextLine();
    }

}

Sla dit bestand op als C:\Documenten\Java\nl\balusc\test\HelloWorld.java. Nu kun je deze als volgt compileren en uitvoeren:

C:\>cd documenten\java

C:\Documenten\Java>javac nl/balusc/test/HelloWorld.java

C:\Documenten\Java>java nl.balusc.test.HelloWorld
Voer jouw naam in:
BalusC
Hallo BalusC!
Druk op [enter] om dit programma af te sluiten...


C:\Documenten\Java>_

Bij uitvoerbare JAR bestanden zul je de Main-Class optie in het manifest bestand even moeten aanpassen om de nieuwe locatie aan te geven.

Main-class: nl.balusc.test.HelloWorld

Je kunt dit bestand wel gewoon in de 'root' van de package laten staan. Sla deze dus opnieuw op als C:\Documenten\Java\manifest.mf. Nu kun je als volgt een nieuwe JAR bouwen:

C:\Documenten\Java>jar -cfm HelloWorld.jar manifest.mf nl/balusc/test/*.class

C:\Documenten\Java>_

Terug naar boven

Slotwoord

We zijn helaas aan het eind gekomen van deze tutorial. Er zijn nu wel zo'n beetje alle belangrijkste aspecten van Java behandeld. Nu is het aan jou de keuze wat je ermee gaat doen. Het gewoon als een eenvoudige naslagwerk gaan gebruiken. Of verder gaan met het vergaren van andere nuttige wetenswaardigheden via deze blog: Data conversies, Datum en tijd, Bestandsbewerkingen, Collecties en mappen, Generics en Databases. Of jezelf serieus meer in Java verdiepen en lekker verder ermee spelen. Of overenthousiast zijn en gelijk naar Java EE kijken, al dan niet gebruikmakend van diverse WTP tutorials. Of gewoon na vluchtig doorgebladerd te hebben direct op CTRL+F4 drukken (of op ALT+F4, bij bepaalde internetbrowsers).

public class Bye {

    public static void main(String[] args) {
         System.out.println("Bye.");
    }

}

Bye.

Copyright - Niets van deze pagina mag worden overgenomen zonder uitdrukkelijke toestemming.

(C) April 2006, BalusC

7 comments:

Michiel said...

dank voor deze tutorial. Toch wel een leuk en goed overzicht cq naslagwerk.
Michiel

Janne said...

Het lukt niet echt. Ik krijg telkens die batch error. Kunt u me alstublieft helpen? Voorheen nooit deze error gehad.

Met vriendelijke groet,

Janne

(als u het me wilt mailen, mail dan naar jannebillekens@hotmail.com)

BalusC said...

Heb je na het wijzigen van de omgevingsvariabelen zeker weten *alle* command prompt vensters gesloten en daarna een nieuwe gestart? Als dat niet helpt, dan is het pad waarschijnlijk gewoon incorrect.

_Toreander_ said...

Na 5 jaar (2007?) nog steeds ongelooflijk nuttig. Thnx voor deze super tutorial!

Mathias said...

Net jouw tutorial gevonden, heel erg bedankt, duidelijk uitgelegd, en to the point!

mijn blog on4aub said...

deze tutorial moest ik al 6 jaar eerder gevonden hebben,de enige in het nederlands, nu begrijp ik er al iets meer van.
dank u wel om deze zo lang online te laten staan.

Francois

Anko Mulder said...

En weer bijna een jaar later, ook van mij complimenten.
Ik heb de pagina's offline bewaard zodat ik ze altijd ter beschikking heb als naslag en herinnering.