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

欢迎!请参阅 关于 页面以了解更多关于如何工作的信息。

0
REPL
重新分类

我按照以下说明安装了 clojure:
https://clojure.org/guides/getting_started#_installation_on_linux

然而,当我从 ~ 目录启动 repl 时,出现了以下情况:

在主线程中发生异常:java.lang.IllegalStateException:尝试调用未绑定的 fn: #('clojure.main/main)

    at clojure.lang.Var$Unbound.throwArity(Var.java:45)
    at clojure.lang.AFn.invoke(AFn.java:28)
    at clojure.lang.AFn.applyToHelper(AFn.java:152)
    at clojure.lang.AFn.applyTo(AFn.java:144)
    at clojure.lang.Var.applyTo(Var.java:705)
    at clojure.main.main(main.java:40)

如果我将目录更改为任何其他位置,它就可以正常运行

:~/src$ clj
Clojure 1.10.3
user=>

我的操作系统是 Debian Buster (Minimal)... 尝试搜索,但无济于事...

不确定以下信息是否有用...

:~$ mvn --version
Apache Maven 3.6.0
Maven 安装路径: /usr/share/maven
Java 版本: 11.0.11, 供应商:Debian,运行时:/usr/lib/jvm/java-11-openjdk-amd64
默认区域设置:en_IN,平台编码:UTF-8
操作系统名称:“linux”,版本:“4.19.0-17-amd64”,架构:“amd64”,家族:“unix”

:~$ java --version
openjdk 11.0.11 2021-04-20
OpenJDK 运行时环境(构建 11.0.11+9-post-Debian-1deb10u1)
OpenJDK 64 位服务器 VM(构建 11.0.11+9-post-Debian-1deb10u1,混合模式,共享)

4 个答案

+1

被选中
 
最佳答案

您的根目录下有 src 文件夹吗?如果有,里面有什么?(我在想您是否有一个 src/user.clj 文件,并且该脚本中的某些内容导致了崩溃)

:~$ ls -al src/
总计 48
drwxr-xr-x 12 nalin nalin 4096 Jul 11 16:15 .
drwxr-xr-x 29 nalin nalin 4096 Jul 15 11:32 ..
drwxr-xr-x  2 nalin nalin 4096 Jul 14 17:23 clojure
drwxr-xr-x  3 nalin nalin 4096 Jun 27 20:44 elm
drwxr-xr-x  2 nalin nalin 4096 Jul 11 21:36 erlang
drwxr-xr-x  2 nalin nalin 4096 Jun 30 14:51 haskell
drwxr-xr-x 12 nalin nalin 4096 Jul  9 23:03 klipse
drwxr-xr-x  4 nalin nalin 4096 Feb 14 22:19 lfe
drwxr-xr-x  2 nalin nalin 4096 Mar 25 14:43 lisp
drwxr-xr-x  5 nalin nalin 4096 Jul  3 17:42 mongodb
drwxr-xr-x  2 nalin nalin 4096 Jul 10 20:58 ocaml
drwxr-xr-x  3 nalin nalin 4096 Jul 13 20:53 sml
:~$ ls -al /usr/local/lib/clojure/
总计 20
drwxr-xr-x  3 root root 4096 Jul 13 18:09 .
drwxr-xr-x 15 root root 4096 Jul  9 22:45 ..
-rw-r--r--  1 root root  458 Jul 13 18:09 deps.edn
-rw-r--r--  1 root root 1489 Jul 13 18:09 example-deps.edn
drwxr-xr-x  2 root root 4096 Jul 13 18:09 libexec
:~$ ls -al /usr/local/lib/clojure/libexec/
总大小 14596
drwxr-xr-x 2 root root     4096 Jul 13 18:09 .
drwxr-xr-x 3 root root     4096 Jul 13 18:09 ..
-rw-r--r-- 1 root root 14932202 Jul 13 18:09 clojure-tools-1.10.3.855.jar
-rw-r--r-- 1 root root     2955 Jul 13 18:09 exec.jar
这一条可能有助于理解... 我希望如此.... 如果你做到了,也请帮我理解...

:~$ su
密码
root@ranjan-t410:/home/nalin# cd ~
root@ranjan-t410:~# clj
Clojure 1.10.3
user=>
root@ranjan-t410:~# cd /home/nalin/
root@ranjan-t410:/home/nalin# clj
root@ranjan-t410:/home/nalin#
src/clojure里有什么?这正是导致你问题的原因。

默认情况下,clj/clojure会在src目录中查找命名空间,由于你有src/clojure目录,将会对应一个以clojure.something开头的命名空间。

将那个src文件夹重命名为source,我打赌你的问题就会消失(你可能需要使用clj -Sforce获取REPL,以强制重新计算类路径缓存等)。

编辑了
我把我的实践保存在 ~/src 中,所以大部分情况下 ~/src/clojure 将包含我的 Clojure 相关实践程序。

你说对了...我把 "src" 重命名为 "source",确实有 REPL 机制存在。

:~$ clj
Clojure 1.10.3
user=>

干得好....

不过,我很想知道,这能否在任何包含 "src" 文件夹的目录中发生,并且我尝试在那个目录中启动 clj?? 我已经在 Stackoverflow 上问过同样的问题,并希望把你的回复作为答案链接过去...
其实,只要您有一个 src 文件夹,并且其中有一个路径指向您想运行的命名空间对应的 Clojure 源文件,这种情况都可能出现。

例如,如果您有 src/elm/test.clj,那么在启动 REPL 后执行 (require `[elm.test]),Clojure 会尝试加载该文件。

如果您有 src/haskell/project/Stuff.hs,并且您从 REPL 尝试 (require `[haskell.project.foo]),Clojure 将在 src/haskell/project/ 中寻找一个名为 foo.clj(或 foo.cljc)的文件。

这是因为 Clojure 项目通常有一个 src 文件夹(以及通常,一个 test 文件夹——但是您通常通过别名将其添加到路径中,例如 clj -A:test,并且 :test 别名将具有 :extra-paths ["test"]——现在 Clojure 将同时检查 src 和 test 文件夹。
0

你好,

  • 你能否提供在 ~ 目录和 ~/src 目录下运行 which clj 命令的输出?

  • 你能否提供 env 命令的输出?








































***********************************************































0




发生了一件有趣的事情......我创建了一个 ~/.cpcache 目录......异常已经消失了......但是 repl 仍然无法启动,我回到了终端......静静地回到了终点......我关闭了终端,甚至在系统上重新启动,还是同样的行为......没有更多的异常,但是在终端中静静地退出...
你有 ~/deps.edn 吗?
没有..... 我也没有用 ~/deps.edn 尝试过......稍等一下...

我已经将 ~/.clojure/deps.edn 复制到 ~/deps.edn......但是结果仍然是沉默的退出...
by
无需创建,只是想知道是否还有其他原因。

是否与 `clojure` 有同样的行为?你可以试试 `clojure -M -r` 也吗?
是的...... "clojure -M -r" 也无声退出。

它们在提示符出现之前大概需要花费 1 秒左右的时间......不知道这有多重要......

其他任何目录都行。

你有需要我共享的任何日志吗?
`clojure` 脚本可能在某个地方出错,但我不知道为什么或在哪里。我对接下来该尝试什么感到困惑。你可以试试类似 `bash -x clojure` 的命令吗?也许这会给我们一些失败的线索。
"bash -x clojure" 在 ~.... 的输出

:~$ bash -x clojure
+ set -e
+ install_dir=/usr/local/lib/clojure
+ version=1.10.3.855
+ print_classpath=false
+ describe=false
+ verbose=false
+ trace=false
+ force=false
+ repro=false
+ tree=false
+ pom=false
+ help=false
+ prep=false
+ jvm_opts=()
+ resolve_aliases=()
+ classpath_aliases=()
+ repl_aliases=()
+ mode=repl
+ '[' 0 -gt 0 ']'
+ set +e
++ type -p java
+ JAVA_CMD=/usr/bin/java
+ set -e
+ [[ -z /usr/bin/java ]]
+ false
+ tools_cp=/usr/local/lib/clojure/libexec/clojure-tools-1.10.3.855.jar
+ [[ -n '' ]]
+ [[ -n '' ]]
+ config_dir=/home/nalin/.clojure
+ [[ ! -d /home/nalin/.clojure ]]
+ [[ ! -e /home/nalin/.clojure/deps.edn ]]
+ [[ -n '' ]]
+ [[ -n '' ]]
+ user_cache_dir=/home/nalin/.clojure/.cpcache
+ config_project=deps.edn
+ false
+ config_user=/home/nalin/.clojure/deps.edn
+ config_paths=("$install_dir/deps.edn" "$config_dir/deps.edn" "deps.edn")
++ printf ",%s /usr/local/lib/clojure/deps.edn /home/nalin/.clojure/deps.edn deps.edn"
+ config_str=,/usr/local/lib/clojure/deps.edn,/home/nalin/.clojure/deps.edn,deps.edn
+ config_str=/usr/local/lib/clojure/deps.edn,/home/nalin/.clojure/deps.edn,deps.edn
+ [[ -f deps.edn ]]
+ cache_dir=/home/nalin/.clojure/.cpcache
++ join ''
++ local d=
++ shift
++ echo -n ''
++ shift
++ printf %s
++ join ''
++ local d=
++ shift
++ echo -n ''
++ shift
++ printf %s
++ join ''
++ local d=
++ shift
++ echo -n ''
++ shift
++ printf %s
+ val='|||||'
+ for config_path in "${config_paths[@]}"
+ [[ -f /usr/local/lib/clojure/deps.edn ]]
+ val='||||||/usr/local/lib/clojure/deps.edn'
+ for config_path in "${config_paths[@]}"
+ [[ -f /home/nalin/.clojure/deps.edn ]]
+ val='||||||/usr/local/lib/clojure/deps.edn|/home/nalin/.clojure/deps.edn'
+ for config_path in "${config_paths[@]}"
+ [[ -f deps.edn ]]
+ val='||||||/usr/local/lib/clojure/deps.edn|/home/nalin/.clojure/deps.edn|NIL'
++ echo '||||||/usr/local/lib/clojure/deps.edn|/home/nalin/.clojure/deps.edn|NIL'
++ cksum
++ cut '-d ' -f 1
+ ck=2013855593
+ libs_file=/home/nalin/.clojure/.cpcache/2013855593.libs
+ cp_file=/home/nalin/.clojure/.cpcache/2013855593.cp
+ jvm_file=/home/nalin/.clojure/.cpcache/2013855593.jvm
+ main_file=/home/nalin/.clojure/.cpcache/2013855593.main
+ basis_file=/home/nalin/.clojure/.cpcache/2013855593.basis
+ false
+ stale=false
+ false
+ false
+ false
+ false
+ '[' '!' -f /home/nalin/.clojure/.cpcache/2013855593.cp ']
+ for config_path in "${config_paths[@]}"
+ '[' /usr/local/lib/clojure/deps.edn -nt /home/nalin/.clojure/.cpcache/2013855593.cp ']
+ for config_path in "${config_paths[@]}"
+ '[' /home/nalin/.clojure/deps.edn -nt /home/nalin/.clojure/.cpcache/2013855593.cp ']
+ for config_path in "${config_paths[@]}"
+ '[' deps.edn -nt /home/nalin/.clojure/.cpcache/2013855593.cp ']
+ false
+ false
+ [[ false = true ]]
+ false
+ [[ -n '' ]]
++ cat /home/nalin/.clojure/.cpcache/2013855593.cp
配置参数 cp=源路径:/home/nalin/.m2/repository/org/clojure/clojure/1.10.3/clojure-1.10.3.jar:/home/nalin/.m2/repository/org/clojure/core.specs.alpha/0.2.56/core.specs.alpha-0.2.56.jar:/home/nalin/.m2/repository/org/clojure/spec.alpha/0.2.194/spec.alpha-0.2.194.jar
+ false
+ false
+ false
+ false
+ false
+ false
+ 设置环境
+ [[ -e /home/nalin/.clojure/.cpcache/2013855593.jvm ]]
+ '[' repl == exec ']'
+ [[ -e /home/nalin/.clojure/.cpcache/2013855593.main ]]
+ '[' 0 -gt 0 ']'
+ 执行 /usr/bin/java -Dclojure.basis=/home/nalin/.clojure/.cpcache/2013855593.basis -classpath 源路径:/home/nalin/.m2/repository/org/clojure/clojure/1.10.3/clojure-1.10.3.jar:/home/nalin/.m2/repository/org/clojure/core.specs.alpha/0.2.56/core.specs.alpha-0.2.56.jar:/home/nalin/.m2/repository/org/clojure/spec.alpha/0.2.194/spec.alpha-0.2.194.jar clojure.main
"bash -x clojure" 在 ~/Downloads 的输出...

:~/Downloads$ bash -x clojure
+ set -e
+ install_dir=/usr/local/lib/clojure
+ version=1.10.3.855
+ print_classpath=false
+ describe=false
+ verbose=false
+ trace=false
+ force=false
+ repro=false
+ tree=false
+ pom=false
+ help=false
+ prep=false
+ jvm_opts=()
+ resolve_aliases=()
+ classpath_aliases=()
+ repl_aliases=()
+ mode=repl
+ '[' 0 -gt 0 ']'
+ set +e
++ type -p java
+ JAVA_CMD=/usr/bin/java
+ set -e
+ [[ -z /usr/bin/java ]]
+ false
+ tools_cp=/usr/local/lib/clojure/libexec/clojure-tools-1.10.3.855.jar
+ [[ -n '' ]]
+ [[ -n '' ]]
+ config_dir=/home/nalin/.clojure
+ [[ ! -d /home/nalin/.clojure ]]
+ [[ ! -e /home/nalin/.clojure/deps.edn ]]
+ [[ -n '' ]]
+ [[ -n '' ]]
+ user_cache_dir=/home/nalin/.clojure/.cpcache
+ config_project=deps.edn
+ false
+ config_user=/home/nalin/.clojure/deps.edn
+ config_paths=("$install_dir/deps.edn" "$config_dir/deps.edn" "deps.edn")
++ printf ",%s /usr/local/lib/clojure/deps.edn /home/nalin/.clojure/deps.edn deps.edn"
+ config_str=,/usr/local/lib/clojure/deps.edn,/home/nalin/.clojure/deps.edn,deps.edn
+ config_str=/usr/local/lib/clojure/deps.edn,/home/nalin/.clojure/deps.edn,deps.edn
+ [[ -f deps.edn ]]
+ cache_dir=/home/nalin/.clojure/.cpcache
++ join ''
++ local d=
++ shift
++ echo -n ''
++ shift
++ printf %s
++ join ''
++ local d=
++ shift
++ echo -n ''
++ shift
++ printf %s
++ join ''
++ local d=
++ shift
++ echo -n ''
++ shift
++ printf %s
+ val='|||||'
+ for config_path in "${config_paths[@]}"
+ [[ -f /usr/local/lib/clojure/deps.edn ]]
+ val='||||||/usr/local/lib/clojure/deps.edn'
+ val='||||||/usr/local/lib/clojure/deps.edn|/home/nalin/.clojure/deps.edn|NIL'
++ echo '||||||/usr/local/lib/clojure/deps.edn|/home/nalin/.clojure/deps.edn|NIL'
++ cksum
++ cut '-d ' -f 1
+ ck=2013855593
+ libs_file=/home/nalin/.clojure/.cpcache/2013855593.libs
+ cp_file=/home/nalin/.clojure/.cpcache/2013855593.cp
+ jvm_file=/home/nalin/.clojure/.cpcache/2013855593.jvm
+ main_file=/home/nalin/.clojure/.cpcache/2013855593.main
+ basis_file=/home/nalin/.clojure/.cpcache/2013855593.basis
+ false
+ stale=false
+ false
+ false
+ false
+ false
+ '[' '!' -f /home/nalin/.clojure/.cpcache/2013855593.cp ']
+ for config_path in "${config_paths[@]}"
+ '[' /usr/local/lib/clojure/deps.edn -nt /home/nalin/.clojure/.cpcache/2013855593.cp ']
+ for config_path in "${config_paths[@]}"
+ '[' /home/nalin/.clojure/deps.edn -nt /home/nalin/.clojure/.cpcache/2013855593.cp ']
+ for config_path in "${config_paths[@]}"
+ '[' deps.edn -nt /home/nalin/.clojure/.cpcache/2013855593.cp ']
+ false
+ false
+ [[ false = true ]]
+ false
+ [[ -n '' ]]
++ cat /home/nalin/.clojure/.cpcache/2013855593.cp
配置参数 cp=源路径:/home/nalin/.m2/repository/org/clojure/clojure/1.10.3/clojure-1.10.3.jar:/home/nalin/.m2/repository/org/clojure/core.specs.alpha/0.2.56/core.specs.alpha-0.2.56.jar:/home/nalin/.m2/repository/org/clojure/spec.alpha/0.2.194/spec.alpha-0.2.194.jar
+ false
+ false
+ false
+ false
+ false
+ false
+ 设置环境
+ [[ -e /home/nalin/.clojure/.cpcache/2013855593.jvm ]]
+ '[' repl == exec ']'
+ [[ -e /home/nalin/.clojure/.cpcache/2013855593.main ]]
+ '[' 0 -gt 0 ']'
+ 执行 /usr/bin/java -Dclojure.basis=/home/nalin/.clojure/.cpcache/2013855593.basis -classpath 源路径:/home/nalin/.m2/repository/org/clojure/clojure/1.10.3/clojure-1.10.3.jar:/home/nalin/.m2/repository/org/clojure/core.specs.alpha/0.2.56/core.specs.alpha-0.2.56.jar:/home/nalin/.m2/repository/org/clojure/spec.alpha/0.2.194/spec.alpha-0.2.194.jar clojure.main
Clojure 1.10.3
user=>
这本身表现不一致...在 ~/Downloads 上运行正常,但在 ~ 上不正常...在 ~ 上,终端窗口自己也消失了...我必须重新启动我的终端窗口...即使在 ~/Downloads,Ctrl-D 和 Ctrl-C-C 也会使终端窗口消失...

exec /usr/bin/java -Dclojure.basis=/home/nalin/.clojure/.cpcache/2013855593.basis -classpath 源路径:/home/nalin/.m2/repository/org/clojure/clojure/1.10.3/clojure-1.10.3.jar:/home/nalin/.m2/repository/org/clojure/core.specs.alpha/0.2.56/core.specs.alpha-0.2.56.jar:/home/nalin/.m2/repository/org/clojure/spec.alpha/0.2.194/spec.alpha-0.2.194.jar clojure.main
尝试不使用 exec
静默退出...
by
exec用当前进程(您的终端shell)替换启动的java进程,因此您不希望从命令行执行此操作。但,您确实在那里得到了repl。

我无法解释您看到的。可能与bash本身或主目录的权限有关,但我不确定是什么,也不知道如何进行调试。
by
repl在我的机器上不可用并非问题... 除了~以外的任何目录都可以。甚至能在Emacs中运行程序... 因此,它不会影响我...

我想分享一下...以防你觉得需要执行更多步骤,请告诉我,我可以分享执行结果,如果那有帮助的话...只是觉得有点尴尬...

除了bash之外,您还希望我尝试其他任何shell吗?顺便说一下,我试了"sh -x clojure",但给了我这个...
:~$ sh -x clojure
sh: 0: 无法打开clojure
by
我认为这并不是关于shell的问题...但这只是一个直觉...
0
by

我也很想知道~中的clj -Spath的输出。明显的是Clojure本身没有被添加到类路径中。如果您有~/.clojure/deps.edn,您也可以尝试将其移到一边。

by
:~$ clj -Spath
src:/home/nalin/.m2/repository/org/clojure/clojure/1.10.3/clojure-1.10.3.jar:/home/nalin/.m2/repository/org/clojure/core.specs.alpha/0.2.56/core.specs.alpha-0.2.56.jar:/home/nalin/.m2/repository/org/clojure/spec.alpha/0.2.194/spec.alpha-0.2.194.jar

我应该尝试删除~/.clojure/deps.edn吗??
by
不确定以下信息是否有用...

:~$ mvn --version
Apache Maven 3.6.0
Maven 安装路径: /usr/share/maven
Java 版本: 11.0.11, 供应商:Debian,运行时:/usr/lib/jvm/java-11-openjdk-amd64
默认区域设置:en_IN,平台编码:UTF-8
操作系统名称:“linux”,版本:“4.19.0-17-amd64”,架构:“amd64”,家族:“unix”


:~$ java --version
openjdk 11.0.11 2021-04-20
OpenJDK 运行时环境(构建 11.0.11+9-post-Debian-1deb10u1)
OpenJDK 64 位服务器 VM(构建 11.0.11+9-post-Debian-1deb10u1,混合模式,共享)
...