簡體   English   中英

Java自包含包等待完成

[英]Java self-contained package wait for completion

我有一個應用程序,我需要它是一個獨立的應用程序,可安裝在可能沒有 Java 的計算機上。 我正在使用javapackager命令創建一個可以發送給用戶的 EXE,其中包含所有需要的部分。 簡單來說,應用程序讀取第一個參數引用的文件,對其進行轉換,然后將結果寫回源文件旁邊。 當它直接作為 JAR 運行時,以及通過內置的 EXE 運行它時,所有這些都有效。

問題在於,當觸發可執行文件時,它會立即將執行返回到命令提示符,而不是等待進程完成。 我不想輪詢輸出目錄以檢查文件是否存在,然后在何時停止查找時給出一些任意超時 - 我希望應用程序知道一旦控制台命令完成,處理就完成了。 那時我可以根據我是否找到結果文件來做邏輯,如果沒有找到或者其他任何邏輯是正確的,我就會發出警報。

有沒有辦法告訴javapackager命令在返回控制之前設置等待直到 Java 死亡(好或壞)? 除此之外,是否有代碼片段/概念可以使應用程序推遲將控制權釋放回終端,直到 JVM 死亡?

對於我使用 Oracle JDK 8、9 和 10 附帶的javapackager以及 OpenJDK 13 的快照打包的應用程序,我可以確認這種行為。雖然生成的二進制文件在 macOS 和 Linux 下“按預期”運行,但 Windows 二進制文件僅似乎產生了一個新進程並立即退出。

從 Java 9 開始, jpackager內部調用jlink ,它有一個選項--strip-native-commands ,它基本上從嵌入式 JRE 中刪除二進制文件。 在 Java 8 中,您沒有此選項,並且始終刪除諸如java.exe類的可執行文件。 但是我的測試表明 JRE 在其他方面是完整的,您應該能夠簡單地手動包含java.exe (最好徹底測試一下!)。

因此,我提出以下解決方法:

  1. 使用javapackager -deploy -native image創建應用程序目錄
  2. java.exe從系統范圍的 JRE 安裝復制到{OUTDIR}\\runtime\\bin (檢查您的許可證是否涵蓋重新分發 java.exe!)
  3. {OUTDIR}內創建一個 .bat 文件,調用runtime\\bin\\java.exe -jar ./app/yourapp.jar
  4. 現在將{OUTDIR}添加到您的 .msi 或 innosetup 安裝程序或 .zip 文件或您選擇的任何分發方式;-)

然后,您可以調用 bat 文件而不是 exe。 由於它只是java -jar的包裝器,因此它會等到您的程序完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM