eseguire exe che è impacchettato all'interno del vaso
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
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.