运行在jar里面打包的exe文件

我通过我的Java程序执行一个exe文件。 java中的path是硬编码的。

我已经把我的exe文件打包成jar了。

但我坚持,因为我有硬编码在java文件中的path名。 所以我不能把我的jar作为一个独立的程序来执行。

任何提示打包这样的jar,即有一个EXE里面,并能够运行它作为一个独立的程序?

谢谢你,Krisp

奇怪的是我必须写今天早上类似的代码…感谢推动我做到这一点:-)

这会将.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(); } } } } 

操作系统不关心或了解.jar文件,因此在执行该文件之前,必须将.exe文件解压缩到某个临时位置。

而其他用户已经正确回答了这个问题,提取并运行然后清理。 还有一点要考虑的是完全原生的。

您已经在使用本机二进制来实现特定的任务。 为什么不创build一个将安装你的应用程序的本地安装程序,并将二进制文件安装到操作系统特定位置(Win32上的Program Files)并创build合适的快捷方式。

这样你的应用程序将会感觉更加本地化,​​意味着你不需要编写或pipe理代码来解决这个问题。 现在Jar看起来像是一个跨平台的代码(Jar运行在任何地方?),但是打包了一个本地二进制文件,它不会在任何地方运行。 这感觉像是一个矛盾。

对于安装程序,我可以推荐Nullsoft安装系统(NSIS),因为他们有很多优秀的教程和代码示例可供学习。

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

使用

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

并复制到磁盘中的另一个文件。

你可以写一个简单的Java程序来使用Runtime.exec()启动exe文件。 然后,您可以将jar的“Main-Class”属性设置为启动器类。 用户然后可以运行你的jar,它会运行该exe文件。