Сгенерированный exe JSmooth не показывает заставку - PullRequest
0 голосов
/ 14 ноября 2011

Я обертываю свое приложение 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 не показывает заставку как-то.Кто-нибудь знает почему?

Ответы [ 2 ]

2 голосов
/ 03 ноября 2012

Вчера я закончил разработку 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 и добавил относительное местоположение к своему приложению в разделе Аргументы приложения , например:

enter image description here

И это все. Я знаю, что это не лучший вариант, но это обходной путь.

Однако есть небольшая проблема:

Так как ApplicationLoader.jar вызывает cmd.exe, то оболочка .exe и ваше приложение будут выполняться в двух разных процессах.

Это означает, что если вам по какой-то причине (неожиданному сбою или чему-то еще) придется убить .exe процесс, ваше java-приложение все еще будет работать как java.exe процесс. Таким образом, в этом случае вы должны уничтожить процессы MyApp.exe и java.exe. На самом деле, если вы просто убьете java.exe процесс, то MyApp.exe процесс сам завершит выполнение.

Если вы помните об этом и можете жить с этим, я думаю, что этот вариант довольно прост и полезен. Я надеюсь, что это будет полезно для всех, кто ищет решение этой проблемы.

0 голосов
/ 29 декабря 2011

Работает ли это при запуске файла JAR? Например, откройте его с помощью WinRar и проверьте, находится ли манифест в папке META-INF, а также файл LOADLOGO.png также в правой папке.

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

...