在我的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。
答案 0 :(得分:3)
看起来lein-environ
插件实际上并没有物理设置环境变量(事实上,您无法在Java中设置当前进程的环境变量 - 有关详细信息,请参阅here)。甚至假设它可以,问问自己 - 你如何确保在构建uberjar时存在的环境变量在运行时存在?
相反,lein-environ
和随附的environ.core/env
函数为您提供了一种伪造环境变量以用于测试和开发目的的方法,而无需在启动Leiningen之前手动设置环境变量。它通过将项目映射中提供的变量从插件代码写入.lein-env
文件,并在从项目代码调用env
时将这些值与实际操作系统环境中的值合并来实现。
所以,当你去运行uberjar时,你实际上需要在你的Windows环境中(或者在你当前目录的.lein-env
文件中存在这些变量,我不建议这样做)。如果您的目标是使用预设环境变量提供独立演示来控制某些应用程序行为,我将创建一个.cmd
脚本以与您的应用程序一起分发,该脚本将设置适当的环境变量,然后启动uberjar。