我正在尝试在当前包之外的路径中运行exe文件。我运行它的code.java文件在
中%Workspace_path%\Project\src\main\java\com\util\code.java
然而,exe的目录是
%Workspace_path%\Project\src\main\resources\program.exe
如果可能,似乎这里最好的解决方案是获取项目的绝对路径然后将“src \ main \ resources \”附加到它。有没有一个好方法可以做到这一点还是有替代解决方案? 我正在使用Eclipse,但如果它也可以在其他IDE中使用它会很棒。谢谢你的帮助。
答案 0 :(得分:4)
解决此问题的事实上的方法是将EXE捆绑为类路径资源。看来你已经安排好了。
使用类路径资源时,成熟的程序不应该假定资源在文件系统中。资源可以打包在JAR文件中,甚至打包在WAR文件中。在这一点上,您唯一可以信任的是用Java访问资源的标准方法,如下所示。
解决问题的方法是使用事实上的调用Class.getResourceAsStream
(或ClassLoader.getResourceAsStream
)标准来访问资源内容,将内容保存到临时文件,然后从那个文件。这将保证您的程序无论其包装如何都能正常工作。
换句话说:
getClass().getResourceAsStream("/program.exe")
。在静态方法中,您无法调用getClass
,因此请使用当前类的名称,如MyClass.class.getResourceAsStream
中所示。这会返回InputStream
。File.createTempFile
。这将返回标识新创建文件的File
对象。OutputStream
此临时文件。IOUtils.copy
。完成此步骤后,请不要忘记关闭两个流。换句话说(稍后添加的代码段):
private void executeProgramFromClasspath() throws IOException {
// Open resource stream.
InputStream input = getClass().getResourceAsStream("/program.exe");
if (input == null) {
throw new IllegalStateException("Missing classpath resource.");
}
// Transfer.
OutputStream output = null;
try {
// Create temporary file. May throw IOException.
File temporaryFile = File.createTempFile(getClass().getName(), "");
output = new FileOutputStream(temporaryFile);
output = new BufferedOutputStream(output);
IOUtils.copy(input, output);
} finally {
// Close streams.
IOUtils.closeQuietly(input);
IOUtils.closeQuietly(output);
}
// Execute.
try {
String path = temporaryFile.getAbsolutePath();
ProcessBuilder processBuilder = new ProcessBuilder(path);
Process process = processBuilder.start();
process.waitFor();
} catch (InterruptedException e) {
// Optional catch. Keeps the method signature uncluttered.
throw new IOException(e);
} finally {
// Clean up
if (!temporaryFile.delete()) {
// Log this issue, or throw an error.
}
}
}
答案 1 :(得分:0)
嗯,在您的上下文中,项目根目录恰好是当前路径
即可。强>
,这是java.exe开始执行的地方,所以一个简单的方法是:
String exePath="src\\main\\resources\\program.exe";
File exeFile=new File(".",exePath);
System.out.println(exeFile.getAbusolutePath());
...
我在Eclipse上测试了这段代码,没关系。我认为应该在不同的ide上工作。 祝你好运!