私が書いた Java アプリケーションは小さな C プログラムに依存しています。そのプログラムの実行可能バージョンをリソースに配置することにしました。ユーザーがアプリを起動すると、アプリはそのプログラムの一時バージョンを作成し、閉じると同じものを削除します。
メインの Java プログラムのコンストラクタは次のとおりです。
public RankingCreator(String title) {
super(title);
if (!tempJudgeCreated) { // static variable
try {
InputStream istream = (InputStream) getClass().getResourceAsStream("/res/IOIJudge");
byte[] tempJudgeBytes = new byte[SIZE_OF_JUDGE];
istream.read(tempJudgeBytes);
istream.close();
FileOutputStream ostream = new FileOutputStream(JUDGE);
ostream.write(tempJudgeBytes);
ostream.flush();
ostream.close();
Runtime.getRuntime().exec("chmod 777 " + JUDGE); // this line creates confusion
tempJudgeCreated = true;
} catch (IOException e) {
e.printStackTrace();
}
}
}
これは、Eclipse を使用している間は完全に機能しますが、これを実行可能な JAR にエクスポートすると、このコードは失敗し、GUI 部分にさえ進みません。Runtime.getRuntime()... を削除すると GUI に進みますが、それを使用するために必要な権限がありません (一時プログラム)。