2013-03-25 185 views
1

我试图在当前包之外的路径中运行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中使用,它也会很棒。谢谢你的帮助。

+0

你的类路径是什么样的? – Farlan 2013-03-25 02:03:19

+0

%Workspace_path%\ Project \ src \ target \ classes 我想我可以从类路径中找到“src”,然后附加“main \ resources \” – roverred 2013-03-25 02:12:41

回答

3

解决此问题的实际方法是将EXE捆绑为类路径资源。看来你已经安排好了。

使用类路径资源时,成熟的程序不应该假定资源在文件系统中。这些资源可以打包在一个JAR文件中,甚至是一个WAR文件中。在这一点上,您唯一可以信任的就是访问Java中资源的标准方法,如下所示。

然后,解决问题的方法是使用调用Class.getResourceAsStream(或ClassLoader.getResourceAsStream)的事实标准访问资源内容,将内容保存到临时文件,然后从该文件执行。这将保证您的程序无论其包装如何正常工作。

换句话说:

  1. 调用getClass().getResourceAsStream("/program.exe")。从静态方法中,不能调用getClass,所以请使用当前类的名称,如MyClass.class.getResourceAsStream。这将返回一个InputStream
  2. 创建一个临时文件,最好使用File.createTempFile。这将返回一个标识新创建文件的对象File
  3. 打开一个OutputStream到这个临时文件。
  4. 使用这两个流将资源中的数据复制到临时文件中。如果您使用Apache Commons工具,则可以使用IOUtils.copy。完成这一步后,不要忘记关闭这两个流。
  5. 执行存储在临时文件中的程序。
  6. 清理。

换句话说(代码片段后来补充):

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. 
     } 
    } 
} 
+2

注意:原始代码片段有一个错误。如果无法创建临时文件,则“InputStream”未关闭。这是固定的。 – 2013-03-26 02:23:49

+0

谢谢,作品像魅力! – roverred 2013-03-26 04:41:03

0

那么,在你的情况下,该项目的根恰好是电流通路

,那就是当java.exe的开始执行,所以一个简单的方法是:

String exePath="src\\main\\resources\\program.exe"; 
File exeFile=new File(".",exePath); 
System.out.println(exeFile.getAbusolutePath()); 
... 

我测试此代码Eclipse的,这没关系。我认为应该在不同的IDE上工作。 祝你好运!