Java:获得项目的绝对路径 [英] Java: get absolute path of project
问题描述
我试图在当前包之外的路径中运行一个exe文件。运行它的code.java文件位于
%Workspace_path%\Project\src\main\java\\ \\com\util\code.java
但是exe文件所在的目录
%Workspace_path%\Project\src\main\resources\program.exe
$ c $如果可能的话,这里最好的解决办法是获得项目的绝对路径,然后添加src\main\resources \\来。有没有一个好的方法来做到这一点,还是有一个替代解决方案?
我正在使用Eclipse,但如果它也可以在其他IDE中使用,它将会很棒。感谢您的帮助。
解决方案
事实上,解决这个问题的办法是将EXE捆绑为一个类路径资源。看来你已经安排了这一点。
使用类路径资源时,一个成熟的程序不应该假定资源在文件系统中。资源可以打包在一个JAR文件中,甚至是一个WAR文件中。在这一点上你唯一可以信任的就是在Java中访问资源的标准方法,如下所示。
解决你的问题的方法是访问资源内容使用调用 Class.getResourceAsStream
(或 ClassLoader.getResourceAsStream
),save内容到一个临时文件,并从该文件执行。这将保证你的程序不管它的包装是否正常工作。
换句话说:
$ b $ ol
getClass()。getResourceAsStream(/ program.exe)
。从静态方法中,你不能调用 getClass
,所以使用你当前类的名字来代替,如 MyClass.class.getResourceAsStream
。这将返回 InputStream
。 File。 createTempFile
。这将返回标识新创建文件的 File
对象。 OutputStream
到此临时文件。 IOUtils.copy
如果你在Apache Commons工具。完成这一步后,请不要忘记关闭两个流。换句话说(稍后添加代码段):
pre >
private void executeProgramFromClasspath()抛出IOException {
//打开资源流。
InputStream input = getClass()。getResourceAsStream(/ program.exe);
if(input == null){
throw new IllegalStateException(Missing classpath resource。);
}
//传输。
OutputStream output = null;
尝试{
//创建临时文件。可能会抛出IOException。
文件temporaryFile = File.createTempFile(getClass()。getName(),);
output = new FileOutputStream(temporaryFile);
output = new BufferedOutputStream(output);
IOUtils.copy(输入,输出);
} finally {
//关闭流。
IOUtils.closeQuietly(input);
IOUtils.closeQuietly(输出);
}
//执行。
尝试{
String path = temporaryFile.getAbsolutePath();
ProcessBuilder processBuilder = new ProcessBuilder(path);
Process process = processBuilder.start();
process.waitFor();
} catch(InterruptedException e){
//可选捕获。保持方法签名整齐。
抛出新的IOException(e);
} {
//清理
if(!temporaryFile.delete()){
//记录这个问题,或者抛出一个错误。
}
}
}
I'm trying to run a exe file in path outside of the current package. My code.java file that runs it is in
%Workspace_path%\Project\src\main\java\com\util\code.java
However the directory of where the exe is
%Workspace_path%\Project\src\main\resources\program.exe
If possible, it seems like the best solution here would be to get the absolute path of the Project then append "src\main\resources\" to it. Is there a good way to do this or is there an alternative solution? I'm using Eclipse, but it would great if it could be used in other IDEs too. Thanks for any help.
The de facto approach to solving this is to bundle the EXE as a classpath resource. It seems you have arranged for this already.
When working with classpath resources, a mature program should not assume that the resource is in the filesystem. The resources could be packaged in a JAR file, or even in a WAR file. The only thing you can trust at that point is the standard methods for accessing resources in Java, as hinted below.
The way to solve your problem, then, is to access the resource contents using the de facto standard of invoking Class.getResourceAsStream
(or ClassLoader.getResourceAsStream
), save the contents to a temporary file, and execute from that file. This will guarantee your program works correctly regardless of its packaging.
In other words:
- Invoke
getClass().getResourceAsStream("/program.exe")
. From static methods, you can't callgetClass
, so use the name of your current class instead, as inMyClass.class.getResourceAsStream
. This returns anInputStream
. - Create a temporary file, preferably using
File.createTempFile
. This returns aFile
object identifying the newly created file. - Open an
OutputStream
to this temp file. - Use the two streams to copy the data from the resource into the temp file. You can use
IOUtils.copy
if you're into Apache Commons tools. Don't forget to close the two streams when done with this step. - Execute the program thus stored in the temporary file.
- Clean up.
In other words (code snippet added later):
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.
}
}
}
这篇关于Java:获得项目的绝对路径的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!