请在2024 Clojure状态调查!中分享您的想法。

欢迎!请参阅关于页面获取更多关于如何使用此功能的信息。

0
Java互操作

我设法从https://stackoverflow.com/questions/56541688/how-to-run-an-interactive-cli-program-from-within-clojure中运行一个交互式CLI。

但我还需要设置环境变量,https://stackoverflow.com/questions/30574972/java-processbuilder-and-using-environment-variables建议使用pb.environment().put("ENV", "val"),因此我认为应该是(-> pb .environment (put. env val))

(defn process-interactive-cli
  [args & [working-directory envs]]
  (let [process-builder (java.lang.ProcessBuilder. args)
        inherit (java.lang.ProcessBuilder$Redirect/INHERIT)
        environment (.environment process-builder)]
    ;; change CWD
    (when working-directory
      (.directory process-builder (io/file working-directory)))
    ;; set environment variables
    (for [[env val] envs]
      (.put environment env val))
    (.redirectOutput process-builder inherit)
    (.redirectError process-builder inherit)
    (.redirectInput process-builder inherit)
    ;; print the executing command (~ set -x)
    (apply println ">" args)
    (.waitFor (.start process-builder))))

但是断调试这个给我
1. 未处理的java.lang.IllegalArgumentException No matching method put found taking 2 args for class java.lang.ProcessEnvironment$StringEnvironment

1答案

+1

选定
 
最佳答案

在内联代码中,将 (put. env val) 替换为 (.put env val)

在代码块中,将 for 替换为 doseq

但这不会解决异常。看起来你遇到了https://clojure.atlassian.net/browse/CLJ-1243(尽管描述不完全相同,但根本原因可能相同),我也可以重现这个问题。

为了解决这个问题,添加类型注解:(.put ^java.util.Map environment env val)

by
谢谢,这个类型注解解决了我的问题。
...