#java #swing #splash-screen #jsmooth
#java #swing #экран-заставка #jsmooth
Вопрос:
Я оборачиваю свое приложение Java Swing как exe-файл, используя Jsmooth, но я не вижу способа воспользоваться опцией экрана-заставки Java 6. У меня есть следующий файл манифеста:
Manifest-Version: 1.0
SplashScreen-Image: resources/LOADLOGO.png
Main-Class: se.bookingapp.UI.MainFrame
Экран-заставка появляется, если я просто нажимаю на jar-файл приложения. Однако сгенерированная JSmooth exe-форма файла jar каким-то образом не показывает экран-заставку. Кто-нибудь знает почему?
Комментарии:
1. папка «resource» и «LOADLOGO.png», где они? Возможно, вам нужно указать структуру вашей установочной папки.
2. Я сгенерировал exe-файл с помощью Launch4j, и это сработало. Жаль, что JSmooth не может этого сделать.
3. Да, я также использую Launch4J, который более надежен каждый раз, когда я его использую, вместе с InnoSetup Ant task
Ответ №1:
Вчера я закончил разработку своего 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 amp;amp; !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
процесс завершит выполнение сам по себе.
Если вы помните об этом и можете смириться с этим, я думаю, что этот вариант довольно прост и полезен. Я надеюсь, что это будет полезно всем, кто ищет обходной путь к этой проблеме.
Ответ №2:
Работает ли это при запуске файла jar? Откройте его, например, с помощью WinRAR и проверьте, находится ли манифест в папке META-INF, и LOADLOGO.png также находится в нужной папке.
После этого он должен сработать. У меня это работает. В вашем манифесте нет ничего неправильного.