昨日私はJavaアプリケーションの開発を終了しましたが、私は同じ問題がありました。 .jarファイルをダブルクリックするか、コマンドラインでスプラッシュ画面を実行すると完全に動作しますが、ラップされたファイルを実行すると、そのファイルは実行されません。 JSmoothはこの機能をサポートしていないようです。
しかし、私はちょっとした工夫をして、.exe
をラップして、同時にスプラッシュスクリーンを動作させました。コマンドラインでjava -jar "Application.jar"
を実行する単一のメインクラスで構成されるApplicationLoader.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
ので.exe
包まれ、アプリケーションが2つの異なるプロセスで実行されます、その後cmd.exe
を呼び出します。
これは何らかの理由(予期しないクラッシュなど)で.exe
プロセスを強制終了しなければならない場合、Javaアプリケーションはまだjava.exe
プロセスとして動作していることを意味します。その場合は、MyApp.exe
とjava.exe
のプロセスを削除する必要があります。実際にはjava.exe
プロセスを殺すだけなら、MyApp.exe
プロセスは単独で実行を終了します。
このことを念頭に置いて、それを生かすことができれば、このオプションは非常に簡単で便利だと思います。 これは、この問題の回避策を探している人に役立つことを願っています。
"resource"フォルダと "LOADLOGO.png"はどこですか?たぶん、インストールフォルダの構造を伝える必要があります。 –
Launch4jを使用してexeファイルを生成していました。 JSmoothはこれを行うことができません。 –
ええ、私はまた、InnoSetup + Antタスクと一緒に使用するたびに、より信頼できるLaunch4Jを使用します –