1.6 Programme des Java JDK

 Java Standard Edition (SE) in seiner Distribution von Oracle kann in zwei Varianten benutzt werden:

Das JDK ist eine echte Obermenge des JRE und enhält die folgenden Komponenten die man zur Entwicklung und Ausführung von Java Programmen im Rahmen des Kurses benötigt:

Program Bedeutung Kommentar
java Startet Java Programme Laufzeitsystem. Interpretiert Javabytecode. Übersetzt häufig verwendeten Javabytecode in Maschinencode
javac Übersetzer Übersetzt Javaquellcode in Bytecode 
javadoc Generieren von Dokumentation Erzeugt Dokumentation durch Übersetzen von speziellen Kommentaren im Javaquellcode
jar   Java Archiver Bündelt Javabytecode und Dateien zu jar Dateien 
javah C Schnittstellengenerator  Erzeugt Schnittstellendeklarationen für C Programme die von Java aus benutzt werden sollen
javap Java Class File Disassembler  Extrahiert Schnittstelleninformation aus class Dateien und erzeugt öffentliche Schnittstellen
jdb Java Debugger Kommandozeilendebugger
jps Anzeige der Prozess Ids von Java Programmen Hilfswerkzeug für jconsole
jconsole Monitoren von Java Prozessen graphisches Werkzeug zum monitoren von Java Anwendungen
jinfo Auslesen der Konfiguration eines laufenden Javaprozess Konsolenausgabe der laufenden Prozessdaten

Dies ergibt die folgenden Zusammenhänge zwischen den verschiedenen Dateien die bei der Entwicklung beteiligt sind:

 

 

Referenzen

JDK 8.0 Dokumentation 

1.6.1 Das erste Javaprogramm (Benutzung der Kommandos java und javac)

Überblick

Das Übersetzen von Javaquellprogrammen in interpretierbare Bytecodedateien erfolgt mit dem Java-Übersetzer javac. Das Ausführen der übersetzten Dateien erfolgt mit dem Kommando java, dem Javalaufzeitsystem, welches Javaprogramme startet.

Javaübersetzer: javac

Der Javaübersetzer übersetzt lesbare Quelldateien mit der Dateiextension *.java in eine oder mehrere Bytecodedateien mit der Dateiextension *.class.

Beispiel

$ javac HelloWorld.java

Dieser Befehl erzeugt eine Datei mit dem Namen HelloWorld.class im gleichen Verzeichnis

Tipp: DerJavaübersetzer erwartet den vollen Dateinamen inklusive der Dateiextension .java

Javalaufzeitsystem: java

Das Kommando java erlaubt das Starten von Java-Programmen.

Beispiel:

$ java HelloWorld

Javaprogramme müssen als Bytecodedateien (Dateiextension *.class) oder als zu Java-Archiven (Dateiextension *.jar) gebündelte Bytecodedateien vorliegen.

Tipp: Das Kommando java akzeptiert nur den Namen der auszuführenden Klasse. Es akzeptiert nicht den Namen der gleichnamigen Datei mit dem Bytecode!

Das Kammando java  sucht dann standardmässig im aktuellen Verzeichnis nach einer Bytecodedatei (Extension *.class) die den Interpretercode für die gewünschte Klasse enthalten.

Hiermit ergibt sich die Abfolge der Kommandos für ein einfaches Testprogrann HelloWorld.java:

1. Testen der Java Laufzeitumgebung

Überprüfen sie ob eine Javalaufzeitumgebung vorhanden ist. Dies geschieht mit der Option -version des Programms java:

$ java -version
java version "1.6.0_20"
Java(TM) SE Runtime Environment (build 1.6.0_20-b02-279-10M3065)
Java HotSpot(TM) Client VM (build 16.3-b01-279, mixed mode)

2. Erstellen des Java-Quellcodes

Erstellen sie eine Textdatei mit dem Namen HelloWorld.java mit dem folgenden Inhalt:

class HelloWorld {
	public static void main(String[] args) {
	   System.out.println("Hello World!");
	}
}

Zum Beispiel mit gedit:

 

3. Übersetzen des Quellcodes

Das Programm javac (javac.exe in Windows) übersetzt den Quellcode.

$ javac HelloWorld.java

Das Ergebnis ist eine Datei mit dem Namen HelloWorld.class. Diese Datei enthält den interpretierbaren Bytecode des Programms.

4. Ausführen des Programmes

Der generierte Bytecode der Datei HelloWorld.class wird dann mit Hilfe des Programms java ausgeführt. Die extension .class wird nicht mit angegeben:

$ java HelloWorld
Hello World!

javac

Die (vereinfachte) Syntax von javac ist:

$ javac [Optionen] [Quelldateien] 

Die wichtigsten Optionen des Javaübersetzers javac sind:

  • -classpath -cp classpath : Verzeichnisse in denen nach .class Dateien gesucht werden soll
  • -d directory : Verzeichnis in dem die erzeugten .class Dateien abgelegt werden. Das Verzeichnis muss bereits existieren. Fehlt diese Option, so werden die erzeugten .class Dateien im aktuellen Verzeichnis abgelegt
  • - help: druckt alle Standardoptionen auf der Konsole
  • -source release: Erlaubt das Parsen der Javaquelldateien nach alten Sprachstandards [1.5,5,1.4,1.3].
  • -sourcepath sourcepath: Suchen von Quelldateien in den angegebenen Verzeichnissen und jar Archiven
  • -X : Anzeige der nicht Standardoptionen

1.6.2 Generieren von Schnittstelleninformation

Schnittstellengenerierung mit javap

Der Schnittstellengenerator javap wird im gleichen Verzeichnis aufgerufen in dem sich die Datei HelloWorld.class befindet. Rufen Sie ihn mit dem Befehl "javap HelloWorld" auf. Die Dateiendung .class wird nicht benötigt. javap benutzt nicht die Quelldatei. javap benutzt die Binärdatei und sucht sie im vorgegebenen Suchpfad für Binärdateien

sschneid@scalingbits:~/l1$ javap HelloWorld
Compiled from "HelloWorld.java"
class HelloWorld extends java.lang.Object{
    HelloWorld();
    public static void main(java.lang.String[]);
}

Es werden die Informationen über alle öffentlichen Eigenschaften generiert. Es werden nicht Informationen über die Implementierung und private Attribute und Methoden generiert.

1.6.3 Generieren von Javadokumentation

1. Editieren Sie die Datei HelloWorld.java

/**
 *
 * @author Ihr Name
 */
public class HelloWorld {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        System.out.println("HelloWorld");
    }
}

Datei sichern...

2. Rufen Sie javadoc auf

sschneid@scalingbits:~/l1$ javadoc HelloWorld.java 
Loading source file HelloWorld.java...
Constructing Javadoc information...
Standard Doclet version 1.6.0_18
Building tree for all the packages and classes...
Generating HelloWorld.html...
Generating package-frame.html...
Generating package-summary.html...
Generating package-tree.html...
Generating constant-values.html...
Building index for all the packages and classes...
Generating overview-tree.html...
Generating index-all.html...
Generating deprecated-list.html

3. Kontrolle Ergebnis: Öffnen Sie mit Ihrem Browser die Datei index.html

Beispiel (Screenshot)

 

1.6.4 Generieren von C Schnittstellen

Das Programm javah generiert Schnittstellendateien für C Anwendungen. Hiermit lassen sich plattformabhängige C-Programme aus der Javalaufzeitumgebung aufrufen. Dieses Vorgehen wird von JNI (Java Native Interface) unterstützt.

C-Routinen werden nicht in Java implementiert. Sie werden nur deklariert und die Bibliotheken mit den Objektdateien (keine Javaobjekte...) zur Laufzeit dazu gebunden. Die Deklaration findet mit Hilfe des Schlüsselworts native statt. Im folgenden Beispiel wurde eine C-Routine test() als extern deklariert.

HelloWorld.java Quellcode

/**
 *
 * @author Stefan Schneider
 */
public class HelloWorld {
   native int test();

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        System.out.println("Hello Gedit");
    }
}

Die Datei HelloWorld.java muss zuerst mit javac übersetzt werden um dann auf der Datei HelloWorld.class das Kommanda javah aufzurufen.

javac HelloWorld.java
javah HelloWorld

Generierte Datei helloWorld.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorld
 * Method:    test
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_HelloWorld_test
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

 

1.6.5 Javaprozess-Monitoring mit jconsole, jinfo, jps

Monitoring mit jconsole

 jconsole ist eine grafische Javaanwendung die es erlaubt die Konfiguration eines Javapozess' zur Laufzeit zu beobachten. Einige der Eigenschaften die beobachtet werden können sind:

  • Speicherverbrauch
  • Parameter mit denen die VM konfiguriert ist
  • genauer Typ der VM
  • CPU-Verbrauch
  • Anzahl der Threads
  • Anzahl geladene Klassen
  • ...

Die Verwendung von jconsole geschieht wie folgt:

1. Starten eines Javaprogramm

Starten eines (länger) laufenden Javaprogramm

Starten des Programm DemoFrame

java DemoFrame

2. Bestimmen der Pozess-Id des laufenden Javaprogramms

Jeder Prozess des Betriebssystems hat eine eindeutige Nummer den "Process Identifier". Das Kommando jps listet unabhängig vom Betriebssystem alle Javaprozesse.

jps
254 
16964 Jps
16959 DemoFrame

3. Starten von jconsole

jconsole 16959

Wichtig: Das Javaprogramm darf zum Zeitpunkt an dem jps und jconsole aufgerufen werden noch nicht beendet sein!

Laufende jconsole Anwendung:

 

Monitoring mit jinfo

jinfo liest ebenfalls die wichtigsten Kenndaten eines laufenden Prozesses aus und gibt sie auf der der Konsole aus.

Das erfassen der ProzessId geschieht auch mit dem Hilfsprogramm jps:

1. Starten des Javaprogramms

Starten (länger) laufenden Javaprogramm

Starten des Programm DemoFrame

java DemoFrame

2. Bestimmen der Pozess-Id des laufenden Javaprogramms

Pegasus:bin sschneid$ jconsole 16959
Pegasus:bin sschneid$ jps
254 
17168 Jps
17166 DemoFrame

3. Starten von jinfo

Pegasus:bin sschneid$ jinfo 17166
Attaching to process ID 17166, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 16.3-b01-279
Java System Properties:

java.runtime.name = Java(TM) SE Runtime Environment
sun.boot.library.path = /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Libraries
java.vm.version = 16.3-b01-279
awt.nativeDoubleBuffering = true
gopherProxySet = false
mrj.build = 10M3065
java.vm.vendor = Apple Inc.
java.vendor.url = http://www.apple.com/
path.separator = :
java.vm.name = Java HotSpot(TM) Client VM
file.encoding.pkg = sun.io
sun.java.launcher = SUN_STANDARD
user.country = DE
sun.os.patch.level = unknown
java.vm.specification.name = Java Virtual Machine Specification
user.dir = /Users/sschneid/Documents/JavaKurs/beispiele/l1/HelloWorld
java.runtime.version = 1.6.0_20-b02-279-10M3065
java.awt.graphicsenv = apple.awt.CGraphicsEnvironment
java.endorsed.dirs = /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/endorsed
os.arch = i386
apple.awt.graphics.UseOpenGL = false
java.io.tmpdir = /var/folders/UO/UOnPVFsvGEO5k3UJnjadeE+++TI/-Tmp-/
line.separator = 

java.vm.specification.vendor = Sun Microsystems Inc.
os.name = Mac OS X
sun.jnu.encoding = MacRoman
java.library.path = .:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java
java.specification.name = Java Platform API Specification
java.class.version = 50.0
sun.management.compiler = HotSpot Client Compiler
os.version = 10.6.4
http.nonProxyHosts = local|*.local|169.254/16|*.169.254/16
user.home = /Users/sschneid
user.timezone = 
java.awt.printerjob = apple.awt.CPrinterJob
file.encoding = MacRoman
java.specification.version = 1.6
java.class.path = .
user.name = sschneid
apple.awt.graphics.UseQuartz = false
java.vm.specification.version = 1.0
java.home = /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home
sun.arch.data.model = 32
user.language = de
java.specification.vendor = Sun Microsystems Inc.
awt.toolkit = apple.awt.CToolkit
java.vm.info = mixed mode
java.version = 1.6.0_20
java.ext.dirs = /Library/Java/Extensions:/System/Library/Java/Extensions:/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/ext
sun.boot.class.path = /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Classes/jsfd.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Classes/classes.jar:/System/Library/Frameworks/JavaVM.framework/Frameworks/JavaRuntimeSupport.framework/Resources/Java/JavaRuntimeSupport.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Classes/ui.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Classes/laf.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Classes/sunrsasign.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Classes/jsse.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Classes/jce.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Classes/charsets.jar
java.vendor = Apple Inc.
file.separator = /
java.vendor.url.bug = http://bugreport.apple.com/
sun.io.unicode.encoding = UnicodeLittle
sun.cpu.endian = little
mrj.version = 1060.1.6.0_20-279
socksNonProxyHosts = local|*.local|169.254/16|*.169.254/16
ftp.nonProxyHosts = local|*.local|169.254/16|*.169.254/16
sun.awt.exception.handler = apple.awt.CToolkit$EventQueueExceptionHandler
sun.cpu.isalist = 

VM Flags:


1.6.6 appletviewer

Der appletviewer erlaubt das Testen von Applets ohne einen Webserver.

Der appletviewer kann Applets in html Seiten starten solange sie gewissen Bedingungen genügen. 

Das folgende Beispiel zeigt die einfachste Anwendung des Appletviewers:

1. Übersetzen eines Applets in Bytecode

Erzeugen der Quellcodedatei HelloWorldApplet.java:

import java.applet.Applet;
import java.awt.Graphics;
public class HelloWorldApplet extends Applet{
    /**
* Diese Methode wird aufgerufen wenn das Applet started
*
*/ public void init() { // Die Methode ist notwendig. Sie muss aber nicht mit Inhalt gefüllt // werden. System.out.println("HelloWorldApplet.init() aufgerufen"); } /**
* Diese Methode wird aufgerufen wenn das Applet beendet wird.
* Der Benutzer hat die html Seite verlassen
*/ public void stop() { System.out.println("HelloWorldApplet.stop() aufgerufen"); } /**
* Die Standardmethode um etwas auf den Bildschirm zu malen
*/ public void paint(Graphics g) { //Diese Methode malt Text auf den Bildschirm // Text, x Koordinate, y Koordinate g.drawString("Dies ist ein Text",20,20); g.drawString("Hello World!",20,40); } }

Übersetzen der Quelldatei HelloWorldApplet.java und Erzeugen der Bytecodedatei HelloWorldApplet.class

java HelloWordApplet.java

2. Erzeugen der html Datei HelloWorld.html

<html>
   <applet code="HelloWorldApplet.class" width="200" height="50" >
   </applet>
</html>

3. Aufruf des appletviewer

Der appletviewer muss im Verzeichnis aufgerufen werden in dem die Dateien HelloWorld.html HelloWorldApplet.class gespeichert sind.

appletviewer HelloWorld.html

Ergebnis: