eseguire exe che è impacchettato all’interno del barattolo

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

Ho impacchettato il mio exe nel barattolo.

Ma sono bloccato come ho il nome del percorso hardcoded nel file java. quindi non sono in grado di eseguire il mio jar come programma stand alone.

Qualche suggerimento per confezionare un jar simile ad un exe all’interno e in grado di eseguirlo come programma stand alone?

Grazie, Krisp

Stranamente devo scrivere un codice simile stamattina … grazie per avermi spinto a farlo 🙂

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

Modifica: Whoops, dimenticato in realtà 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(); } } } } 

Il sistema operativo non si cura o non conosce il file .jar, quindi dovrai decomprimere il file .exe in una posizione temporanea 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 la pulizia. Un altro punto da considerare sta diventando completamente nativo.

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

In questo modo la tua applicazione si sentirà 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?) Ma contiene un binario nativo che non verrà eseguito ovunque. Questo sembra una contraddizione.

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

Uso

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

e copiare su un altro file nel disco.

Potresti scrivere un semplice programma java per avviare l’exe usando Runtime.exec (). È quindi ansible impostare l’attributo “Main-Class” del jar come class di avvio. Gli utenti potrebbero quindi eseguire il tuo jar e questo eseguirà l’exe.