Java:获取项目的绝对路径
我试图在当前包之外的路径中运行exe文件。运行它我code.java文件是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中使用,它也会很棒。谢谢你的帮助。
解决此问题的实际方法是将EXE捆绑为类路径资源。看来你已经安排好了。
使用类路径资源时,成熟的程序不应该假定资源在文件系统中。这些资源可以打包在一个JAR文件中,甚至是一个WAR文件中。在这一点上,您唯一可以信任的就是访问Java中资源的标准方法,如下所示。
然后,解决问题的方法是使用调用Class.getResourceAsStream
(或ClassLoader.getResourceAsStream
)的事实标准访问资源内容,将内容保存到临时文件,然后从该文件执行。这将保证您的程序无论其包装如何正常工作。
换句话说:
- 调用
getClass().getResourceAsStream("/program.exe")
。从静态方法中,不能调用getClass
,所以请使用当前类的名称,如MyClass.class.getResourceAsStream
。这将返回一个InputStream
。 - 创建一个临时文件,最好使用
File.createTempFile
。这将返回一个标识新创建文件的对象File
。 - 打开一个
OutputStream
到这个临时文件。 - 使用这两个流将资源中的数据复制到临时文件中。如果您使用Apache Commons工具,则可以使用
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.
}
}
}
注意:原始代码片段有一个错误。如果无法创建临时文件,则“InputStream”未关闭。这是固定的。 – 2013-03-26 02:23:49
谢谢,作品像魅力! – roverred 2013-03-26 04:41:03
那么,在你的情况下,该项目的根恰好是电流通路
。
,那就是当java.exe的开始执行,所以一个简单的方法是:
String exePath="src\\main\\resources\\program.exe";
File exeFile=new File(".",exePath);
System.out.println(exeFile.getAbusolutePath());
...
我测试此代码Eclipse的,这没关系。我认为应该在不同的IDE上工作。 祝你好运!
你的类路径是什么样的? – Farlan 2013-03-25 02:03:19
%Workspace_path%\ Project \ src \ target \ classes 我想我可以从类路径中找到“src”,然后附加“main \ resources \” – roverred 2013-03-25 02:12:41