2011-11-13 15 views
0

Jsmoothを使用してJava Swingアプリケーションをexeとしてラップしますが、Java 6スプラッシュ画面オプションを利用できません。私は単純にアプリケーションのjarファイルをクリックした場合JSmoothで生成されたexeがスプラッシュ画面を表示しない

 Manifest-Version: 1.0 

    SplashScreen-Image: resources/LOADLOGO.png 

    Main-Class: se.bookingapp.UI.MainFrame 

スプラッシュ画面が表示されます:私は、次のマニフェストファイルを持っています。しかし、jmoothで生成されたexe形式のjarファイルでは、何らかの形でスプラッシュ画面が表示されません。なぜ誰が知っていますか?

+0

"resource"フォルダと "LOADLOGO.png"はどこですか?たぶん、インストールフォルダの構造を伝える必要があります。 –

+1

Launch4jを使用してexeファイルを生成していました。 JSmoothはこれを行うことができません。 –

+1

ええ、私はまた、InnoSetup + Antタスクと一緒に使用するたびに、より信頼できるLaunch4Jを使用します –

答えて

0

jarファイルを実行すると機能しますか?たとえばWinRarで開き、マニフェストがMETA-INFフォルダにあり、LOADLOGO.pngが正しいフォルダにあるかどうかを確認します。

これを実行した後、動作するはずです。わたしにはできる。あなたのマニフェストには何も間違っていません。

2

昨日私はJavaアプリケーションの開発を終了しましたが、私は同じ問題がありました。 .jarファイルをダブルクリックするか、コマンドラインでスプラッシュ画面を実行すると完全に動作しますが、ラップされたファイルを実行すると、そのファイルは実行されません。 JSmoothはこの機能をサポートしていないようです。

しかし、私はちょっとした工夫をして、.exeをラップして、同時にスプラッシュスクリーンを動作させました。コマンドラインでjava -jar "Application.jar"を実行する単一のメインクラスで構成されるApplicationLoader.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ので.exe包まれ、アプリケーションが2つの異なるプロセスで実行されます、その後cmd.exeを呼び出します。

これは何らかの理由(予期しないクラッシュなど)で.exeプロセスを強制終了しなければならない場合、Javaアプリケーションはまだjava.exeプロセスとして動作していることを意味します。その場合は、MyApp.exejava.exeのプロセスを削除する必要があります。実際にはjava.exeプロセスを殺すだけなら、MyApp.exeプロセスは単独で実行を終了します。

このことを念頭に置いて、それを生かすことができれば、このオプションは非常に簡単で便利だと思います。 これは、この問題の回避策を探している人に役立つことを願っています。

関連する問題