SWT in JAR-File

zerix

Hausmeister
Moderator
Hallo,
hab mal noch ne Frage. Ich hab schon öfter mal was in SWT geschrieben. Man braucht ja um die Programme auszuführen die SWt.jar und eine DLL-Datei.
Kann ich die in mein JAR-File mit einbauen, dass man die auf einem anderen Rechner nicht installiert haben muss
 
Hallo!

AFAIK ist es notwendig die SWT dll aus dem Jar File vor dem Zugriff auf SWT Routinen zu entpacken. Das kannst du ja in der main Methode z.Bsp. vor Initialisierung der Shell erledigen. Entweder kopierst du die SWTxxxx.dll ins WINNT/System32 oder ins "aktuelle" (das Verzeichnis in dem dein jar liegt) Verzeichnis. Kurz vor beenden der Anwendung könntest du die DLL dann löschen (z.Bsp. per ShutdownHook ...)

Gruß Tom
 
Das ist ne gute Idee..
Wie sieht es denn mit der SWT.jar aus? Ich hatte mal die Source-Codes entpackt und wollte die dann so in mein Prog implementieren, aber da hatte eclipse eine Menge Fehler markiert, deshalb konnte ich da das Prog nicht kompilieren. Wie kann man das denn machen
 
Hallo!

In diesem Beispiel wurde die SWT DLL im Root eines Jar-Files mit dem Namen example.jar abgelegt. Weiterhin befindet sich die Klasse SWTExample im Jar. Im Verzeichnis des jars existiert ein Unterverzeichnis namens lib welches das aus der Eclipse-Installation stammende swt.jar enthält.

Code:
/*
 * Created on 06.06.2005@13:46:36
 *
 * TODO Some Licence info...
 */
package de.tutorials;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;

import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

/**
 * @author TDarimont
 * 
 * TODO Explain me
 */
public class SWTExample {

    public static void main(String[] args) throws Exception {
        final String SWT_DLL_FILENAME = "swt-win32-3063.dll";
        final File file = new File(SWT_DLL_FILENAME);
        
        //Gibts die SWT DLL schon in unserem aktuellen Verzeichnis?
        if (!file.exists()) {
            //Wenn nein, entpacke sie aus dem jar ins aktuelle Verzeichnis
            InputStream is = SWTExample.class.getClassLoader()
                    .getResourceAsStream(SWT_DLL_FILENAME);

            FileOutputStream fos = new FileOutputStream(file);
            byte[] buffer = new byte[1024];
            int len = 0;

            while ((len = is.read(buffer)) >= 0) {
                fos.write(buffer, 0, len);
            }
            is.close();
            fos.flush();
            fos.close();
        }

        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setText("SWTExample");
        shell.open();

        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        
        //Trying to delete swt-lib...
        file.delete();
        
        //Oder
//        Runtime.getRuntime().addShutdownHook(new Thread(){
//           public void run(){
//               file.delete();
//           }
//        });
    }
}

Das dazugehörige Manifest.mf File plaziert man innerhalb eines META-INF Verzeichnisses innerhalb des jar Files.

Code:
Manifest-Version: 1.0
Main-Class: de.tutorials.SWTExample
Class-Path: lib/swt.jar

Anschließend kann man über das Kommando:
java -jar example.jar
das Beispiel ausführen.
Bei Bedarf wird dann die swtxxxx.dll aus dem Jar entpackt und ins aktuelle Verzeichnis gelegt.
Wird die Anwendung beendet wird versucht die dll zu löschen. Leider scheint die DLL nicht schnell genug von dem Prozess freigegeben zu werden so dass diese (zumindest bei mir nicht) gelöscht werden kann....

Gruß Tom
 
Irgendwie bin zu blöd dafür :)

Ich hab das bei meiner Klasse gemacht, ging nicht.
Dann hab ich deinen Code kopiert, ging nicht.
Das ist die Fehler-Meldung die kommt, wenn ich deinen Quelltext nehme:

Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/swt/widgets/Display
at SWTExample.main(SWTExample.java:43)
 
Hallo!

Bsp:
Das example.jar liegt im Verzeichnis c:\swt-example
dann muss das swtxxxx.jar (aus dem eclipse Plugins Verzeichnis) im Verzeichnis c:\swt-example\lib liegen.

Anschließend kann man das eample.jar entweder per Doppelklick oder per
java -jar example.jar vom Verzeichnis c:\swt-example aus starten.

Damit das ganze funktioniert muss (wie bereits geschrieben) das (angegebene) Manifest.mf File innerhalb des example.jars im Verzeichnis META-INF liegen.

Gruß Tom
 
*grml* hatte dich missverstanden
Ich hatte verstanden, dass in dem Jar-Archiv ein Ordner Namens lib sein muss, in dem dann das Jar-File ist. Dann kann das ja auch nicht funktionieren.

Danke für deine Mühe ;)
 
Zurück