Вчера я закончил разработку 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
вызывает cmd.exe
, то оболочка .exe
и ваше приложение будут выполняться в двух разных процессах.
Это означает, что если вам по какой-то причине (неожиданному сбою или чему-то еще) придется убить .exe
процесс, ваше java-приложение все еще будет работать как java.exe
процесс. Таким образом, в этом случае вы должны уничтожить процессы MyApp.exe
и java.exe
. На самом деле, если вы просто убьете java.exe
процесс, то MyApp.exe
процесс сам завершит выполнение.
Если вы помните об этом и можете жить с этим, я думаю, что этот вариант довольно прост и полезен.
Я надеюсь, что это будет полезно для всех, кто ищет решение этой проблемы.