Domanda

Sto eseguendo un exe attraverso il mio programma Java. il percorso è hardcoded in java.

Ho confezionato il mio exe nel barattolo.

Ma sono bloccato perché ho il nome del percorso hardcoded nel file java. quindi non sono in grado di eseguire il mio vaso come programma autonomo.

Eventuali suggerimenti per il confezionamento di questo barattolo, ovvero avere un ex all'interno e in grado di farlo eseguirlo come programma autonomo?

Grazie, Krisp

È stato utile?

Soluzione

Stranamente devo scrivere un codice simile stamattina ... grazie per avermi spinto a farlo :-)

Questo estrarrà .exe in un file locale sul disco locale. Il file verrà eliminato quando esiste il programma Java.

Modifica: Whoops, ho dimenticato di copiare il file ...

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();
            }
        }
    }
}

Altri suggerimenti

Il sistema operativo non si interessa o non conosce il file .jar, quindi dovrai decomprimere il file .exe in un percorso temporaneo prima di eseguirlo.

//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();

Mentre gli altri utenti hanno risposto correttamente alla domanda, estrarre ed eseguire quindi ripulire. Un altro punto da considerare sta diventando completamente nativo.

Stai già utilizzando un file binario nativo per realizzare un'attività specifica. Perché non creare anche un programma di installazione nativo che installerà l'applicazione e installerà il binario nella posizione specifica del sistema operativo (Programmi su Win32) e creerà scorciatoie adatte.

In questo modo l'applicazione sembrerà più nativa e significa che non è necessario scrivere o gestire il codice per aggirare questo fatto. Al momento il Jar sembra un pezzo di codice multipiattaforma (Jar funziona ovunque, vero?) Ma racchiude un binario nativo che non funzionerà ovunque. Sembra una contraddizione.

Per gli installatori posso consigliare Nullsoft Installation System (NSIS) in quanto hanno molti tutorial eccellenti ed esempi di codice da cui imparare.

Usa

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

e copia su un altro file nel disco.

Potresti scrivere un semplice programma java per avviare l'exe usando Runtime.exec (). Puoi quindi impostare la "Classe principale" attributo del vaso per essere quella classe di avvio. Gli utenti potrebbero quindi eseguire il tuo jar e questo eseguirà l'exe.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top