簡體   English   中英

lein uberjar 永遠服用

[英]lein uberjar taking forever

我想創建一個 leiningen 應用程序的 uberjar。 我的配置是:

:uberjar {:omit-source true
             :aot :all
             :uberjar-name "myapp.jar"
             :source-paths ["env/prod/clj" ]
             :resource-paths ["env/prod/resources"]}

但是在執行lein uberjar ,我發現正在編譯項目中的文件,但是編譯停留在包含大部分代碼的文件上,持續了十分鍾並且還在計數。 此文件不包含超過 140 行。

TL;DR: def副作用


如評論中所述:

...我只是認為這一行: (defonce server (http/start-server server-handler {:port 8982}))導致掛起。

不要把這樣的東西放在頂層。

defonce僅意味着它一旦存在就不會被重新定義(因此在這種情況下,它將防止重新加載時出現一些“端口已在使用”錯誤。

擺脫困境的方法

編寫一個 function,啟動這個服務器。 然后從你的主要調用它。 對於開發,您可以從 REPL 運行 function,或者您可以在您的用戶 ns 中添加一些重新加載/重啟邏輯。

另一種選擇可能是使用delay :它只會在被deref編輯后才執行代碼。

您必須處理的“資源綁定”越多,一些系統化的方法就會越多地為您的應用程序提供更好的結構。 例如看一下:

那么為什么將阻塞的東西或副作用放在def有問題呢?

Clojure 編譯器的工作方式實際上是“運行”代碼。 所以compile基本上是:

  1. 啟用生成字節碼並將其寫為.class 文件
  2. 加載命名空間並“運行”它

這意味着,在編譯時,將執行頂級副作用。 因此def中的阻塞操作會阻塞編譯(這很明顯),或者您的 CI 服務器將無法編譯,因為它無法連接到數據庫等。

很好地解釋了 Clojure 中的代碼生成如何工作:

暫無
暫無

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

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