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.createTempFileFileこれにより、新しく作成されたファイルを識別するオブジェクトが返されます。
  3. OutputStreamこの一時ファイルを開きます。
  4. 2つのストリームを使用して、リソースから一時ファイルにデータをコピーします。IOUtils.copyApacheCommonsツールに興味がある場合に使用できます。この手順が完了したら、2つのストリームを閉じることを忘れないでください。
  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でテストしました、それは大丈夫です。私はそれが別のアイデアで動作する必要があると思います。幸運を!

于 2013-03-25T04:50:55.917 に答える