2024 年 Clojure 状态调查! 中分享您的观点。

欢迎!请查看 关于 页面以获取更多有关此类工作的信息。

0 投票
ClojureScript
重新分类

我是一个 Clojure 初学者,正在尝试学习 clj 工具。我正在遵循这个 https://betweentwoparens.com/start-a-clojurescript-app-from-scratch 教程,在命令 clj -A:dev 时遇到了以下错误

Downloading: com/google/protobuf/protobuf-java/3.0.2/protobuf-java-3.0.2.jar from central
Downloading: com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar from central
Downloading: com/google/code/gson/gson/2.7/gson-2.7.jar from central
Exception in thread "Thread-4" java.net.SocketException: Broken pipe (Write failed)
    at java.base/java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.base/java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:110)
    at java.base/java.net.SocketOutputStream.write(SocketOutputStream.java:150)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:167)
    at clojure.lang.Reflector.invokeInstanceMethod(Reflector.java:102)
    at cljs.repl.server$send_and_close.invokeStatic(server.clj:168)
    at cljs.repl.server$send_and_close.invoke(server.clj:144)
    at cljs.repl.browser$send_static.invokeStatic(browser.clj:205)
    at cljs.repl.browser$send_static.invoke(browser.clj:178)
    at cljs.repl.server$dispatch_request.invokeStatic(server.clj:191)
    at cljs.repl.server$dispatch_request.invoke(server.clj:182)
    at cljs.repl.server$handle_connection.invokeStatic(server.clj:199)
    at cljs.repl.server$handle_connection.invoke(server.clj:195)
    at cljs.repl.server$server_loop$fn__68.invoke(server.clj:209)
    at clojure.core$binding_conveyor_fn$fn__5754.invoke(core.clj:2030)
    at clojure.lang.AFn.run(AFn.java:22)
    at java.base/java.lang.Thread.run(Thread.java:834)

为什么我会遇到这个错误?我的环境

Ubuntu 18.04 在 Mac OSX Mojave 上的 VirtualBox 中无头虚拟机。

[I] /home/user/tallex~> java -version
openjdk version "11.0.6" 2020-01-14 LTS
OpenJDK Runtime Environment Corretto-11.0.6.10.1 (build 11.0.6+10-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.6.10.1 (build 11.0.6+10-LTS, mixed mode)

我也尝试了这样做

[I] /home/sporty/software~> java -version
openjdk version "11.0.6" 2020-01-14
OpenJDK Runtime Environment (build 11.0.6+10-post-Ubuntu-1ubuntu118.04.1)
OpenJDK 64-Bit Server VM (build 11.0.6+10-post-Ubuntu-1ubuntu118.04.1, mixed mode, sharing)

结果是相同的。

编辑:这与 CLJ 无法打开浏览器有关,因为我正在运行 Ubuntu 无头虚拟机。因此,我添加了端口转发到主机,似乎可以启动 X 窗口浏览器。

1 答案

0 投票

这是因为在无头虚拟机上运行。当我将端口转发添加到 VirtualBox 中时,似乎可以启动浏览器,但交互式环境没有启动。

浏览器中您看到了哪一页?
在浏览器中,我确实看到了教程中显示的页面,其中的 *时间潜水* 用粉红色到红色的渐变显示。
在Linux上,我用最基本的 `clj -M -m cljs.main -r` 也遇到了同样的问题。

官方ClojureScript快速入门指南有解决方案
https://script.clojure.org/guides/quick-start

>> 如果您正在运行Linux且REPL无法启动,请尝试禁用浏览器自动启动并手动打开 https://127.0.0.1:9000。

这意味着在命令中传递 `--repl-opts "{:launch-browser false}"` 选项
更多关于浏览器REPL选项的信息](https://script.clojure.org/reference/repl-options#_browser_repl_options)

所以,在您的情况下,您应该编辑 `deps.edn` 中的 `:dev` 别名为

(未经验证)

```
:aliases
 {:dev {:main-opts ["-m"  "cljs.main"
                    "-ro" "{:static-dir [\".\",\"out\",\"resources\"], :launch-browser false}"
                    "-w"  "src"
                    "-c"  "tallex.time-dive"
                    "-r"]}}}
```
...