如果我在结帐时有依赖性,如何使用lein uberjar创建Clojure应用程序?

时间:2020-05-12 17:55:53

标签: clojure leiningen uberjar

我有一个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命令似乎看不到它。

我该如何解决?

2 个答案:

答案 0 :(得分:1)

您可以通过在本地存储库(〜/ .m2 / repository)中安装mylib来完成此操作。

  1. 在相关项目中运行lein install,将其安装在本地存储库中。
  2. 将项目添加到:dependencies中的project.clj

    [mylib "version"]

  3. 在主项目中运行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 testlein 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个选项:

  1. 如果该库存在于Clojars或Maven上,则可能应在制作uberjar之前在其中部署发行版。如果该库尚未准备好用于Clojars或Maven,则可能您还没有准备好在uberjar中使用它??

  2. 只需在项目的mylib目录下复制./src的源树(或使用符号链接!)。您还必须将依赖项复制到myproj/project.clj中。您正在有效地将myproj和mylib合并,至少暂时是通过这种方法进行的。如果两者紧密结合,需要共同开发,也许应该是永久合并?