запустить exe, который упакован внутри банки - PullRequest
22 голосов
/ 01 марта 2009

Я выполняю exe через мою Java-программу. путь жестко закодирован в Java.

Я упаковал свой exe в банку.

Но я застрял, так как у меня есть имя пути жестко закодировано в файле Java. поэтому я не могу выполнить мой файл как отдельную программу.

Любые советы по упаковке такой банки, т. Е. Наличие exe внутри и возможность запустить его как отдельную программу?

Спасибо, Krisp

Ответы [ 6 ]

33 голосов
/ 01 марта 2009

Как ни странно, сегодня утром я должен написать похожий код ... спасибо, что подтолкнул меня к выполнению этого: -)

Это извлечет .exe в локальный файл на локальном диске. Файл будет удален, когда программа на Java существует.

Редактировать: Упс, забыл на самом деле скопировать файл ...

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();
            }
        }
    }
}
11 голосов
/ 01 марта 2009

Операционная система не заботится о файле .jar и не знает о нем, поэтому вам придется распаковать файл .exe во временное местоположение, прежде чем запускать его.

4 голосов
/ 04 апреля 2016
//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();
3 голосов
/ 07 сентября 2011

Пока другие пользователи правильно ответили на вопрос, распакуйте и выполните очистку. Еще один момент, который нужно учитывать, - это полностью родной язык.

Вы уже используете собственный двоичный файл для выполнения конкретной задачи. Почему бы не создать собственный установщик, который установит ваше приложение, установить двоичный файл в определенное место ОС (Program Files на Win32) и создать подходящие ярлыки.

Таким образом, ваше приложение будет выглядеть более естественным и означает, что вам не нужно писать или управлять кодом, чтобы обойти этот факт. На данный момент Jar выглядит как кроссплатформенный кусок кода (Jar работает где-нибудь правильно?), Но упаковывает собственный двоичный файл, который не будет работать везде. Это похоже на противоречие.

Для инсталляторов я могу порекомендовать Nullsoft Installation System (NSIS), так как у них много отличных учебных пособий и примеров кода для изучения.

2 голосов
/ 08 февраля 2013

Используйте

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

и скопируйте в другой файл на диске.

0 голосов
/ 01 марта 2009

Вы можете написать простую Java-программу для запуска exe-файла, используя Runtime.exec (). Затем вы можете установить атрибут «Main-Class» jar в качестве этого класса запуска. Пользователи могут запустить ваш jar, и он запустит exe.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...