2016-02-04 50 views
2

我正在開發一個Java應用程序,主要是一個GUI應用程序。但是,它也提供了一個命令行界面。我可以將命令行參數分爲三種不同的類型:如何使用launch4j來封裝也提供命令行界面的GUI應用程序?

  • 第一種類型的參數改變了GUI的行爲。
  • 第二種類型以特定狀態啓動GUI。
  • 第三種類型導致應用程序直接執行操作而不顯示GUI。

當我使用java -jar <application-name>.jar -parameter執行應用程序時,一切都按預期工作。應用程序執行要求的操作。應用程序關閉或完成後,shell提示符會返回。

問題

當我使用launch4j從jar文件創建一個Windows的包裝,這種行爲的改變。 shell提示符總是立即返回。因此,我仍然可以傳遞命令行參數,但是我無法通過終端與應用程序交互。它不打印寫入標準輸出或標準錯誤的任何內容,也不能從標準輸入讀取任何內容。

問題

我如何配置launch4j創建一個exe包裝,提供相同的命令行的行爲與包裹的jar文件?

其他信息

我用launch4j行傢俱有以下配置插件:

<plugin> 
    <groupId>com.akathist.maven.plugins.launch4j</groupId> 
    <artifactId>launch4j-maven-plugin</artifactId> 
    <version>1.7.8</version> 
    <executions> 
     <execution> 
      <id>launch4j</id> 
      <phase>package</phase> 
      <goals> 
       <goal>launch4j</goal> 
      </goals> 
      <configuration> 
       <headerType>gui</headerType> 
       <stayAlive>true</stayAlive> 
       <outfile>path/to/outfile.exe</outfile> 
       <jar>path/to/infile.jar</jar> 
       <dontWrapJar>false</dontWrapJar> 
       <errTitle>Error in Launcher</errTitle> 
       <classPath> 
        <mainClass>com.example.Launch</mainClass> 
        <addDependencies>false</addDependencies> 
       </classPath> 
       <icon>path/to/icon.ico</icon> 
       <jre> 
        <minVersion>1.8.0</minVersion> 
        <initialHeapSize>512</initialHeapSize> 
        <maxHeapSize>1024</maxHeapSize> 
       </jre> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

documentation of launch4j說,是的設置headerType=guistayAlive=true給定的組合將等待應用程序關閉,事實並非如此。

因爲我沒有可用的Windows機器,所以當我設置headerType=console時,我無法嘗試會發生什麼情況。該文檔說,這會導致包裝到始終等待並返回應用程序的退出代碼。但是,由於我的應用程序主要是一個GUI應用程序,我不知道這個設置是否有任何負面影響。在這一點上,我開始問自己爲什麼我會希望包裝的應用程序具有比jar文件更多的命令行行爲。

回答

1

我終於得到了一臺Windows機器,並開始自行測試。

我通過由

  <headerType>console</headerType> 

更換此

  <headerType>gui</headerType> 
      <stayAlive>true</stayAlive> 

根據文檔stayAlive=true實際上是由headerType=console暗示的解決了這個問題,所以我可以放心地從配置中刪除它。

我無法注意到這對GUI的任何副作用。唯一令人討厭的是,這會打開一個顯示控制檯輸出的控制檯。

所以,我想對此的預期解決方案是在問題中描述的配置:headerType=guistayAlive=true。但是,這不起作用。我認爲這是launch4j中的一個錯誤。

相關問題