jar-File mit SWT - Exception

zzhat

Grünschnabel
Hallo,
Ich habe aus meinem Projekt ein via Ant eine jar Datei erstellt und zusammen mit einem Verzeichnis "lib"
wo ich die extra benötigten jars kopiert habe zu einem Zip verpackt.

Soweit so gut.
jedoch wenn ich das jar-File ausführe, bekomme ich die Meldung:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no swt-pi-gtk-3138 in java.library.path

und das leuchtet mir nicht ein. Unter Eclipse hat die Anwendung einwandfrei funktioniert.
Ich habe dort nicht mal dieses "-Djava.library.path=" angeben müssen.

Kann mir da vielleicht jemand weiterhelfen?
Vielen Dank
ZZHAT
 
Hast du beim Ausführen des Jars jetzt den library path gesetzt oder nicht?
In Eclipse wird er (anscheinend) implizit für alle Konfigurationen der Gruppe "SWT Application" gesetzt (Run -> Run).
 
Ich habe in meiner Manifest zumindest die benötigten jars eingetragen.

Manifest-Version: 1.0
Class-Path: . lib/org.eclipse.jface_3.1.0.jar lib/org.eclipse.swt.gtk.linux.x86_3.1.0.jar lib/postgresql-8.0-312.jdbc3.jar lib/org.eclipse.swt_3.1.0.jar
Main-Class: de.xyz.main.XYZ


Und die Strukture, wenn ich das zip auspacke ist:

-|---XYZ.jar
|---lib\
|-- *.jar


//EDIT:
Ich habe jetzt einfach mal um zu sehen, ob sich die Exception ändert das lib-Verzeichnis umbenannt. Die Exception ist tatsächlich eine andere.

java.lang.NoClassDefFoundError: org/eclipse/swt/widgets/Display

Dies ziegt mir, dass er schon darauf zugreift jedoch es da ein Problem noch gibt.
Nur ich komme nicht dahinter was das Prob sein könnte.
 
Zuletzt bearbeitet:
Also in der Manifest hast du lib/ als Prefix, dann änderst du den Namen nur im filesystem und erwartest dass noch irgendwas funktioniert?!

der NoClassDefFoundError wird VOR dem laden der bibliothek geworfen!

Du musst den Classpath so setzen, dass der Java Interpreter alle Referenzen auf Klassen auflösen kann, beim Ausführen versucht der Code, die Plattformbibliotheken zu laden:

Code:
package org.eclipse.swt.internal.gtk;
 
import org.eclipse.swt.internal.*;

public class OS extends Platform {
	static {
		Library.loadLibrary("swt-pi");
	}
Das versucht, die Bibliothek libswt-pi-<TOOLKIT>-<VERSION> zu laden

Ein Aufruf eines kleinen SWT beispiels aus der Shell heraus sieht bei mir so aus:
java -cp /opt/eclipse/plugins/org.eclipse.swt_3.1.0.jar:/opt/eclipse/plugins/org.eclipse.swt.gtk.linux.x86_3.1.0.jar:bin/ -Djava.library.path=/opt/eclipse/configuration/org.eclipse.osgi/bundles/75/1/.cp/ main.TransparentShell

Den classpath hast du ja im Manifest, also fehlt nur der korrekt gesetzte library path.

hth
 
hi evil_morpheus,
vielen Dank für den Link.er hat mir damit den letzten Schliff gegeben um das Programm ausführen zu können.
Entscheiden war für mich beim dem link der Post "Post from Peter Manahan explaining how SWT can be accessed in a non-Eclipse batch script".

Zuerst habe ich aber mich die SWT-Files seperat von eclips.org down geladen und dann die swt.jar in mein lib-Verzeichnis kopiert. die einzelnen lib*.so habe ich ebenfalls in mein lib-Verzeichnis kopiert.

Dann meine MANIFEST.MF Datei angepasst. Sieht jetzt so aus:
Manifest-Version: 1.0
Sealed: false
Class-Path: . lib/org.eclipse.jface_3.1.0.jar lib/swt.jar lib/postgresql-8.0-312.jdbc3.jar
Main-Class: de.xyz.main.XYZ


Dann habe ich mit Ant mein Projekt ins jar und dann mit meinem lib-verzeichnis erstellen lassen. Meine built.xml sieht so aus:

HTML:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE project [<!ENTITY buildfile SYSTEM "file:./build-user.xml">]>
<!-- WARNING: Eclipse autogenerated file. 
              Any modifications will be overwritten.
              Please edit build-user.xml instead.
-->
<project name="project_name" default=".">
    <property name="project_name.location" value="/home/Path/zum/Projekt/project_name"/>
    <path id="compile.classpath">
    	<pathelement path="bin" />
    </path>
    <target name="compile">
        <javac srcdir="src" destdir="bin">
            <classpath refid="compile.classpath"/>
        </javac>
    </target>
	  <target name="." depends="compile">
	    <delete file="XYZ.jar"/>
	    <delete file="XYZ.zip"/>
	    <mkdir dir="dist" />
	    <jar jarfile="XYZ.jar"
	         basedir="bin"
	         manifest="META-INF/MANIFEST.MF" />
	    <zip destfile="XYZ.zip">
	      <fileset dir="." includes="lib/*" />
	      <fileset dir="." includes="XYZ.jar" />
	    </zip>
	  </target>
</project>

Dann habe ich mir ein Vereichnis erstellt, wo ich die Anwendung haben wollte.
z.B. /home/meinVerzeichnis/swtApp

Dorthinein habe ich meine Zip-Datei entpackt. Nun kam der Link ins Spiel.
Ich habe mich dazu entschlosen, eine Shell-Datei zu erstellen, in der ich dann einen Export zu meinem Lib-Verzeichnis vormulierte .. wie beschrieben. Damit Java dann auch weiss wo die lib*.so Dateien zu finden sind, die er benötigt.

Meine runnit.sh sieht so aus:
export XYZ_HOME= /home/meinVerzeichnis/swtApp/lib
export LD_LIBRARY_PATH=${XYZ_HOME}:${LD_LIBRARY_PATH:-/usr/lib:/lib}

java -jar XYZ.jar


Tja. und nuh funktioniert es auch so, wie es soll. Die Anwendung startet und ich kan darin arbeiten.

Vielen Dank und vielleicht hilft die Anleitung auch anderen.
ZZHAT


//EDIT:
Hi kabel2,
wenn man das zu ersten mal macht ist einem nicht ganz klar, was man eigentlich machen soll. Erstrecht, wenn es über 100 verschiedenne Version im Internet gibt. *g*

Aber stimmt schon, mir fehlte der Path, wo er die lib*.so findet.
 
Zuletzt bearbeitet:
zzhat hat gesagt.:
hi evil_morpheus,
vielen Dank für den Link.er hat mir damit den letzten Schliff gegeben um das Programm ausführen zu können.

...

Tja. und nuh funktioniert es auch so, wie es soll. Die Anwendung startet und ich kan darin arbeiten.

Vielen Dank und vielleicht hilft die Anleitung auch anderen.
ZZHAT

Hi zzhat!

Freut mich, dass es geklappt hat. Hatte das Problem auch schon, dass eine SWT-Applikation nicht so ohne Weiteres außerhalb der Eclipse-Umgebung läuft.

Hoffe auch, dass der Link noch anderen nützt.

Cya
 
Zurück