4

シンプルなユーティリティアプリを作りました。その中に実行するexeファイルがありました。次を使用して実行しました:

Runtime.getRuntime().exec(this.getClass().getResource("filename.exe").getPath());

ide(Netbeans)からプログラムを実行すると、完全に機能します。

しかし、ビルド後に上記のコマンドを使用して(つまり、ビルド時に作成されたjarから)exeを実行しようとすると、まったく機能しません。

私もこれを実行してみました:

Desktop.getDesktop().open(new File("filename.exe"))

しかし、再び使用されません。

助けてください

4

1 に答える 1

1

ユースケースを試してみたところ、getResource がパス "file:/path/to/thejar.jar!filename.exe" を検索し、jar 内の exe を使用できないことがわかりました。

クラスパスを変更しようとしましたが、失敗しました。


URL接続でjar内の構成ファイルを読み取るSpringの戦略を参照すると、解決策は次のようになると思います。

  • getResourceAsStream で InputStream を取得する

  • jar 内の exe フォームを、ImputStream を使用して一時ファイルにコピーします。

  • jar の外にある一時的な exe ファイルを実行します。


これは機能します (jar にコンパイルされた場合は問題ありませんが、IDE では問題ありません。別の場所で「getResource」検索が行われるためです):

package me.mren.loadresource;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class Runner {

    /**
     * @param args
     */
    public static void main(String[] args) {
        try {
            String filename = "/resources/filename.exe";
            System.out.println(Runner.class.getResource(filename));
            InputStream fi = Runner.class.getResourceAsStream(filename);
            File temp = File.createTempFile("temp_exe", "");
            System.out.println(temp.getPath());
            OutputStream fo = new FileOutputStream(temp);
            byte[] b = new byte[1024];
            int count = 0;
            while ((count = fi.read(b)) != -1) {
                fo.write(b, 0, count);
            }
            fi.close();
            fo.close();

            System.out.println(temp.canExecute());
            Runtime.getRuntime().exec(temp.getPath());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

プロジェクトのファイル構造:

C:\USERS\REN MIN\DEV ENV\JAVA\WORKSPACE\LOADRESOURCE
│  .classpath
│  .project
│  pom.xml
│
├─.settings
│      org.eclipse.jdt.core.prefs
│      org.eclipse.m2e.core.prefs
│
├─src
│  ├─main
│  │  ├─java
│  │  │  └─me
│  │  │      └─mren
│  │  │          └─loadresource
│  │  │                  Runner.java
│  │  │
│  │  └─resources
│  │          filename.exe
│  │
│  └─test
│      ├─java
│      └─resources
└─target
    │  loadresource-0.0.1-SNAPSHOT.jar
    │
    ├─classes
    │  │  filename.exe
    │  │
    │  └─me
    │      └─mren
    │          └─loadresource
    │                  Runner.class
    │
    ├─maven-archiver
    │      pom.properties
    │
    ├─surefire
    └─test-classes

jar 内のファイル構造:

E:\TEST\RESULT
│  .classpath
│  .project
│  pom.xml
│
├─me
│  └─mren
│      └─loadresource
│              Runner.class
│
├─META-INF
│      MANIFEST.MF
│
└─resources
        filename.exe
于 2013-10-10T15:47:09.263 に答える