我有一个Clojure应用程序,该应用程序使用的库是从“ checkouts”目录内部进行符号链接的。
这使我可以同时处理应用程序和库。而且lein知道如何编译和运行该程序而没有任何问题。
但是我想与lein uberjar建立一个独立的平台,而且很抱怨
Caused by: java.io.FileNotFoundException: Could not locate mylib/core__init.class, mylib/core.clj or mylib/core.cljc on classpath.
我认为那是因为在我的project.clj文件中没有提到mylib。并不是因为我要使用在“结帐”中符号链接的mylib版本。
但是uberjar命令似乎看不到它。
我该如何解决?
答案 0 :(得分:1)
您可以通过在本地存储库(〜/ .m2 / repository)中安装mylib
来完成此操作。
lein install
,将其安装在本地存储库中。将项目添加到:dependencies
中的project.clj
:
[mylib "version"]
在主项目中运行lein uberjar
。
该项目将在您的本地存储库中找到该jar。
/编辑
如果要同时开发两个库,则可以使用checkouts文件夹,其中checkout包含指向从属库的符号链接。
mkdir checkouts
ln -nfs full-path-other-lib-dir full-path-checkouts-dir
其他库中的更改现在可以在主项目中立即获得。
请参阅[{https://github.com/technomancy/leiningen/blob/master/doc/TUTORIAL.md#checkout-dependencies](the莱宁根结帐文档)。
答案 1 :(得分:0)
好的,看来lein的“结帐”功能适用于lein test
和lein run
,但不适用于lein uberjar
。
我将以下内容添加到库tupelo.core
的本地源代码中:
(def dummy-sample-data "Bogus!")
在使用项目demo.core
中,我们可以访问新的Var:
(ns demo.core
(:use tupelo.core tupelo.test))
(defn -main [& args]
(println :foo-enter)
(spyx dummy-sample-data)
(println :foo-leave))
lein run
产生:
:foo-enter
dummy-sample-data => "Bogus!"
:foo-leave
project.clj
保持不变:
(defproject demo "0.1.0-SNAPSHOT"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [
[criterium "0.4.5"]
[org.clojure/math.combinatorics "0.1.6"]
[org.clojure/clojure "1.10.1"]
[prismatic/schema "1.1.12"]
[tupelo "0.9.201"]
<snip>
其中"0.9.201"
是Clojars上tupelo
的最新版本。结帐方式如下:
~/expr/demo > ls -ldF checkouts/*
lrwxrwxrwx 1 alan alan 17 May 12 13:57 checkouts/tupelo -> /home/alan/tupelo/
但是uberjar失败:
~/expr/demo > lein clean ; lein uberjar
Compiling demo.core
Syntax error compiling at (demo/core.clj:6:3).
Syntax error compiling at (demo/core.clj:6:3).
Unable to resolve symbol: dummy-sample-data in this context
Full report at:
/tmp/clojure-10416346559924917196.edn
Compilation failed: Subprocess failed
选项
如果要部署应用程序,则有2个选项:
如果该库存在于Clojars或Maven上,则可能应在制作uberjar之前在其中部署发行版。如果该库尚未准备好用于Clojars或Maven,则可能您还没有准备好在uberjar中使用它??
只需在项目的mylib
目录下复制./src
的源树(或使用符号链接!)。您还必须将依赖项复制到myproj/project.clj
中。您正在有效地将myproj和mylib合并,至少暂时是通过这种方法进行的。如果两者紧密结合,需要共同开发,也许应该是永久合并?