Clojure 使用lein ring构建的uberjar无法查看概要文件环境变量

Clojure 使用lein ring构建的uberjar无法查看概要文件环境变量,clojure,leiningen,ring,uberjar,Clojure,Leiningen,Ring,Uberjar,在我的Leiningen project.clj中,我使用它在不同的配置文件中设置环境变量。我想用lein ring构建一个演示uberjar,它在生产版本中对某些环境变量使用不同的值。然而,由于某种原因,我似乎无法拿起它们 我在我的项目中定义了一个类似这样的demoprofile。clj: :demo {:dependencies [[javax.servlet/servlet-api "2.5"]] :plugins [[lein-environ "0.4.0"]]

在我的Leiningen project.clj中,我使用它在不同的配置文件中设置环境变量。我想用lein ring构建一个演示uberjar,它在生产版本中对某些环境变量使用不同的值。然而,由于某种原因,我似乎无法拿起它们

我在我的项目中定义了一个类似这样的
demo
profile。clj:

: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中使用
environment.core/env
访问foo或bar都会返回
nil
。另一方面,如果我跑

lein with-profile demo ring server-headless
我可以访问两者的值

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

该页面确实说明了以下内容:

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

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

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


在Windows上运行leiningen 2.3.4。

看起来,
lein environ
插件实际上并不是在物理上设置环境变量(实际上,您不能在Java中设置当前进程的环境变量-有关详细信息,请参阅)。即使假设可以,问问自己——您如何确保在构建uberjar时存在的环境变量在运行时也存在

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


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

谢谢。事实上,我知道Environ是如何工作的,但我并没有真正得到它只是用于测试的印象。我知道网站上说,对于生产,您可以在操作系统环境变量中进行替换,但我认为环境是我希望在生产中使用的东西,是配置不同构建的好方法。我认为,通过脚本设置这些演示变量的想法是可以接受的折衷方案。我还可以通过Java系统属性设置它们,当然也可以采用类似的方法,将属性写入到uberjar中绑定的资源文件中,而不是文件系统中,但这需要一些自定义代码。但是,任何直接使用
System/getenv
检查环境变量的代码都不受
lein-environ
中设置的属性的影响。此外,
environ.core
非常适合生产使用。您不应该期望通过
lein-environ
设置的属性对项目代码可见,除非它是作为Leiningen任务执行的。