用lein ring构建的uberjar无法查看配置文件环境变量

时间:2014-03-13 01:29:37

标签: clojure leiningen ring uberjar

在我的Leiningen project.clj中,我使用environ在不同的配置文件中设置环境变量。我想用lein-ring构建一个演示uberjar,它对生产版本的某些环境变量使用不同的值。但是出于某些原因,我似乎无法接受它们。

我在project.clj中定义了一个demo个人资料:

:demo {:dependencies [[javax.servlet/servlet-api "2.5"]]
       :plugins [[lein-environ "0.4.0"]]
       :env {:foo "FOO" :bar "BAR"}}

然后我执行

lein with-profile demo ring uberjar

但在两种情况下,在生成的独立jar中访问带有environ.core/env的foo或bar会返回nil。另一方面,如果我跑

lein with-profile demo ring server-headless

我可以访问两者的值。

为什么会这样?这真的不是我所期望的。看起来总是使用生产配置文件创建uberjar。还是其他事情要发生?

lein-ring页面确实说明了以下内容:

  

Lein-Ring关注几个环境变量,包括:   PORT - Web服务器用于HTTP SSLPORT的端口 - 端口   Web服务器用于HTTPS

     

这些将覆盖project.clj文件中指定的任何选项,   但不会覆盖命令行中指定的任何选项。

不清楚这是否意味着project.clj中指定的任何其他环境变量将被忽略

在Windows上运行leiningen 2.3.4。

1 个答案:

答案 0 :(得分:3)

看起来lein-environ插件实际上并没有物理设置环境变量(事实上,您无法在Java中设置当前进程的环境变量 - 有关详细信息,请参阅here)。甚至假设它可以,问问自己 - 你如何确保在构建uberjar时存在的环境变量在运行时存在?

相反,lein-environ和随附的environ.core/env函数为您提供了一种伪造环境变量以用于测试和开发目的的方法,而无需在启动Leiningen之前手动设置环境变量。它通过将项目映射中提供的变量从插件代码写入.lein-env文件,并在从项目代码调用env时将这些值与实际操作系统环境中的值合并来实现。

所以,当你去运行uberjar时,你实际上需要在你的Windows环境中(或者在你当前目录的.lein-env文件中存在这些变量,我不建议这样做)。如果您的目标是使用预设环境变量提供独立演示来控制某些应用程序行为,我将创建一个.cmd脚本以与您的应用程序一起分发,该脚本将设置适当的环境变量,然后启动uberjar。