# SWT java.lang.NoClassDefFoundError:



## tm001 (6. Mai 2006)

Ich habe mit Eclipse ein SWT Programm geschrieben. Es läuft auch problemlos in Eclipse. 

Damit es auch außerhalb von Eclipse läuft, habe ich über die Export-Funktion eine build.xml erzeugt. Anschließend hat Ant die Dateien erfolgreich kompliert. Wenn ich die nun die Starter-Klasse mit 

```
java StartKlasse
```
 aufrufe, bekomme ich die Meldung:


```
Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/swt/widgets/Layout
```

Woran könnte es liegen? Es müsste doch eigentlich reichen, wenn der Pfad zum swt.jar in der build.xml steht?


```
...
<property name="org.eclipse.swt.location" value="C:/Dokumente und Einstellungen/Thomas/Eigene Dateien/Eclipse Projekte/org.eclipse.swt"/>
...
<path id="org.eclipse.swt.classpath">
        <pathelement location="${org.eclipse.swt.location}/."/>
        <pathelement location="${org.eclipse.swt.location}/swt.jar"/>
    </path>
```


----------



## thE_29 (8. Mai 2006)

Wenn er es kompilieren kann, hat das nix damit zum tun, ob er die externen Libs auch in dein neues Jar File hängt!


Compilieren in Eclipse (im classpath sind die externen SWT.jars)

Compilieren/erstellen mit ant (im xml File sind die externen SWT.jars angegeben


Jar Datei laufen lassen (nirgends ist wo das SWT.jar angegeben)

Und das is das Prob!

Entweder du hängst es in den Classpath oder du hängst die 2 Jars in eines! (bsp findest in den FAQ bei Jar Dateien ineinader packen)

oder aber auch Illuvatar hat einen Jar Create geschrieben, der eigentlich recht gut läuft (glaube ich)

Ich mache nix über ant, deswegen kann ich dir net sagen, ob man über ANT auch sagen kann das er dir die jar datei mit reinpackt!


----------



## SamHotte (8. Mai 2006)

Möglicherweise musst du auch noch der JVM den Library-Path sagen, bspw. über den Aufruf in einer Batch-Datei:

```
javaw -Djava.library.path=. -cp swt.jar;. MeineMainKlasse
```


----------



## tm001 (8. Mai 2006)

muss ich erst ein .jar file erstellen? 

ich hab jetzt mal auf der kommandozeile kompiliert: 


```
javac -cp ../org.eclipse.swt/swt.jar MeineKlasse.java
```

Dann müsste er doch die Datei swt.jar mit "reinkompilieren" oder nicht? Denk ich mir mal so... Immerhin findet er ja die Klassen (wenn ich den Klassen-Pfad falsch schreibe, meckert der Kompiler). Und in eclipse läuft auch alles...

Doch der Aufruf der Klasse schlägt wie oben fehl. 

Vielleicht ist der Fehler ja auch ganz dumm, keine Ahnung...


----------



## thE_29 (9. Mai 2006)

Er kompiliert es aber nicht mit rein!

Dann wäre die Sinnhaftigkeit von Librarys ja nicht gegeben!

Libs sind dafür da, das sie aussenstehend wo rumliegen.

Dh, man kann die Libs dann ändern, ohne das Programm zu ändern. (siehe java allg. die ganzen java imports wie javax.swing.* oder dgl, werden ja auch net mit reinkompiliert, nur liegen die halt im standard classpath und deswegen werden sie auch gefunden!)

Er benutzt beim kompilieren jetzt die Klassen die du mitangegeben hast!

javac -cp swt.jar MeineKlasse.java

java -cp swt.jar;.\ MeineKlasse

Dann sollte es gehen!


Er kompiliert immer nur das was du hinten angibst (also Klasse.java)

Dadurch entsteht eben eine Klasse.class was aber nur der übersetzte Code von Klasse ist und net alle Abhängigkeiten wurden mitreinkompiliert (sonst hättest ja zB den kompletten Java Stamm auch drinnen?!?)


Dafür gibt es ja die Jars wo man mehere .class Dateien zusammenfügen!


----------



## tm001 (9. Mai 2006)

Wunderbar das klappt! Vielen Dank für eure Hilfe

Vielleicht noch als Ergänzung für andere, die mit SWT rumprobieren und Probleme haben:

ich habe das swt.jar ins Projektverzeichnis kopiert, dann die Klasse kompiliert und ausgeführt, wie tHE_29 geschrieben hat:

```
javac -cp swt.jar MeineKlasse.java

java -cp swt.jar;.\ MeineKlasse
```

habe dann allerdings einen fehler bekommen:

```
Exception in thread "main" java.lang.UnsatisfiedLinkError: no swt-win32-3139 in
java.library.path
```

Nach einigem Suchen im Forum hab ich die Lösung gefunden: Man muss die swt-win32-3139.dll in den Projektordner kopieren.

Thomas


----------

