请在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 在类java.lang.ProcessEnvironment$StringEnvironment中找不到匹配的接受2个参数的put方法

1 个答案

+1

选定
 
最佳答案

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

在代码块中,用doseq替换for

但这不会解决异常。似乎你触发了https://clojure.atlassian.net/browse/CLJ-1243(即使描述不完全相同,根本原因可能是一样的),我也可以重现它。

为了修复它,添加类型注解:(.put ^java.util.Map environment env val)

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