首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >lein uberjar永远耗费时间

lein uberjar永远耗费时间
EN

Stack Overflow用户
提问于 2021-05-03 18:34:32
回答 1查看 79关注 0票数 0

我想创建一个leiningen应用程序的uberjar。我的配置是:

代码语言:javascript
复制
:uberjar {:omit-source true
             :aot :all
             :uberjar-name "myapp.jar"
             :source-paths ["env/prod/clj" ]
             :resource-paths ["env/prod/resources"]}

但在执行lein uberjar时,我发现项目中的文件正在编译,但编译过程在包含大部分代码的文件上停滞不前,持续了十分钟,而且还在继续。此文件包含的行数不超过140行。

EN

回答 1

Stack Overflow用户

发布于 2021-05-05 03:02:24

TL;DR:从不def副作用

如评论中所述:

...我只是想到了这一行:(defonce server (http/start-server server-handler {:port 8982}))导致了挂起。

不要把这样的东西放在最高层。

defonce只意味着它一旦存在就不会被重新定义(所以在这种情况下,它可以防止在重新加载时出现一些“端口已经在使用中”的错误。

走出困境的方法

写一个函数,启动这个服务器。然后从你的main调用它。对于开发,您可以从REPL运行该函数,或者在您的user-ns中散布一些重新加载/重新启动逻辑。

另一种选择是使用delay:它只会在derefed之后执行代码。

你必须处理的“资源绑定”越多,一些系统化的方法就会给你的应用程序带来更好的结构。例如,看一下:

那么为什么在def中放置阻塞的东西或副作用是有问题的呢?

Clojure编译器的工作方式实际上是“运行”代码。所以compile基本上是:

  1. 启用生成字节码并将其写出为.class文件
  2. 加载命名空间并运行它

这意味着,在编译时,会执行顶级副作用。因此,在def中的阻塞操作将阻塞编译(这是很明显的),或者您的CI服务器将无法编译,因为它无法连接到数据库等。

很好地解释了Clojure中的代码生成是如何工作的:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67367458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档