leiningen - how to add dependencies for local jars?

I want to use leiningen to build and develop my clojure project. Is there a way to modify project.clj to tell it to pick some jars from local directories?

I have some proprietary jars that cannot be uploaded to public repos.

Also, can leiningen be used to maintain a "lib" directory for clojure projects? If a bunch of my clojure projects share the same jars, I don't want to maintain a separate copy for each of them.

Thanks

43197 次浏览

我相信“正确”的方法是 创建一个私有的 Maven 存储库,这样你就可以把罐子存储在一个单一的位置,你所有的分支机构等将采取的变化。你这么做可能有点过头了。我很好奇这是不是更简单的方法。

你可以把你的私有 jar 放在 lib/中,它们会出现在类路径中,用于 lein swank之类的目的; 这看起来确实违背了使用依赖关系管理工具的意义,尽管如果你实际上并没有管理 want这些依赖关系,你可以把 Leiningen 当作一个“开源依赖关系管理工具”,或许还要小心使用 lein clean

随着情况变得越来越复杂——涉及到更多的私有广告罐,它们在不断发展,你需要考虑到它们的版本信息—— Arthur 关于创建一个私有 Maven 回购的想法可能更合适。


(人力资源代表特定的部分截止点... 继续下面的信息在 Clojure 土地的一般构建/依赖管理工具的故事,包括一些链接,我认为可以在你的情况下非常方便。)

Also, as of yet, there is no universal agreement on the question of which is the best build tool for Clojure, and Leiningen, while gaining in mindshare, is also constantly gaining in the areas features and polish -- meaning, in particular, that it's not yet complete. Here's a quote from Stuart Halloway, the author of Pragmatic Bookshelf's "Programming Clojure": "My 2c: Leiningen is an important step, but there is still plenty to do." For the full posting and a very interesting discussion re: build tools and the like in Clojure space, see the Leiningen,Clojure 和库: 我遗漏了什么? thread on the Clojure Google group. Many participants specifically mention the need to have local dependencies not contained in any repositories, local or otherwise, and elaborate on the solutions they've come up with for such scenarios. Perhaps you could see if there's anything over there which can solve your problem now / might solve it in the future, when feature sets mature?

无论如何,Leiningen 可能实际上还没有为一些复杂的情况准备好一个好故事。如果你觉得你的情况可能是这样的(我的意思是在你考虑了私人回购的想法之后) ,这里有一些链接到基于 maven 的替代方案从上面提到的线程: polyglot mavenClojure-maven-plugin; this blog posting旨在对尝试使用 Clojure 的人有用。据我回忆,Meikel Brandmeyer (在他的在线 kotarak 名下也在 SO 上)使用 Gradle (一个 Groovy 构建系统)和一个插件来支持 Clojure,这个插件叫 Clojuresque; 我自己从来没有试过,因为我对 Groovy 一无所知,但是他声称用它来运行一个非常好的构建行为,我相信它和 maven 没有任何关系——对于我们中的一些人来说,这本身就是一个加号。:-)

Maybe have a look at this 上一个答案, I provide step by step instructions to setup a repository local to the project (accessed through file://) in which you could install your jars.

最近的发展是菲尔的 s3-wagon-private插件为 Leiningen: https://github.com/technomancy/s3-wagon-private

这应该允许您将工件发布到一个私有的远程回购。

  1. 在项目中创建一个目录:

    mkdir maven_repository

  2. 向这个存储库添加本地 jar:

    例如,此命令将 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 从 local 下载: jaad/jaad/0.8.3/jaad-0.8.3. pom 从本地转账0K [警告] * * CHECKSUM FAILED-检索 jaad/jaad/0.8.3/jaad-0.8.3. pom-IGNORING 校验和文件时出错

这个警告可以忽略,因为 jar 将被签入到项目中,而不会从因特网上下载。

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

你可能喜欢使用插件 lein-localrepo: https://github.com/kumarshantanu/lein-localrepo

我发现 lein pom; lein jar; lein install在开发库时工作得很好。

在正在开发的库中执行此操作,需要它的应用程序将使用它,而不需要任何 :repositories foo。


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


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

只需在 project.clj 文件中使用 < em > : 资源路径 。我使用它,例如连接到 Siebel 服务器。刚刚在我的项目目录中创建了一个 资源目录,并在其中复制了 jar 文件。当然,您可以使用更通用的目录:

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

然后从 (法语)我可以创建 Siebel Data Bean 实例,例如。

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

如果你有一个新的 Java 版本,你当然可以在你的路径规范中使用通配符,就像下面这样用于一个更通用的目录:

:resource-paths ["/tmp/SiebelJars/*"]

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

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

在命令行中:

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

And I write my project.clj like this:

(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]

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

其他更简单的方法是

静态 HTTP 最简单的私有存储库类型是指向满是静态文件的目录的 Web 服务器。如果目录是运行 Leiningen 的计算机的本地目录,那么可以在您的: 存储库中使用一个文件:///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 使用它。

不再支持将 SCP 部署到 Clojars

Original source is here https://github.com/technomancy/leiningen/blob/stable/doc/DEPLOY.md