昨天我完成了我的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
调用 acmd.exe
然后包装.exe
,您的应用程序将在两个不同的进程中执行。
这意味着如果您.exe
出于某种原因(意外崩溃或其他原因)必须终止进程,您的 java 应用程序仍然作为java.exe
进程工作。所以在这种情况下,你必须杀死MyApp.exe
和java.exe
处理。实际上,如果您只是杀死java.exe
进程,那么MyApp.exe
进程将自行完成执行。
如果您牢记这一点并且可以忍受,我认为此选项非常简单且有用。我希望这对任何寻求解决此问题的方法的人有所帮助。