Question

J'exécute un exe via mon programme java. le chemin est codé en java.

J'ai emballé mon exe dans le bocal.

Mais je suis coincé car j'ai le nom du chemin codé en dur dans le fichier java. donc je ne suis pas capable d'exécuter mon pot comme un programme autonome.

Toute astuce pour emballer un tel pot, c’est-à-dire avoir un exe à l’intérieur et l'exécuter en tant que programme autonome?

Merci, Krisp

Était-ce utile?

La solution

Étrangement, je dois écrire un code similaire ce matin ... merci de m'avoir poussé à le faire: -)

Ceci extraira le .exe dans un fichier local sur le disque local. Le fichier sera supprimé lorsque le programme Java existe.

Édition: Oups, j'ai oublié de copier le fichier ...

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

Autres conseils

Le système d'exploitation ne se soucie pas du fichier .jar et ne le connaît pas. Vous devrez donc décompresser le fichier .exe dans un emplacement temporaire avant de l'exécuter.

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

Alors que les autres utilisateurs ont répondu correctement à la question, extrayez-le puis exécutez le nettoyage. Un autre point à considérer est de devenir totalement natif.

Vous utilisez déjà un binaire natif pour réaliser une tâche spécifique. Pourquoi ne pas également créer un programme d’installation natif qui installera votre application, installez le binaire à l’emplacement spécifique du système d’exploitation (Program Files on Win32) et créez les raccourcis appropriés.

De cette manière, votre application se sentira plus native et signifiera que vous n’avez pas besoin d’écrire ou de gérer du code pour contourner ce fait. Pour le moment, le fichier Jar ressemble à un morceau de code multi-plateforme (le fichier Jar fonctionne partout, n'est-ce pas?), Mais contient un fichier binaire natif qui ne s'exécutera pas partout. Cela ressemble à une contradiction.

Pour les installateurs, je peux recommander le système d’installation Nullsoft (NSIS) car ils disposent de nombreux excellents tutoriels et exemples de code.

Utiliser

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

et copiez-le dans un autre fichier du disque.

Vous pourriez écrire un programme Java simple pour lancer le fichier .exe à l’aide de Runtime.exec (). Vous pouvez ensuite définir la & Main; classe principale " attribut du pot à être cette classe de lanceur. Les utilisateurs peuvent ensuite exécuter votre fichier jar et le programme exe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top