重複の可能性:
jarファイル内でシェルスクリプトを実行します。抽出する方法は?
'engine'パッケージ内のJARファイルにシェルスクリプトがパッケージ化されています。
私のプログラムでは、ProcessとProcessBuilderを使用してシェルコマンドを実行しています。これはすべて正常に機能します。
コンピューターでシェルスクリプトへのパスを指定すると、プログラムは正常に機能します。ただし、シェルスクリプトをJARにパッケージ化して、次のようにアクセスする場合:
scriptLocation = this.getClass().getResource("/engine/shell-script.sh").toString();
プログラムを実行すると、次のエラーが発生します。
java.io.IOException: Cannot run program "file:/Users/USERNAME/Desktop/Application-Name.jar!/engine/shell-script.sh": error=2, No such file or directory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:460)
at java.lang.Runtime.exec(Runtime.java:593)
at java.lang.Runtime.exec(Runtime.java:431)
at java.lang.Runtime.exec(Runtime.java:328)
at engine.Download$1.run(Download.java:39)
at java.lang.Thread.run(Thread.java:680)
Caused by: java.io.IOException: error=2, No such file or directory
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:53)
at java.lang.ProcessImpl.start(ProcessImpl.java:91)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:453)
... 5 more
これはできないと思い始めています。このシェルスクリプトをアプリケーションの一部として提供したいのですが、できますか?
みなさん、よろしくお願いします。
========更新==========
私は最終的にこの問題を解決しました。ShellはJARバンドル内でスクリプトを実行できません。これは、Javaではなく、シェルに関するものです。私は次のようにしてこれを修正しました:
JavaにはcreateTempFile()メソッド(アプリケーションが終了したらファイルを削除するオプション付き)があり、これを呼び出して、この一時ファイルにアクセスするJARバンドル内にファイルを書き込みます。これで、ローカルファイルシステムにシェルスクリプトが作成され、スクリプトを実行できるようになります。