使用Lein run和Clojure -M运行脚本挂起,REPL中可正常执行
Clojure执行脚本与Lein运行的问题排查
环境信息
$ lein --version Leiningen 2.9.10 on Java 17.0.4.1 OpenJDK 64-Bit Server VM $ clojure -version Clojure CLI version 1.11.1.1155 $ java -version openjdk version "17.0.4.1" 2022-08-12 OpenJDK Runtime Environment (build 17.0.4.1+1) OpenJDK 64-Bit Server VM (build 17.0.4.1+1, mixed mode)
问题1:clojure.java.shell/sh执行挂起
初始代码:
(use '[clojure.java.shell :only [sh]]) (defn -main [] (sh "echo" "Hello, World!")) (-main)
- REPL中执行正常,返回结果:
{:exit 0, :out "Hello, World!\n", :err ""} - 但用
clojure -M作为脚本执行时挂起;添加命名空间后用lein run执行同样挂起。 - 尝试过的写法:
require+:refer引入命名空间、显式打印标准输出(如(print (:out (sh "echo" "stuff"))))。
项目配置project.clj:
(defproject findbad "0.1.0-SNAPSHOT" :description "FIXME: write description" :url "http://example.com/FIXME" :dependencies [[org.clojure/clojure "1.11.1"]] :source-paths ["."] :repl-options {:init-ns findbad} :main findbad)
.lein/profile.clj配置:
{:user {:plugins [ [lein-try "0.4.3"] [flat-layout/lein-template "1.6.0"] [simple-layout/lein-template "0.1.0"]]}}
问题2:Lein运行时-main函数参数错误
修改后的代码:
(ns findbad (:gen-class)) (use '[clojure.java.shell :only [sh]]) (defn -main [] (print "Hello, World")) (-main)
clojure -M执行正常;lein run -main抛出参数数量错误:{:clojure.main/message "Execution error (ArityException) at user/eval140 (form-init17641850740462455309.clj:1).\nWrong number of args (1) passed to: findbad/-main\n", :clojure.main/triage {:clojure.error/class clojure.lang.ArityException, :clojure.error/line 1, :clojure.error/cause "Wrong number of args (1) passed to: findbad/-main", :clojure.error/symbol user/eval140, :clojure.error/source "form-init17641850740462455309.clj", :clojure.error/phase :execution}, :clojure.main/trace {:via [{:type clojure.lang.Compiler$CompilerException, :message "Syntax error macroexpanding at (/tmp/form-init17641850740462455309.clj:1:74).", :data {:clojure.error/phase :execution, :clojure.error/line 1, :clojure.error/column 74, :clojure.error/source "/tmp/form-init17641850740462455309.clj"}, :at [clojure.lang.Compiler load "Compiler.java" 7665]} {:type clojure.lang.ArityException, :message "Wrong number of args (1) passed to: findbad/-main", :at [clojure.lang.AFn throwArity "AFn.java" 429]}], :trace [[clojure.lang.AFn throwArity "AFn.java" 429] [clojure.lang.AFn invoke "AFn.java" 32] [clojure.lang.Var invoke "Var.java" 384] [user$eval140 invokeStatic "form-init17641850740462455309.clj" 1] [user$eval140 invoke "form-init17641850740462455309.clj" 1] [clojure.lang.Compiler eval "Compiler.java" 7194] [clojure.lang.Compiler eval "Compiler.java" 7184] [clojure.lang.Compiler load "Compiler.java" 7653] [clojure.lang.Compiler loadFile "Compiler.java" 7591] [clojure.main$load_script invokeStatic "main.clj" 475] [clojure.main$init_opt invokeStatic "main.clj" 477] [clojure.main$init_opt invoke "main.clj" 477] [clojure.main$initialize invokeStatic "main.clj" 508] [clojure.main$null_opt invokeStatic "main.clj" 542] [clojure.main$null_opt invoke "main.clj" 539] [clojure.main$main invokeStatic "main.clj" 664] [clojure.main$main doInvoke "main.clj" 616] [clojure.lang.RestFn applyTo "RestFn.java" 137] [clojure.lang.Var applyTo "Var.java" 705] [clojure.main main "main.java" 40]], :cause "Wrong number of args (1) passed to: findbad/-main", :phase :execution}}
疑问:未给无参的-main传参,为何提示参数数量错误?
已解决的方案
通过以下方式解决了挂起问题:
- 显式打印
sh的输出:(print (:out (sh "echo" "stuff"))) - 在代码末尾调用
(shutdown-agents)
内容的提问来源于stack exchange,提问作者Nero gris
相关产品推荐
相关产品推荐

