【转】Clojure 引用java文件 lein javac 报ClassNotFoundException


在luminus web的clojure模板里直接使用java文件的正确姿势。
简书地址

经过两次才彻底解决的一个问题,把同事总计的在自己的小本子上转存一下。猛戳此处进入我司blog系统。

在Clojure中使用Luminus进行Web开发时,如果有自定义Java文件,在开发环境中编译(lein javac)时,会出现ClassNotFoundException错误。

产生原因:在开发环境下,env->dev->clj->user.clj文件会自动加载,并且是在Java文件编译前执行。user.clj文件会引用core下的start-appcore.clj文件又会引用handler,如果在handler的引用文件中引用了自定义Java类时,就会出现ClassNotFoundException错误。

解决方法一:修改user.clj文件名

;; 1. 将 user.clj 文件名修改为 hctest.clj
;; 2. 修改 hctest.clj 文件命名空间
(ns hctest)
;; 3. 修改 project.clj 文件下的 :project/dev -> :repl-options -> :init-ns 值
{:project/dev
 {:repl-options
  {:init-ns hctest}}}

解决方法二:移动user.clj文件

;; 可选 --> 1. 修改 project.clj 下的 :profiles -> :uberjar -> :prep-tasks,在开始添加 "javac"
{:profiles
 {:uberjar 
  {:prep-tasks ["javac" "compile"]}}}

;; 2. 将 env->clj->user.clj 文件移到到指定文件夹下,比如 env->clj->empty-> user.clj,并修改命名空间为 empty.user
(ns empty.user)
;; 3. 修改 project.clj 下的 :project/dev -> :repl-options -> :init-ns 值
{:project/dev
 {:repl-options
  {:init-ns empty.user}}}

参考:

https://github.com/luminus-framework/luminus-template/issues/319


评论
  目录