118

我想使用 leiningen 来构建和开发我的 clojure 项目。有没有办法修改 project.clj 来告诉它从本地目录中选择一些 jars?

我有一些无法上传到公共存储库的专有 jar。

此外,可以使用 leiningen 来维护 clojure 项目的“lib”目录吗?如果我的一堆 clojure 项目共享相同的 jar,我不想为每个项目维护一个单独的副本。

谢谢

4

11 回答 11

64

只需在 project.clj 文件中使用:resource-paths即可。我使用它,例如连接到 Siebel 服务器。刚刚在我的项目目录中创建了一个资源目录并将 jar 文件复制到那里。但当然你可以使用更通用的目录:

(defproject test-project "0.1.0-SNAPSHOT"
:description "Blah blah blah"
...
:resource-paths ["resources/Siebel.jar" "resources/SiebelJI_enu.jar"])

然后从lein repl我可以创建 Siebel Data Bean 实例,例如

(def sbl (com.siebel.data.SiebelDataBean.))
(.login sbl "siebelServer" "user" "password")
...

如果您有较新的 Java 版本,您当然可以在路径规范中使用通配符,如下所示:

:resource-paths ["/tmp/SiebelJars/*"]
于 2012-12-28T13:41:24.763 回答
53
  1. 在项目中创建一个目录:

    mkdir maven_repository

  2. 将本地 jars 添加到此存储库:

    例如,此命令将jaad-0.8.3.jar文件添加到 maven 存储库:

    mvn deploy:deploy-file -Dfile=jaad-0.8.3.jar -DartifactId=jaad -Dversion=0.8.3 -DgroupId=jaad -Dpackaging=jar -Durl=file:maven_repository

  3. 将以下内容添加到project.clj

    :repositories {"local" "file:maven_repository"}

  4. 现在常规lein deps应该可以工作:

    $ lein deps Downloading: jaad/jaad/0.8.3/jaad-0.8.3.pom from local Transferring 0K from local [WARNING] *** CHECKSUM FAILED - Error retrieving checksum file for jaad/jaad/0.8.3/jaad-0.8.3.pom - IGNORING

可以忽略该警告,因为 jar 将被检入到项目中,而不是从 Internet 下载。

原始来源:使用本地 JAR 和 Leiningen(复制后更改)

于 2012-03-28T23:31:54.770 回答
39

你可以把你的私人罐子放进去lib/,它们会在类路径上用于lein swank类似的目的;这似乎违背了使用依赖管理工具的意义,但如果您实际上不想管理这些依赖,您可以将 Leiningen 视为“开源依赖管理工具”,并且可能要小心lein clean.

随着情况变得更加复杂——涉及的私有 jar 数量越来越多,它们会不断发展,您需要将一些版本信息考虑在内——亚瑟创建私有 Maven 存储库的想法可能更合适。


(HR 表示 Leiningen 特定的部分截止点...继续下面了解有关 Clojure 领域中一般构建/依赖管理工具故事的信息,包括一些我认为在您的情况下可能会非常方便的链接。)

此外,到目前为止,对于哪个是 Clojure 的最佳构建工具的问题还没有普遍的共识,而 Leiningen 在获得思想份额的同时,也在不断地获得该领域的功能和改进——尤其是,这意味着它还没有完成。以下是 Pragmatic Bookshelf 的“Programming Clojure”的作者 Stuart Halloway 的一句话:“我的 2c: Leiningen 是重要的一步,但还有很多工作要做。” 有关完整的帖子和非常有趣的讨论:在 Clojure 空间中构建工具等,请参阅Leiningen、Clojure 和库:我错过了什么?Clojure Google 组上的线程。许多参与者特别提到需要不包含在任何本地或其他存储库中的本地依赖项,并详细说明他们为此类场景提出的解决方案。也许您可以看看那里是否有任何东西可以解决您现在的问题/将来可能会在功能集成熟时解决它?

无论如何,Leiningen 可能实际上还没有为一些复杂的场景准备好故事。如果您觉得您的情况可能是这样(我的意思是在您考虑了私人回购的想法之后),这里有一些从上述线程中获取的基于 maven 的替代方案的链接:polyglot mavenclojure-maven-plugin这篇博文旨在对尝试将 maven 与 Clojure 一起使用的人有用。我记得,Meikel Brandmeyer(也在他的 kotarak 在线句柄下的 SO 上)使用 Gradle(一个 Groovy 构建系统)和一个名为 Clojuresque 的插件来容纳 Clojure。我自己从来没有尝试过,因为不知道关于 Groovy 的第一件事,但他声称用它运行了一个非常好的构建行为,我相信它与 maven 无关——这本身就是一个优点对于我们中的一些人。:-)

于 2010-03-08T22:24:26.800 回答
34

我发现lein pom; lein jar; lein install开发库时效果很好。

在正在开发的库中执行此操作,并且您需要它的应用程序将使用它而无需任何:repositoriesfoo。


或者,lein do pom, jar, install稍微简洁一些。


这允许像任何其他调用库一样:dependencies [[project-name "version"]]

于 2012-12-05T22:23:44.667 回答
15

我相信“正确”的方法是创建一个私有 Maven 存储库,以便您可以将 jar 存储在一个位置,并且您的所有分支等都将获取更改。这可能对你的所作所为有点矫枉过正。我很好奇这些是否是一种更简单的方法。

于 2010-03-08T21:47:35.363 回答
9

您可能喜欢使用该插件lein-localrepohttps ://github.com/kumarshantanu/lein-localrepo

于 2012-05-06T05:59:15.960 回答
4

最近的一项发展是 Phil 的s3-wagon-privateLeiningen 插件:https ://github.com/technomancy/s3-wagon-private

这应该允许您将工件发布到私有远程存储库。

于 2012-01-28T20:55:50.357 回答
3

这些解决方案都没有对我有用。相反,我安装了一个本地存储库,并使用 maven 将 jar 文件安装在本地 repo 中,并将本地 repo 添加到我的 project.clj

在命令行中:

mvn deploy:deploy-file -DgroupId=local -DartifactId=bar \
    -Dversion=1.0.0 -Dpackaging=jar -Dfile=bar.jar \
    -Durl=file:repo

我这样写我的project.clj:

(defproject foo "0.1.0-SNAPSHOT"
  :dependencies [[org.clojure/clojure "1.4.0"]
                 [local/bar "1.0.0"]]
  :repositories {"project" "file:repo"})

希望能帮助到你。

[参考:https ://gist.github.com/stuartsierra/3062743 ]

于 2014-11-21T16:56:39.347 回答
2

也许看看这个先前的答案,我提供了逐步说明来设置项目本地的存储库(通过访问file://),您可以在其中安装您的 jar。

于 2010-03-08T23:46:14.790 回答
0

试试我的解决方案如何使用依赖项构建 jar 文件 http://middlesphere-1.blogspot.ru/2014/06/how-to-make-jar-with-dependencies-using.html

于 2014-06-17T16:31:28.433 回答
0

最好的选择是设置一个私有 JFrog/Nexus 工件并在那里部署您的快照/版本,然后将该工件作为存储库添加到您的 project.clj

其他更简单的方法是

静态 HTTP最简单的私有存储库是指向一个充满静态文件的目录的 Web 服务器。如果目录是运行 Leiningen 的机器的本地目录,则可以在 :repositories 中使用 file:/// URL 以这种方式进行部署。

SCP 如果您已经使用 SSH 公钥设置了服务器,则 scp 传输是发布和使用私有依赖项的简单方法。将以下内容放在 defproject 中:

:plugins [[org.apache.maven.wagon/wagon-ssh-external "2.6"]]
:repositories [["releases" "scp://somerepo.com/home/repo/"]]

然后将以下内容放在defproject之外:

(cemerick.pomegranate.aether/register-wagon-factory!
 "scp" #(let [c (resolve 'org.apache.maven.wagon.providers.ssh.external.ScpExternalWagon)]
          (clojure.lang.Reflector/invokeConstructor c (into-array []))))

如果您设置 nginx 或类似的东西通过 HTTP 为存储库目录提供服务,也可以使用 scp 传输部署到存储库并通过 http 使用它。

NB SCP 部署到 Clojars 不再受支持

原始来源在这里https://github.com/technomancy/leiningen/blob/stable/doc/DEPLOY.md

于 2018-02-12T14:49:07.913 回答