Im Katalog suchen

Linux - Wegweiser zur Installation & Konfiguration, 3. Auflage

Online-Version

Copyright © 2000 by O'Reilly Verlag GmbH & Co.KG

Bitte denken Sie daran: Sie dürfen zwar die Online-Version ausdrucken, aber diesen Druck nicht fotokopieren oder verkaufen. Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

Wünschen Sie mehr Informationen zu der gedruckten Version des Buches Linux - Wegweiser zur Installation & Konfiguration oder wollen Sie es bestellen, dann klicken Sie bitte hier.


vorheriges Kapitel Inhaltsverzeichnis Stichwortverzeichnis nächstes Kapitel

Java

Icon

Kapitel 16

Java ist eine netzwerkfähige, objektorientierte Sprache, die von Sun Microsystems entwickelt wurde. Java hat unter Computer-Fachleuten für viel Aufregung gesorgt, weil es versucht, eine sichere Sprache zur Ausführung von Applets zu sein, die von Servern im World Wide Web heruntergeladen werden. Die Idee ist einfach: Webbrowser laden Java-Applets herunter, die dann auf dem Client-Rechner ausgeführt werden. Der beliebte Netscape-Browser (beschrieben in Kapitel 16, Das World Wide Web und E-Mail) unterstützt Java, und das Java Developer's Kit und andere Werkzeuge sind auf Linux portiert worden. Aber Java ist nicht nur für Applets geeignet; in jüngster Zeit ist es auch mehr und mehr als allgemeine Programmiersprache eingesetzt worden, die dem Anfänger weniger Hürden in den Weg legt und die - aufgrund der eingebauten Netzwerkbibliotheken - besonders oft zur Programmierung von Client/Server-Anwendungen verwendet wird.

Was Java verspricht, oder: Warum Java etwas für Sie sein könnte

Das klingt vielleicht alles nicht so aufregend für Sie. Es gibt schließlich viele objektorientierte Programmiersprachen, und mit Netscape-Plug-ins können Sie auch ausführbare Programme von Webservern herunterladen und auf Ihrem lokalen Rechner ausführen.

Aber Java kann mehr. Einer der interessantesten Aspekte ist die Plattformunabhängigkeit. Damit ist gemeint, daß Sie ein Java-Programm schreiben und kompilieren und dann auf so ziemlich jedem Rechner einsetzen können, sei es nun ein bescheidener 386er unter Linux, ein schneller Pentium III mit der neuesten Fehleransammlung von Microsoft oder ein IBM-Mainframe. Sun Microsystems nennt das »Write Once, Run Anywhere« (einmal schreiben, überall ausführen). Allerdings ist das wahre Leben nicht so einfach wie Entwurfsziele. Es gibt winzige, aber frustrierende Unterschiede, wegen denen ein Programm auf einer Plattform funktioniert, auf einer anderen aber nicht. Mit der neuen GUI-Bibliothek Swing in Java 2.0 ist allerdings ein großer Schritt in die richtige Richtung getan worden.

Die Fähigkeit, Code einmal zu kompilieren und dann auf einem anderen Rechner ausführen zu können, wird durch die Java Virtual Machine (JVM) möglich gemacht. Der Java-Compiler erzeugt keinen Objektcode für einen bestimmten Prozessor und ein bestimmtes Betriebssystem, wie es der gcc tut, sondern für die Java Virtual Machine. Dieser Rechner existiert (noch) nicht in Form von Hardware, sondern ist einfach eine Spezifikation. Diese Spezifikation besagt, welche sogenannten Opcodes der Rechner versteht und was er tun soll, wenn er auf einen solchen Opcode in der Objektdatei stößt. Das Programm wird in Binärform im sogenannten Bytecode verbreitet, der der Spezifikation der Java Virtual Machine gehorcht.

Alles, was Sie jetzt noch brauchen, ist ein Programm, das die Java Virtual Machine auf Ihrem Computer und Ihrem Betriebssystem implementiert. Solche Programme gibt es heutzutage für so ziemlich jede Plattform - kein Hersteller kann es sich noch leisten, keine Java Virtual Machine für seine Hardware oder sein Betriebssystem parat zu haben. Dieses Programm wird Java-Interpreter genannt, weil es die Opcodes, die für die Java Virtual Machine kompiliert worden sind, interpretiert und in Code für den nativen Rechner übersetzt.

Diese Unterscheidung, die Java zu sowohl einer kompilierten als auch einer interpretierten Sprache macht, macht es möglich, ein Java-Programm zu schreiben und zu kompilieren und dann an jemand anderen weiterzugeben. Unabhängig davon, welche Hardware und welches Betriebssystem der Empfänger hat - er wird auf jeden Fall in der Lage sein, das Programm auszuführen, sofern es für seine Plattform einen Java-Interpreter gibt.

Leider gibt es die Plattformunabhängigkeit von Java nicht umsonst. Weil der Objektcode kein Objektcode für irgendeine bereits existierende Hardware ist, muß er eine zusätzliche Verarbeitungsschicht durchlaufen, was dazu führt, daß in Java geschriebene Programme üblicherweise zehn- bis zwanzigmal langsamer sind als vergleichbare in C geschriebene Programme. Das ist zwar in manchen Fällen egal, in anderen ist es aber schlicht und einfach inakzeptabel. Es gibt sogenannte Just-In-Time-Compiler, die den Objektcode für die Java Virtual Machine zunächst in nativen Objektcode kompilieren und dann diesen Objektcode ausführen. Wenn der gleiche Objektcode dann ein zweites Mal ausgeführt wird, kann der vorkompilierte native Code ohne weitere Interpretation verwendet werden und wird daher schneller ausgeführt. Aber trotzdem wird nicht die Geschwindigkeit von C-Programmen erreicht. Sun Microsystems arbeitet an einer Technologie, die angeblich eine »mit C-Programmen vergleichbare« Ausführungsgeschwindigkeit erreichen soll, aber ob dieses Versprechen auch eingehalten werden kann, bleibt abzuwarten.

Java unterscheidet darüber hinaus zwischen Applikationen und Applets. Applikationen sind freistehende Programme, die von der Kommandozeile oder Ihrer lokalen Oberfläche ausgeführt werden und sich wie gewöhnliche Programme verhalten. Applets dagegen sind (normalerweise kleinere) Programme, die in Ihrem Webbrowser ausgeführt werden. (Um diese Programme auszuführen, muß ein Java-Interpreter im Webbrowser enthalten sein.) Wenn Sie eine Website besuchen, die ein Java-Applet enthält, dann schickt Ihnen der Webserver den Objektcode des Applets, und Ihr Browser führt diesen für Sie aus. Das kann für alles - von einfachen Animationen bis hin zu kompletten Online-Banking-Systemen - verwendet werden. Fu▀noten 1

Beim Lesen des letzten Absatzes haben Sie vielleicht gedacht: »Und was passiert, wenn das Applet bösartigen Code enthält, der meine Festplatte ausspioniert oder vielleicht sogar Dateien löscht oder zerstört?« Natürlich wäre das durchaus im Bereich des Möglichen, wenn die Entwickler von Java keine mehrstufige Gegenmaßnahme gegen solche Angriffe entworfen hätten: Alle Java-Applets laufen in einem sogenannten Sandkasten, was ihnen nur eingeschränkten Zugriff auf lokale Ressourcen ermöglicht. Beispielsweise können Java-Applets Text auf Ihrem Bildschirm ausgeben, aber keine Daten von Ihrem lokalen Dateisystem lesen oder gar darauf schreiben, wenn Sie das nicht ausdrücklich erlauben. Dieses Sandkasten-Paradigma schränkt zwar die Nützlichkeit von Applets ein, erhöht aber die Sicherheit Ihrer Daten. In neueren Java-Versionen können Sie selbst bestimmen, wieviel Sicherheit Sie benötigen, und sich so auf Kosten der Sicherheit zusätzliche Flexibilität erkaufen.

Icon

[63] Thinking in Java
[52] Exploring Java
[63] Core Java 2

Wenn Sie der Meinung sind, daß Java etwas ist, was Sie ausprobieren wollen, dann möchte ich Ihnen das Buch Thinking in Java von Bruce Eckel ans Herz legen. Es enthält so ziemlich alles, was Sie in der Java-Welt wissen müssen, und bringt Ihnen auch allgemeine Programmierprinzipien bei. Andere interessante Java-Bücher sind Exploring Java von Pat Niemeyer und Josh Peck und Core Java von Gary Cornell und Cay Horstmann.

Java für Linux besorgen

Glücklicherweise gibt es eine Portierung des sogenannten JDK, des Java Developer's Kit, das Sun Microsystems für Solaris und Windows bereitstellt und das als eine Referenzimplementierung für Java dient. In der Vergangenheit hat es normalerweise etwas länger gedauert, bis eine neue JDK-Version für Solaris und Windows auch unter Linux zur Verfügung stand, aber Sun Microsystems hat versprochen, eng mit den Entwicklern der Linux-Version zusammenzuarbeiten, so daß Hoffnung besteht, daß zukünftige Linux-Versionen eher zur Verfügung stehen werden.

Die »offizielle« Java-Implementierung JDK enthält einen Compiler, einen Interpreter und weitere Werkzeuge. Es gibt auch andere Kits für Linux, oft in Form von Open Source Software. Wir behandeln hier aber das JDK, weil es der Standard ist.

Noch eine Anmerkung: Die meisten Distributionen enthalten bereits das JDK für Linux, so daß es einfacher für Sie sein kann, einfach ein vorbereitetes Paket zu installieren. Allerdings wird das JDK ständig weiterentwickelt, so daß Sie möglicherweise eine neuere Version installieren wollen, als Ihre Distribution enthält.

Sie finden alles Notwendige zu Java unter Linux unter http://www.blackdown.org . Sie finden hier Dokumentation, Neues über Linux-Portierungen und Links auf die Webseiten, von denen Sie das Java-JDK herunterladen können.

Nach dem Entpacken und Installieren des JDK gemäß den Anweisungen stehen Ihnen mehrere neue Programme zur Verfügung. javac ist der Java-Compiler, java der Java-Interpreter und appletviewer ein kleines GUI-Programm, mit dem Sie Applets ohne vollständigen Webbrowser ausführen können.

Ein vollständiges Java-Beispiel

Das folgende Programm (das für Java 1.1 geschrieben wurde, aber auch mit Java 1.2/2 funktionieren sollte) ist ein vollständiges Java-Programm, das Sie sowohl als freistehende Applikation als auch als Applet verwenden können. Es handelt sich um ein kleines Malprogramm, mit dem Sie auf einer virtuellen Leinwand herumkritzeln können. Außerdem verwendet es einige GUI-Elemente wie einen Button und ein Optionsmenü.

Der Bestandteil von Java, der GUI-Elemente wie Fenster und Menüs bereitstellt, heißt das »Abstract Window Toolkit« (AWT). Er trägt seinen Teil dazu bei, Javas Versprechen des »einmal kompilieren, überall ausführen« einzulösen. Auch wenn verschiedene Betriebssysteme wie Linux, Windows und Macintosh alle unterschiedliche Fenstersysteme haben, müssen Sie den Code für die Benutzerschnittstelle nur einmal schreiben. Das AWT bildet die plattformunabhängigen Widgets dann auf eine native GUI-Bibliothek ab. Ihre Programme nehmen daher das gewohnte Aussehen der jeweiligen Plattform an, sehen also auf unterschiedlichen Plattformen unterschiedlich aus.

Das AWT hat eine Reihe von Nachteilen, wie eben die Tatsache, daß die Programme auf den einzelnen Plattformen unterschiedlich aussehen (manche halten das allerdings für einen Vorteil, weil das Programm genau wie eine native Applikation der jeweiligen Plattform aussieht), die geringe Geschwindigkeit und die vielen Fehler. In der neuen Version Java 2 wird das AWT weitgehend durch ein neues Toolkit namens Swing ersetzt, das auf einer internen AWT-Schicht basiert und alle GUI-Elemente in Java implementiert. Swing-Projekte sehen üblicherweise sehr nett aus, sind aber noch langsamer.

Genug geredet jetzt. Hier ist der Code für das kleine Malprogramm:

1 import java.applet.*;
2 import java.awt.*;
3 import java.awt.event.*;
4 /** Ein Applet, das auch freistehend ausgeführt werden kann */
5 public class StandaloneScribble extends Applet {
6 /**
7 * Die Methode main(). Wenn dieses Programm als Applikation ausgeführt wird,
8 * erzeugt diese Methode das benötigte Fenster, setzt das Applet ein und ruft
9 * die untenstehende Methode init() auf. Beachten Sie, daß Frame per
10 * Voreinstellung PanelLayout verwendet.
11 */
12 public static void main(String[] args) {
13 Frame f = new Frame(); // Fenster erzeugen
14 Applet a = new StandaloneScribble(); // Applet-Panel erzeugen
15 f.add(a, "Center"); // Applet zum Fenster hinzufügen
16 a.init(); // Applet initialisieren
17 f.setSize(400, 400); // Fenstergröße festlegen
18 f.show(); // Fenster sichtbar machen
19 f.addWindowListener(new WindowAdapter() { // Fensterschließen behandeln
20 public void windowClosing(WindowEvent e) { System.exit(0); }
21 });
22 }
23 /**
24 * Die Methode init(). Wenn das Programm als Applet gestartet wird, stellt
25 * der Browser Platz auf dem Bildschirm für das Applet bereit und ruft
26 * diese Methode für Initialisierungszwecke auf.
27 */
28 public void init() {
29 // Ein MouseListener-Objekt definieren, instantiieren und registrieren
30 this.addMouseListener(new MouseAdapter() {
31 public void mousePressed(MouseEvent e) {
32 lastx = e.getX();
33 lasty = e.getY();
34 }
35 });
36 // Ein MouseMotionListener-Objekt definieren, instantiieren und registrieren
37 this.addMouseMotionListener(new MouseMotionAdapter() {
38 public void mouseDragged(MouseEvent e) {
39 Graphics g = getGraphics();
40 int x = e.getX(), y = e.getY();
41 g.setColor(Color.black);
42 g.drawLine(lastx, lasty, x, y);
43 lastx = x; lasty = y;
44 }
45 });
46 // Löschen-Button erzeugen
47 Button b = new Button("Löschen");
48 // Einen Listener definieren, instantiieren und registrieren, der auf das
49 // Klicken des Buttons reagiert
50 b.addActionListener(new ActionListener() {
51 public void actionPerformed(ActionEvent e) { // Leinwand säubern
52 Graphics g = getGraphics();
53 g.setColor(getBackground());
54 g.fillRect(0, 0, getSize().width, getSize().height);
55 }
56 });
57 // Button zum Applet hinzufügen
58 this.add(b);
59 }
60 protected int lastx, lasty; // Koordinaten des letzten Mausklicks
61 }

Speichern Sie diesen Code in einer Datei namens StandaloneScribble.java. Der Name ist wichtig, er muß der gleiche sein wie der Name der in der Datei implementierten Klasse, dazu wird .java angehängt. Mit dem folgenden Befehl kompilieren Sie diesen Code:

$tigger javac StandaloneScribble.java

Das kann ein Weilchen dauern. Der Java-Compiler ist nicht besonders schnell; unter anderem deswegen, weil er selbst in Java geschrieben ist. Wenn er fertig ist, finden Sie eine neue Datei StandaloneScribble.class sowie einige weitere Dateien, auf die wir hier nicht eingehen wollen, vor.

Sie können dieses Programm jetzt von der Kommandozeile ausführen. Geben Sie dazu einfach folgenden Befehl ein:

$tigger java StandaloneScribble

Wenn Sie das JDK korrekt installiert haben, dann sollten Sie ein Fenster mit der Leinwand zum Bekritzeln bekommen. Beachten Sie, daß dem Befehl java als Argument der Name der Klasse ohne die Dateinamenserweiterung .class übergeben wird. Das liegt daran, daß der Java-Interpreter intern die Klasse und nicht die Datei ausführt.

Sie können dieses Programm aber auch in einem Webbrowser oder im appletviewer aus dem JDK ausführen. Dazu brauchen Sie ein wenig HTML-Code. Der folgende Code sollte ausreichen:

<APPLET code="StandaloneScribble.class" width=150 height=100> </APPLET>

Speichern Sie diesen Code in einer Datei, und öffnen Sie diese mit einem Webbrowser wie dem Netscape Navigator oder dem appletviewer, und Sie werden das Programm im Browser-Fenster sehen.

Zum Abschluß dieses Abschnitts gehen wir noch die interessantesten Zeilen des Programms durch: In den ersten drei Zeilen werden andere Java-Klassen, die aus dem JDK stammen, importiert. Das kann man etwa mit dem Einbinden von Header-Dateien in einem C-Programm vergleichen, auch wenn es in Java kein Linken gibt. Wenn das Programm ausgeführt wird, muß der Java-Interpreter in der Lage sein, die importierten Klassen zu finden. Das geschieht durch Suchen in den Verzeichnissen, die in der Umgebungsvariable CLASSPATH eingetragen sind, was Sie entsprechend der Dokumentation zum JDK getan haben sollten.

Die Zeilen 13 bis 21 enthalten die Methode main(). Wenn das Programm als freistehende Applikation gestartet wird, dann wird diese Methode vom Interpreter aufgerufen, um die Programmausführung in Gang zu bringen. In dieser Methode wird ein Fenster erzeugt, das dann für die Bildschirmausgaben verwendet wird.

Der verbleibende Code besteht hauptsächlich aus der Methode init(). Diese wird entweder von main() aufgerufen (wenn das Programm freistehend gestartet wird) oder vom Webbrowser (wenn das Programm als Applet gestartet wird). In letzterem Fall wird main() überhaupt nicht durchlaufen.

Java-Programme wie andere Programme ausführen

Icon

Kapitel 7

Seit der Kernel-Version 2.0 ist es möglich, Java-Programme auszuführen, ohne den Interpreter explizit aufzurufen. Dazu müssen Sie Ihren Kernel neu kompilieren (siehe dazu Kapitel 7, Software und den Kernel aktualisieren,) und die Unterstützung des Java-Binärformats einschalten. Wenn Sie den neuen Kernel installiert und Ihren Rechner neu gestartet haben, können Sie Ihre Klassendatei ausführbar machen und einfach von der Kommandozeile starten. Der Linux-Kernel wird den Java-Interpreter im Hintergrund für Sie starten:

tigger$ chmod +x StandaloneScribble.class tigger$ ./StandaloneScribble.class

Nicht schlecht, nicht wahr? Die großen Firmen wie IBM und Microsoft versuchen immer noch, das hinzubekommen. Falls das bei Ihnen nicht funktioniert, liegt es wahrscheinlich daran, daß der Linux-Kernel den Java-Interpreter nicht finden kann. Überprüfen Sie die Werte der beiden Konstanten _PATH_JAVA und _PATH_APPLET in der Datei /usr/src/linux/fs/binfmt_java.c. Wenn diese nicht den korrekten Pfad zu Ihrem Java-Interpreter und zum appletviewer wiedergeben, dann verschieben Sie den Interpreter und den appletviewer in die angegebenen Verzeichnisse oder ändern Sie binfmt_java.c entsprechend. In letzterem Fall müssen Sie den Kernel neu kompilieren und installieren.

 Fu▀noten 1
Einer der Autoren erledigt alle seine Bankgeschäfte über ein Java-Applet, das seine Bank zur Verfügung stellt, wenn man einen speziellen Bereich auf dem Webserver der Bank besucht.


vorheriges Kapitel Inhaltsverzeichnis Stichwortverzeichnis nächstes Kapitel


Weitere Informationen zum Linux - Wegweiser zur Installation & Konfiguration

Weitere Online-Bücher & Probekapitel finden Sie in unserem Online Book Center


O'Reilly Home | O'Reilly-Partnerbuchhandlungen | Bestellinformationen | Kontaktieren Sie uns
International | Über O'Reilly | Tochterfirmen

© 2000, O'Reilly Verlag