• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

SWT-Programm standalone starten (Java, Eclipse)?

spunti

Hacker
Hallo Kollegen,
wenn jemand weiß, wie ich ein SWT-Programm standalone starten kann ohne igendwas hin- und herzukopieren oder was fest in irgendwelche Pfade einzutragen, sagt mal bitte bescheid.

Ich hab hier eines, daß in der Eclipse funktioniert, aber ich möchte das gerne weitergeben und man soll es dann einfach über ein Startskript (je eines für Win und Lin) starten können.

Für Linux hab ich probiert das "swt.jar" und "swt-pi.jar" mit in mein Programmverzeichnis zu kopieren und dann erst mal so zu starten:

"java -cp /home/spunti/workspace/GUIProject -Djava.library.path=/usr/local/share/eclipse/plugins/org.eclipse.swt.gtk_3.0.1/os/linux/x86 GUIFrame"

Klappt aber nicht und es kommt der Fehler:
"Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/swt/widgets/Composite"

(Mal ganz abgesehen davon, daß ich dieses lange Verzeichnis mit den .so-Dateien dann wohl auch noch mitkopieren müßte?)

grüße
spunti
 

oc2pus

Ultimate Guru
"java -cp /home/spunti/workspace/GUIProject -Djava.library.path=/usr/local/share/eclipse/plugins/org.eclipse.swt.gtk_3.0.1/os/linux/x86 GUIFrame"

du brauchst im Classpath ALLE jar files, auch die von SWT !!

du kannst in einem Script folgendes tun:
Code:
PROGRAMM_DIR=<pfad wo swt jars stehen>
# build the classpath
for FILE in ${PROGRAM_DIR}/*.jar; do
   SWTCLASSPATH="${SWTCLASSPATH:+${SWTCLASSPATH}:}$FILE"
done
CLASSPATH=<eigene jars>

und dann
java -cp $CLASSPATH:$SWTCLASSPATH ...
 
OP
S

spunti

Hacker
Dein Skript will bestimmt meinen Classenpfad verändern, das will ich ja nicht (allen die mein Programm benutzen wollen zumuten). Aber ich glaube, du hast mich schon etwas weitergebracht.

Ich hab jetzt mal:
"java -cp /home/ronny/workspace/GUIProject/swt.jar:/home/ronny/workspace/GUIProject/swt-pi.jar -Djava.library.path=/usr/local/share/eclipse/plugins/org.eclipse.swt.gtk_3.0.1/os/linux/x86 GUIFrame"

Also noch mal explizit den Dateinamen von "swt.jar" und "swt-pi.jar" angegeben und jetzt meckert er was anderes, nämlich:
Exception in thread "main" java.lang.NoClassDefFoundError: GUIFrame

Was aber auch ziemlich blöd ist, da GUIFrame ja meine Startklasse ist und ich auch in dem richtigen Verzeichnis bin und es auch GUIFrame.class gibt:-(

spunti
 

oc2pus

Ultimate Guru
spunti schrieb:
Dein Skript will bestimmt meinen Classenpfad verändern, das will ich ja nicht (allen die mein Programm benutzen wollen zumuten). Aber ich glaube, du hast mich schon etwas weitergebracht.

Ich hab jetzt mal:
"java -cp /home/ronny/workspace/GUIProject/swt.jar:/home/ronny/workspace/GUIProject/swt-pi.jar -Djava.library.path=/usr/local/share/eclipse/plugins/org.eclipse.swt.gtk_3.0.1/os/linux/x86 GUIFrame"

Also noch mal explizit den Dateinamen von "swt.jar" und "swt-pi.jar" angegeben und jetzt meckert er was anderes, nämlich:
Exception in thread "main" java.lang.NoClassDefFoundError: GUIFrame

Was aber auch ziemlich blöd ist, da GUIFrame ja meine Startklasse ist und ich auch in dem richtigen Verzeichnis bin und es auch GUIFrame.class gibt:-(

spunti

nein mein script WILL NICHT den Classpath für alle ändern ...
und du SOLLST ALLE jars in deinem Classpath aufnehmen ...

also deine eigenen, die von java und die von SWT
 
OP
S

spunti

Hacker
Man stell ich mich heute blöd an.
Also ich seh jetzt erst, daß du SWTCLASSPATH als eigene Variable bei dir hast. Das hatte ich bis jetzt immer überlesen und das probier ich gleich mal. (Allerdings muß ich dafür ja echt Variablen setzen und dafür gibts wohl leider kein Startparameter wie -cp ?).

Dein schönes Skript hab ich bis jetzt noch nicht ausprobiert, weil ich es ganz einfach nicht nachvollziehen kann. Von Shellprogrammierung hab ich noch gar keine Ahnung. (Und wenn ich es nachvollziehen könnte, würde ich das erst mal per Hand einhämmern, was ich jetzt noch probieren werde.)

spunti
PS: Und eigene jars hab ich noch gar nicht. (Auch wenn ich das zwischenzeitlich schon heimlich probiert hatte.) Aber das wäre dann ja schon wieder eine neue Fehlerquelle und soviel erwarte ich gar nicht vom neuen Jahr.
 

oc2pus

Ultimate Guru
spunti schrieb:
Man stell ich mich heute blöd an.
Also ich seh jetzt erst, daß du SWTCLASSPATH als eigene Variable bei dir hast. Das hatte ich bis jetzt immer überlesen und das probier ich gleich mal. (Allerdings muß ich dafür ja echt Variablen setzen und dafür gibts wohl leider kein Startparameter wie -cp ?).

Dein schönes Skript hab ich bis jetzt noch nicht ausprobiert, weil ich es ganz einfach nicht nachvollziehen kann. Von Shellprogrammierung hab ich noch gar keine Ahnung. (Und wenn ich es nachvollziehen könnte, würde ich das erst mal per Hand einhämmern, was ich jetzt noch probieren werde.)

spunti
PS: Und eigene jars hab ich noch gar nicht. (Auch wenn ich das zwischenzeitlich schon heimlich probiert hatte.) Aber das wäre dann ja schon wieder eine neue Fehlerquelle und soviel erwarte ich gar nicht vom neuen Jahr.

du kannst alle Pfade zu jar-Dateien in eine -cp <pfad1>:<pfad2>:<pfad3> ... schreiben. Aber darunter leidet IMHO die Übersichtlichkeit, deshalb definiere dir pro "logischer" Gruppe eine eigne Variable.

und ich schreibe mir für jedes java-Programm ein eigenes Startscript, nach obigem Schema:
Beispiel für azureus:
Code:
#! /bin/bash
#####################################################
# set paths
#####################################################
LOGFILE=/home/ich/tmp/azureus.log
SWT_LIBS=/opt/eclipse/swt-3
JAVA_LIBS=/opt/Java
# 1.4.2
#JAVA_PROGRAM_DIR=/usr/lib/SunJava2-1.4.2/jre/bin
# 1.5.0
JAVA_PROGRAM_DIR=/usr/bin

#####################################################
# set all jars in classpath
#####################################################
CLASSPATH=""
for FILE in Azureus2; do
        CLASSPATH="$JAVA_LIBS/"$FILE".jar:$CLASSPATH"
done
for FILE in swt swt-pi swt-mozilla; do
        CLASSPATH="$SWT_LIBS/"$FILE".jar:$CLASSPATH"
done

#####################################################
# start Azureus
#####################################################
$JAVA_PROGRAM_DIR/java -cp $CLASSPATH -Djava.library.path="$SWT_LIBS" org.gudy.azureus2.ui.swt.Main "$@" 2> $LOGFILE

as hat den Vorteil das ich für neue JDKs nur an EINER Stelle ändern muss!
 
OP
S

spunti

Hacker
Och, nöö. Jetzt seh ich, daß du beim Aufruf doch alles mit "-cp" aufrufst: "java -cp $CLASSPATH:$SWTCLASSPATH"

Also kann ich das doch gleich alles da reinschreiben...

Wenn es klappt, sag ich nachher noch mal kurz bescheid, ansonsten ist das für meine Nerven heute einfach zu viel und ich probiere morgen weiter.

spunti
 
OP
S

spunti

Hacker
danke, es läuft!

Es lag daran, daß ich anfangs die dateien.jar nicht mit angegeben hatte, sondern nur das Verzeichnis.
Und dann später hatte ich direkt die dateien.jar angegeben, aber das Verzeichnis MUSS auch drinstehen, wenn dort die dateien.class drin sind und nicht in einem jar.

spunti
 
Oben