Pergunta

Eu estou executando um exe através do meu programa de java. o caminho é codificado em Java.

eu embalados meu o exe na jarra.

Mas estou preso como eu tenho o nome do caminho codificado no arquivo java. por isso não sou capaz de executar o meu jar como um programa independente.

Quaisquer sugestões para embalagens, tais i.e. frasco tendo um interior e capaz de exe executá-lo como um programa autônomo?

Obrigado, Krisp

Foi útil?

Solução

Curiosamente eu tenho que escrever um código semelhante esta manhã ... obrigado por me empurrando para obter esse feito: -)

Isto irá extrair o .exe em um arquivo local no disco local. O arquivo será excluído quando existe o programa Java.

Editar: Opa, esqueci realmente copiar o arquivo ...

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

Outras dicas

O sistema operacional não se importa ou sabe sobre o arquivo .jar, então você tem que descompactar o arquivo .exe para algum local temporário antes de executá-lo.

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

Enquanto os outros usuários não respondeu a pergunta corretamente, extrair e executar, em seguida, a limpeza. Outro ponto a considerar é que vai totalmente nativa.

Você já está usando um binário nativo para alcançar uma tarefa específica. Por que não também criar um instalador nativo que irá instalar o aplicativo e instalar o binário para o local OS específico (Arquivos de Programas do Win32) e criar atalhos adequadas.

Desta forma, sua aplicação vai se sentir mais nativo e significa que você não precisa para escrever ou gerencia código para obter em torno deste fato. No momento em que os olhares Jar como um pedaço de plataforma cruzada de código (Jar é executado em qualquer lugar certo?), Mas embala um binário nativo que não será executado em todos os lugares. Isto parece uma contradição.

Para os instaladores posso recomendar Nullsoft Instalação do Sistema (INE) como eles têm muitos excelentes tutoriais e exemplos de código para aprender.

Use

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

e copiar para outro arquivo no disco.

Você poderia escrever um programa java simples para lançar o exe usando Runtime.exec (). Você poderia, então, definir o atributo "Main-Class" do frasco para ser essa classe lançador. Os usuários podem então executar o seu jar e seria executar o exe.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top