Сгенерированный JSmooth exe-файл не показывает экран-заставку

#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 также находится в нужной папке.

После этого он должен сработать. У меня это работает. В вашем манифесте нет ничего неправильного.