Frage

ich eine exe durch mein Java-Programm am ausführen. der Weg ist in Java fest einprogrammiert.

Ich habe meine die exe in das Glas verpackt.

Aber stecken ist, wie ich die Pfadnamen in der Java-Datei fest einprogrammiert habe. so ist nicht in der Lage meines Glas als eigenständiges Programm ausführen.

Für Hinweise zur Verpackung solchen jar d.h mit einer exe innen und in der Lage führen Sie es als Stand-alone-Programm?

Danke, Krisp

War es hilfreich?

Lösung

Seltsamer ich heute morgen einen ähnlichen Code schreiben ... Danke für mich drückt das getan zu bekommen: -)

Dies wird den .exe in einer lokalen Datei auf der lokalen Festplatte extrahieren. Die Datei wird gelöscht, wenn das Java-Programm vorhanden ist.

Edit: Whoops, vergaß die Datei tatsächlich kopieren ...

import java.io.Closeable;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.security.CodeSource;
import java.security.ProtectionDomain;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;

public class Main
{
    public static void main(final String[] args)
        throws URISyntaxException,
               ZipException,
               IOException
    {
        final URI uri;
        final URI exe;

        uri = getJarURI();
        exe = getFile(uri, "Main.class");
        System.out.println(exe);
    }

    private static URI getJarURI()
        throws URISyntaxException
    {
        final ProtectionDomain domain;
        final CodeSource       source;
        final URL              url;
        final URI              uri;

        domain = Main.class.getProtectionDomain();
        source = domain.getCodeSource();
        url    = source.getLocation();
        uri    = url.toURI();

        return (uri);
    }

    private static URI getFile(final URI    where,
                               final String fileName)
        throws ZipException,
               IOException
    {
        final File location;
        final URI  fileURI;

        location = new File(where);

        // not in a JAR, just return the path on disk
        if(location.isDirectory())
        {
            fileURI = URI.create(where.toString() + fileName);
        }
        else
        {
            final ZipFile zipFile;

            zipFile = new ZipFile(location);

            try
            {
                fileURI = extract(zipFile, fileName);
            }
            finally
            {
                zipFile.close();
            }
        }

        return (fileURI);
    }

    private static URI extract(final ZipFile zipFile,
                               final String  fileName)
        throws IOException
    {
        final File         tempFile;
        final ZipEntry     entry;
        final InputStream  zipStream;
        OutputStream       fileStream;

        tempFile = File.createTempFile(fileName, Long.toString(System.currentTimeMillis()));
        tempFile.deleteOnExit();
        entry    = zipFile.getEntry(fileName);

        if(entry == null)
        {
            throw new FileNotFoundException("cannot find file: " + fileName + " in archive: " + zipFile.getName());
        }

        zipStream  = zipFile.getInputStream(entry);
        fileStream = null;

        try
        {
            final byte[] buf;
            int          i;

            fileStream = new FileOutputStream(tempFile);
            buf        = new byte[1024];
            i          = 0;

            while((i = zipStream.read(buf)) != -1)
            {
                fileStream.write(buf, 0, i);
            }
        }
        finally
        {
            close(zipStream);
            close(fileStream);
        }

        return (tempFile.toURI());
    }

    private static void close(final Closeable stream)
    {
        if(stream != null)
        {
            try
            {
                stream.close();
            }
            catch(final IOException ex)
            {
                ex.printStackTrace();
            }
        }
    }
}

Andere Tipps

Das Betriebssystem kümmert sich nicht oder kennen .jar-Datei, so dass Sie die .exe Datei an einem temporären Speicherort werden müssen entpacken, bevor Sie es ausführen.

//gets program.exe from inside the JAR file as an input stream
InputStream is = getClass().getResource("program.exe").openStream();
//sets the output stream to a system folder
OutputStream os = new FileOutputStream("program.exe");

//2048 here is just my preference
byte[] b = new byte[2048];
int length;

while ((length = is.read(b)) != -1) {
    os.write(b, 0, length);
}

is.close();
os.close();

Während die anderen Benutzer die Frage richtig beantwortet haben, extrahieren und laufen dann Bereinigung. Ein weiterer Punkt ist, geht vollständig heimisch.

Sie sind bereits mit einer nativen binären eine bestimmte Aufgabe zu erreichen. Warum auch nicht eine native Installer erstellen, die Ihre Anwendung installieren, und installieren Sie das binäre auf die OS-spezifische Position (Program Files auf Win32) und geeignete Verknüpfungen erstellen.

Auf diese Weise Ihre Anwendung mehr nativer fühlen und bedeutet, dass Sie brauchen, um Code nicht zu schreiben oder zu verwalten um diese Tatsache zu bekommen. Im Moment sieht das Glas wie ein Cross-Plattform-Stück Code (Jar läuft überall richtig?), Sondern packt eine native binäre, die nicht überall laufen. Das fühlt sich an wie ein Widerspruch.

Für Installateure kann ich Nullsoft Installation System empfehlen (NSIS), wie sie von vielen ausgezeichnet Tutorials und Code-Beispiele zu lernen.

Mit

getClass().getResource(what).openStream()

und in der Platte auf eine andere Datei kopieren.

Sie können ein einfaches Java-Programm schreiben, die exe mit Runtime.exec () zu starten. Sie könnten dann die „Main-Class“ -Attribut des Glases eingestellt, dass Launcher Klasse. Nutzer könnten dann Glas laufen und es würde die exe ausgeführt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top