昨日、Java アプリケーションの開発を終了しましたが、同じ問題がありました。.jar ファイルをダブルクリックするか、コマンド ラインのスプラッシュ画面で実行すると完全に機能しますが、ラップされたファイルを実行すると機能しません。JSmooth だけがこの機能をサポートしていないようです。
.exe
ただし、ラップされたスプラッシュ画面を同時に機能させるためにちょっとしたトリックを行いました。コマンド ラインApplicationLoader.jar
で実行される単一のメイン クラスで構成される、という小さなアプリケーションを作成しました。java -jar "Application.jar"
完全なコードは次のとおりです。
public class ApplicationLoader {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
/* First I check if the first parameter is not null and it's not an empty string */
if(args[0] != null && !args[0].trim().isEmpty()){
/* Then I use java.util.regex package to validate the parameter is a .jar file */
Pattern pattern = Pattern.compile(".*jar");
Matcher matcher = pattern.matcher(args[0]);
if(matcher.matches()){
/* Finally I define the command line like: java -jar "Application.jar" */
String command = "java -jar \"" + args[0] + "\"";
try {
Runtime r = Runtime.getRuntime();
ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", command);
Process p = pb.start();
p.waitFor();
} catch (IOException | InterruptedException ex) {
JOptionPane.showMessageDialog(null, ex.getMessage(), "Error executing: "+command, JOptionPane.ERROR_MESSAGE);
}
} else {
JOptionPane.showMessageDialog(null, "The argument is not a .jar file!!");
}
} else {
JOptionPane.showMessageDialog(null, "There's not a valid argument!");
}
}
}
アプリケーションのフォルダー構造は次のとおりです。
MyApp
+-- bin
| +-- MyApp.jar
| +-- ApplicationLoader.jar
+-- MyApp.exe
そのJSmoot
ため、クラスパスを次のように変更し、アプリケーション引数セクションでアプリケーションApplicationLoader.jar
に相対位置を追加しました。

以上です。これが最善の選択肢ではないことはわかっていますが、回避策です。
ただし、少し問題があります。
ApplicationLoader.jar
a を呼び出してからcmd.exe
ラップされ.exe
、アプリケーションは 2 つの異なるプロセスで実行されます。
これは.exe
、何らかの理由 (予期しないクラッシュなど) でプロセスを強制終了する必要がある場合、Java アプリケーションがまだjava.exe
プロセスとして動作していることを意味します。その場合、強制終了して処理する必要がMyApp.exe
ありjava.exe
ます。実際、プロセスを強制終了するとjava.exe
、MyApp.exe
プロセスは自動的に実行を終了します。
これを念頭に置いて、それを受け入れることができるなら、このオプションは非常にシンプルで便利だと思います. この問題の回避策を探している人にとって、これが役立つことを願っています。