cryogen博客模板更新,阻止ring-server默认打开浏
公司2018年使用cryogen搭建的blog年久失修,从搭建起来就没有更新过,2020年疫情期间,主人carmen.la是有更新的。
看项目目录结构,貌似没有多大的变化,因为我们的blog不识别markdown的table,而用最新模板new出的是没问题的,因此打算升个级。
目测应该10分钟的工作量,结果搞了2个小时。
复盘
然而事情总是预料的非常不准确,本文还原一下事发现场。
本地新建blog
第一步,创建新工程
lein new cryogen my-blog
第二步,把原blog里的posts和img拷贝到my-blog
第三步,启动
lein serve
这里,发现启动命令也改了,以前是lein ring server
。
本地一切顺利,浏览器打开localhost:3000
,出现蓝色主题的blog。从原blog上复制出主题切换成【nucleus】,如愿以偿。
迁移到服务器
整个目录copy到linux服务器,启动,出错了
"Elapsed time: 751.989566 msecs"
2021-07-20 23:24:08.512:INFO:oejs.Server:jetty-7.6.13.v20130916
2021-07-20 23:24:08.535:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:3000
Started server on port 3000
Syntax error (HeadlessException) compiling at (/tmp/form-init7856530998871865073.clj:1:73).
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
Full report at:
/tmp/clojure-4617941323880185994.edn
这个错的原因是打不开浏览器,因为linux上没有浏览器。
尝试解决
- 尝试一:path里增加DISPLAY配置
具体参考Linux 报 java.awt.HeadlessException 错误解决方案在/etc/profile
文件里增加export DISPLAY=localhost:0.0
,这句配置,然后source /etc/profile
,重新运行。
错误如下:
"Elapsed time: 766.25861 msecs"
2021-07-20 22:54:01.292:INFO:oejs.Server:jetty-7.6.13.v20130916
2021-07-20 22:54:01.315:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:3000
Started server on port 3000
Syntax error (AWTError) compiling at (/tmp/form-init8467355736696636285.clj:1:73).
Can't connect to X11 window server using ':0' as the value of the DISPLAY variable.
Full report at:
/tmp/clojure-1417895621846917199.edn
edn文件内
{:clojure.main/message
"Syntax error (AWTError) compiling at (/tmp/form-init8467355736696636285.clj:1:73).\nCan't connect to X11 window server using ':0' as the value of the DISPLAY variable.\n",
:clojure.main/triage
{:clojure.error/phase :compile-syntax-check,
:clojure.error/line 1,
:clojure.error/column 73,
:clojure.error/source "form-init8467355736696636285.clj",
:clojure.error/path "/tmp/form-init8467355736696636285.clj",
:clojure.error/class java.awt.AWTError,
:clojure.error/cause
"Can't connect to X11 window server using ':0' as the value of the DISPLAY variable."},
:clojure.main/trace
{:via
[{:type clojure.lang.Compiler$CompilerException,
:message
"Syntax error compiling at (/tmp/form-init8467355736696636285.clj:1:73).",
:data
{:clojure.error/phase :compile-syntax-check,
:clojure.error/line 1,
:clojure.error/column 73,
:clojure.error/source "/tmp/form-init8467355736696636285.clj"},
:at [clojure.lang.Compiler load "Compiler.java" 7648]}
{:type java.awt.AWTError,
:message
"Can't connect to X11 window server using ':0' as the value of the DISPLAY variable.",
:at
[sun.awt.X11GraphicsEnvironment
initDisplay
"X11GraphicsEnvironment.java"
-2]}],
:trace
[[sun.awt.X11GraphicsEnvironment
initDisplay
"X11GraphicsEnvironment.java"
-2]
[sun.awt.X11GraphicsEnvironment
access$200
...
后面的不粘贴了。
- 尝试二:这一步把配置加在
~/.bashrc
和/etc/bashrc
里也是不起作用的。
还有人说命令换成下面的可能起作用,都试过没有奏效的。
export DISPLAY=:0
export DISPLAY=localhost:0.0
export DISPLAY=localhost:1.0
export DISPLAY=":0.0"
- 在启动命令加jvm参数
因为异常是java.awt.HeadlessException
, 查资料看具体是在project.clj里配置jvm参数
:jvm-opts ["-Djava.awt.headless=true"]
还是没有起作用。
- 尝试三:配置:open-browser? false
加载项目跟目录的project.clj
:plugins [[lein-ring "0.12.5"]]
:main cryogen.core
:ring {:init cryogen.server/init
:handler cryogen.server/handler
:open-browser? false}
:aliases {"serve" ["run" "-m" "cryogen.server"]
"serve-fast" ["run" "-m" "cryogen.server" "fast"]}
没有起作用,还是headlessException。
解决
在src/cryogen/server.clj
里添加配置,在here的 ring-server 处添加配置:open-browser? false
加上以后
(defn serve
"Entrypoint for running via tools-deps (clojure)"
[{:keys [fast] :as opts}]
(ring-server/serve
handler
(merge {:init (partial init fast)
:open-browser? false} opts)))
修改后执行lein serve
,就不会默认打开浏览器了。
一个插曲
看到github上有deploying-your-site的介绍,上面启动失败的情况,虽然失败了,但是public
目录下还是编译好了博客的html文件,于是用nginx代理了一下。
结果页面出来了,但是跟丢了样式一样不正常,本地很好复现。
看控制台出现hljs is not defined #238的错误,猜测跟code-syntax-highlighting, 没有深究放弃这个方案了。
赠送---修改端口
如果要修改端口,也是在src/cryogen/server.clj
,将-main
函数制定的port进行替换。