Plattformunabhängige Java-Anwendungen mit JBuilder

Hallo!

Ich programmiere mit JBuilder 3 Standard eine Java-Anwendung. Obwohl ich beim Anlegen des Projekts angegeben hatte, daß nur JDK und Swing-Klassen verwendet werden dürfen, importiert er borlandspezifische Klassen.

import com.borland.jbcl.layout.*;
import com.borland.jbcl.control.*;

Kann man das nicht irgendwie abstellen?

Ich möchte die Anwendung aber auf beliebigen Rechnern und Betriebssystemen starten können, sobald jdk installiert ist. Durch die Borland-Klassen funktioniert das jetzt natürlich nicht. Deshalb habe ich mit dem „Weitergabe-Experten“ von JBuilder ein jar-File erstellt, in das normalerweise alles eingebunden werden sollte.

Aber anscheinend ist das wohl nicht der Fall, denn wenn ich das jar-File von einer DOS-Shell aus starte, erhalte ich die Fehlermeldung: „Failed to load Mail-Class manifest attribute from .“, obwohl das Progamm im JBuilder wunderbar funktioniert.

Wie kriege ich es jetzt also hin, mit JBuilder plattformunabhängige Java-Anwendungen zu erstellen, die überall laufen?

Grüße, Tanja

Hallo!

Ich programmiere mit JBuilder 3 Standard
eine Java-Anwendung. Obwohl ich beim
Anlegen des Projekts angegeben hatte, daß
nur JDK und Swing-Klassen verwendet
werden dürfen, importiert er
borlandspezifische Klassen.

import com.borland.jbcl.layout.*;
import com.borland.jbcl.control.*;

Kann man das nicht irgendwie abstellen?

JBuilder3 importiert diese Pakete nur, wenn auch Klassen aus diesen Paketen benutzt werden. Ich tippe mal darauf, das Du einen Dialog oder ein Frame mit einem x/y-Layout von Borland im Designer erstellt hast. Deshalb die Zeile:

import com.borland.jbcl.layout.*;

Wenn Du in deinem Quellcode alle borlandspezifischen Klassen durch z.B. Swing-Klassen ersetzt, kannst Du natürlich auch die import-Anweisungen aus dem Quellcode löschen.
(Standardmässig importiert der JBuilder3 keine borland-spezifischen Klassen.)

Ich möchte die Anwendung aber auf
beliebigen Rechnern und Betriebssystemen
starten können, sobald jdk installiert
ist. Durch die Borland-Klassen
funktioniert das jetzt natürlich nicht.
Deshalb habe ich mit dem
„Weitergabe-Experten“ von JBuilder ein
jar-File erstellt, in das normalerweise
alles eingebunden werden sollte.

Aber anscheinend ist das wohl nicht der
Fall, denn wenn ich das jar-File von
einer DOS-Shell aus starte, erhalte ich
die Fehlermeldung: „Failed to load
Mail-Class manifest attribute from
.“, obwohl das
Progamm im JBuilder wunderbar
funktioniert.

Wenn Du in der DOS-Shell ein Java-Programm starten willst, muss der Classpath auf alle für die Applikation benötigten Klassen zeigen. In Windows NT kann der Classpath als Variable im Arbeitsplatz definiert werden. In Windows95/98 muss der Classpath in der Autoexec.bat definiert werden. Oder Du benutzt den Befehl
set Classpath=.;c:…;d:…; in der DOS-Shell (Windows95/98/NT).
Dabei müssen die Namen der .jar-Files explizit angegeben werden, z.B.:
set Classpath=.;c:\JarFile.jar;

Wenn alle Klassenpfade gesetzt sind, musst Du deine Applikation mit Angabe des Paketnamens (wenn vorhanden) starten.
z.B.:
java Paketname1.Paketname2.Klassenname.class
z.B.:
java Test.MyApplication.Rechner.class

So funktioniert das unter Java.

Sollte es immer noch nicht funktionieren, einfach noch einmal nachfragen.

Gruß

Jörg

Hallo Jörg!

JBuilder3 importiert diese Pakete nur,
wenn auch Klassen aus diesen Paketen
benutzt werden. Ich tippe mal darauf, das
Du einen Dialog oder ein Frame mit einem
x/y-Layout von Borland im Designer
erstellt hast.

Danke für den Tip. Ich hatte gar nicht mehr daran gedacht, daß das XY-Layout borlandspezifisch ist. Ich habe jetzt alles auf GridBag-Layout umgestellt und die Import-Anweisung gelöscht. So funktioniert es jetzt sehr gut. :smile:

Sollte es immer noch nicht funktionieren,
einfach noch einmal nachfragen.

Zum jar-File habe ich noch eine Frage. Ich habe im NT-Arbeitsplatz den Pfad zum jar-File gesetzt (Classpath=.;e:\temp\Kursverwaltung.jar;…). Wenn ich nun das Programm in diesem Verzeichnis mit „java -jar Kursverwaltung“ starten will, bekomme ich immer die Fehlermeldung „Failed to load Main-Class manifest attribute from Kursverwaltung.jar“. Was mache ich falsch?

Außerdem würde mich noch interessieren, wozu JBuilder die class-Files doppelt anlegt (z. B. Hauptmenue$1.class - Hauptmenue$10.class immer mit dem gleichen Speicherdatum).

Grüße, Tanja

Hallo Tanja!

Zum jar-File habe ich noch eine Frage.
Ich habe im NT-Arbeitsplatz den Pfad zum
jar-File gesetzt
(Classpath=.;e:\temp\Kursverwaltung.jar;…).

Wenn Du den Inhalt im Classpath änderst, musst Du immer wieder eine neue Dos-Shell öffnen, da eine bereits bestehende Dos-Shell die Änderungen im Classpath nicht mitbekommt. Testen wie der Classpath im Dos-Fenster steht, kannst Du mit „set Classpath“ ohne Parameter. Das aber nur nebenbei. Jetzt zu Deinen Fragen.

Wenn ich nun das Programm in diesem
Verzeichnis mit „java -jar
Kursverwaltung“ starten will, bekomme ich
immer die Fehlermeldung „Failed to load
Main-Class manifest attribute from
Kursverwaltung.jar“. Was mache ich
falsch?

Du machst folgenden Fehler:
Beim Starten von Java musst Du dem Befehl java eine ausführbare Klasse angeben, nicht ein Jar-File. Da Du den Classpath schon in der NT-Umgebung gesetzt hast, genügt folgender Aufruf:

java [ausführbare Klasse]

z.B.: java Kursverwaltung

Dabei ist Kursverwaltung eine ausführbare Klasse, d.h. eine Klasse mit einer Methode

public static void main (String[] args)

Falls in Deinem Quellcode der Klasse Kursverwaltung noch ein Paket definiert ist, mit z.B. package Kursverwaltung, so ist in deinem jar-File auch dieser Path gespeichert. (Einfach mal kontrollieren).

Dann musst Du folgenden Aufruf tätigen:

java „Paketname“.„Klassenname“

z.B.:

java Kursverwaltung.Kursverwaltung

Außerdem würde mich noch interessieren,
wozu JBuilder die class-Files doppelt
anlegt (z. B. Hauptmenue$1.class -
Hauptmenue$10.class immer mit dem
gleichen Speicherdatum).

Grüße, Tanja

Also Tanja, bei den $-Klassen handelt es sich nicht um eine doppelte Datei, sondern um innere Klassen, d.h. um Klassen die innerhalb einer anderen Klasse definiert wurden. Schau doch einmal in deinen Quellcode, dort wirst du mehrere folgende Zeilen finden:

public class „Klassenname“

Meist am Ende des Quellcodes.
Beim Kompilieren mit dem JBuilder werden alle am Projekt beteiligten Klassen neu kompiliert, deshalb das gleiche Speicherdatum.

Alles klar? :wink:

Bei weiteren Fragen, einfach nochmal fragen.

Viele Grüße,

Jörg

Hallo Jörg!

Beim Starten von Java musst Du dem Befehl
java eine ausführbare Klasse angeben,
nicht ein Jar-File. Da Du den Classpath
schon in der NT-Umgebung gesetzt hast,
genügt folgender Aufruf:

java [ausführbare Klasse]

z.B.: java Kursverwaltung

Aha. So funktioniert’s. Allerdings werden die Bilder, die ich in das jar-File miteingefügt hatte, nicht auf der GUI angezeigt, wo sie eigentlich hin sollten.

bei den $-Klassen handelt es
sich nicht um eine doppelte Datei,
sondern um innere Klassen, d.h. um
Klassen die innerhalb einer anderen
Klasse definiert wurden.

Diese Erklärung fände ich logisch, jedoch habe ich keine inneren Klassen definiert, es gibt immer nur eine Klasse pro java-File.

Noch was anderes, was kannst Du denn für einen Layout-Manager empfehlen. Ich mache es gerade so, daß ich zuerst alles mit dem XY-Layout schön anordne und dann in GridBag-Layout umwandle. Jedoch sieht die GUI danach meist ziemlich vermurkst aus.

Bei weiteren Fragen, einfach nochmal
fragen.

Danke für Deine Hilfe und sorry für meine blöden Fragen. Ich habe schon seit einem Jahr nichts mehr mit Java gemacht und wohl schon wieder alles vergessen…

Grüße, Tanja

Hallo Tanja!

Aha. So funktioniert’s. Allerdings werden
die Bilder, die ich in das jar-File
miteingefügt hatte, nicht auf der GUI
angezeigt, wo sie eigentlich hin sollten.

Diese Bilder musst du expliziet laden. (z.B. mit der Klasse ResourceBundle.)

Diese Erklärung fände ich logisch, jedoch
habe ich keine inneren Klassen definiert,
es gibt immer nur eine Klasse pro
java-File.

Das kann ich bald nicht glauben. Es MUSS mehrere Klassendefinitionen innerhalb Deiner Klasse geben. Die Klassen legt der JBuilder z.B. an, wenn er eine Action eines Buttons generiert. Such doch einfach mal in Deinem Quelltext nach dem Begriff „class“.

Noch was anderes, was kannst Du denn für
einen Layout-Manager empfehlen. Ich mache
es gerade so, daß ich zuerst alles mit
dem XY-Layout schön anordne und dann in
GridBag-Layout umwandle. Jedoch sieht die
GUI danach meist ziemlich vermurkst aus.

Ich mach das genau so.

Viele Grüsse,

Jörg

Hallo Jörg!

Allerdings werden
die Bilder, die ich in das jar-File
miteingefügt hatte, nicht auf der GUI
angezeigt, wo sie eigentlich hin sollten.

Diese Bilder musst du expliziet laden.
(z.B. mit der Klasse ResourceBundle.)

Ach so, das werde ich bei Gelegenheit mal ausprobieren. Mir war vorerst nur wichtig, daß das jar-File überhaupt mal funktioniert.

Das kann ich bald nicht glauben. Es MUSS
mehrere Klassendefinitionen innerhalb
Deiner Klasse geben.

Nein, gibt es nicht. In Hauptmenue.java gibt es z. B. nur „class Hauptmenue“ (ich habe sogar extra mit Search nach „class“ gesucht).

Die Klassen legt der
JBuilder z.B. an, wenn er eine Action
eines Buttons generiert.

Warum sollte denn eine neue Klasse anglegt werden, wenn eine Action auf einen Button generiert wird? Zuerst lege ich ein neues Objekt der Klasse JButton an JButton btnRaumBelegen = new JButton();, dann wird ein Objekt der Klasse ActionListener- dafür angelegt btnRaumBelegen.addActionListener(new java.awt.event.ActionListener(), das jedes Drücken auf den Button abfängt. In der Methode void btnRaumBelegen_actionPerformed(ActionEvent e) gebe ich an, was beim Drücken des Buttons passieren soll. Ich brauche also keine neue Klasse, oder sehe ich das falsch?

Noch was anderes, was kannst Du denn für
einen Layout-Manager empfehlen. Ich mache
es gerade so, daß ich zuerst alles mit
dem XY-Layout schön anordne und dann in
GridBag-Layout umwandle. Jedoch sieht die
GUI danach meist ziemlich vermurkst aus.

Ich mach das genau so.

Nach einiger Zeit habe ich tatsächlich mit dieser Methode ein paar ganz passable GUIs hinbekomen.

Grüße, Tanja