proyecto hacer empaquetar ejecutar ejecuta desde como archivos archivo abrir java jar

hacer - ejecutar java



ejecutar exe que está empaquetado dentro de jarra (6)

Estoy ejecutando un exe a través de mi programa java. El camino está codificado en java.

He empaquetado mi exe en el frasco.

Pero estoy atascado ya que tengo el nombre de ruta codificado en el archivo java. así que no puedo ejecutar mi jarra como un programa independiente.

¿Alguna sugerencia para empaquetar tal jarra, es decir, tener un archivo ejecutable dentro y poder ejecutarlo como un programa independiente?

Gracias krisp


El sistema operativo no le importa o no conoce el archivo .jar, por lo que tendrá que descomprimir el archivo .exe en una ubicación temporal antes de ejecutarlo.


Mientras que los otros usuarios han respondido la pregunta correctamente, extraiga y ejecute la limpieza. Otro punto a considerar es ir completamente nativo.

Ya estás utilizando un binario nativo para lograr una tarea específica. También puede crear un instalador nativo que instale su aplicación e instalar el binario en la ubicación específica del sistema operativo (Archivos de programa en Win32) y crear accesos directos adecuados.

De esta manera, su aplicación se sentirá más nativa y significa que no necesita escribir ni administrar código para evitar este hecho. En este momento, el Jar parece una pieza de código multiplataforma (Jar se ejecuta en cualquier lugar, ¿no?), Pero contiene un binario nativo que no se ejecutará en todas partes. Esto se siente como una contradicción.

Para los instaladores, puedo recomendar el Sistema de instalación de Nullsoft (NSIS) ya que tienen excelentes tutoriales y ejemplos de código para aprender.


Podría escribir un programa Java simple para iniciar el archivo ejecutable utilizando Runtime.exec (). A continuación, puede configurar el atributo "Clase principal" del archivo jar para que sea esa clase de iniciador. Los usuarios podrían ejecutar su jar y ejecutaría el exe.


Por extraño que parezca, tengo que escribir un código similar esta mañana ... gracias por insistirme en que lo haga :-)

Esto extraerá el .exe a un archivo local en el disco local. El archivo se eliminará cuando exista el programa Java.

Edit: Whoops, olvidé realmente copiar el archivo ...

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


Utilizar

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

y copiar a otro archivo en el disco.


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