我做了一个简单的实用程序。 其中我有一个exe文件要运行。 我用它来运行它:
Runtime.getRuntime().exec(this.getClass().getResource("filename.exe").getPath());
当我从ide(Netbeans)运行程序时,我工作得很好。
但是当我尝试使用上面的命令运行exe文件后(即从build立的jar),它根本不工作。
我也试过运行这个:
Desktop.getDesktop().open(new File("filename.exe"))
但没有再次使用。
请帮忙
尝试用一个用例,发现getResource搜索路径“file:/path/to/thejar.jar!filename.exe”,并无法使用该jar内的exe文件。
尝试修改类路径,但失败了。
提到spring的策略,它读取jar中的URL配置文件,我认为解决方案可以是:
使用getResourceAsStream获取InputStream
使用ImputStream将jar内的exe表单复制到临时文件中
运行位于jar外的temp exe文件。
这工作(确定当编译到jar,但在IDE中的NOK,因为“getResource”在不同的地方搜索):
package me.mren.loadresource; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; public class Runner { /** * @param args */ public static void main(String[] args) { try { String filename = "/resources/filename.exe"; System.out.println(Runner.class.getResource(filename)); InputStream fi = Runner.class.getResourceAsStream(filename); File temp = File.createTempFile("temp_exe", ""); System.out.println(temp.getPath()); OutputStream fo = new FileOutputStream(temp); byte[] b = new byte[1024]; int count = 0; while ((count = fi.read(b)) != -1) { fo.write(b, 0, count); } fi.close(); fo.close(); System.out.println(temp.canExecute()); Runtime.getRuntime().exec(temp.getPath()); } catch (Exception e) { e.printStackTrace(); } } }
项目的文件结构:
C:\USERS\REN MIN\DEV ENV\JAVA\WORKSPACE\LOADRESOURCE │ .classpath │ .project │ pom.xml │ ├─.settings │ org.eclipse.jdt.core.prefs │ org.eclipse.m2e.core.prefs │ ├─src │ ├─main │ │ ├─java │ │ │ └─me │ │ │ └─mren │ │ │ └─loadresource │ │ │ Runner.java │ │ │ │ │ └─resources │ │ filename.exe │ │ │ └─test │ ├─java │ └─resources └─target │ loadresource-0.0.1-SNAPSHOT.jar │ ├─classes │ │ filename.exe │ │ │ └─me │ └─mren │ └─loadresource │ Runner.class │ ├─maven-archiver │ pom.properties │ ├─surefire └─test-classes
jar里面的文件结构:
E:\TEST\RESULT │ .classpath │ .project │ pom.xml │ ├─me │ └─mren │ └─loadresource │ Runner.class │ ├─META-INF │ MANIFEST.MF │ └─resources filename.exe