1

我正在尝试在当前包之外的路径中运行 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 中使用,那就太好了。谢谢你的帮助。

4

2 回答 2

4

解决此问题的实际方法是将 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. 使用这两个流将数据从资源复制到临时文件中。IOUtils.copy如果您喜欢 Apache Commons 工具,则可以使用。完成此步骤后,不要忘记关闭两个流。
  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.
        }
    }
}
于 2013-03-25T02:17:03.117 回答
0

好吧,在您的上下文中,项目根目录恰好是当前路径

.

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

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

我在Eclipse上测试了这段代码,没问题。我认为应该在不同的ide上工作。祝你好运!

于 2013-03-25T04:50:55.917 回答