leiningen-如何为本地jar添加依赖项?


117

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

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

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

谢谢


1
感谢大家。正如大家指出的那样,这是一个棘手的问题,目前尚无明确答案。
signaleeker

Answers:


38

您可以将您的私人罐子放进lib/去,出于lein swank诸如此类的目的,它们会放在类路径中;这似乎确实使使用依赖项管理工具的意义大打折扣,尽管如果您实际上不希望管理那些依赖项,则可以将Leiningen视为“开放源代码依赖项管理工具”,并且可能要当心lein clean

随着情况变得更加复杂-涉及到更多的私有jar,它们在发展,您需要考虑一些版本信息-Arthur创建私有Maven回购的想法可能更合适。


(HR表示特定于Leiningen的零件分界点...继续下面以获取Clojure领域中一般的构建/依赖管理工具故事的信息,包括一些我认为可能对您有用的链接。)

此外,到目前为止,关于哪一个是Clojure的最佳构建工具这一问题尚未达成共识,而Leiningen在赢得广泛关注的同时,也在不断地在功能和抛光方面获得收益-特别是,这意味着尚未完成。这是语用书架的“ Programming Clojure”一书的作者Stuart Halloway的话:“我的2c:Leiningen是重要的一步,但仍有很多工作要做。” 有关完整的发布和非常有趣的讨论,请参见Leiningen,Clojure和库:在Clojure空间中构建工具等,我想念的是什么?Clojure Google网上论坛上的主题。许多参与者特别提到需要使本地依赖项不包含在任何存储库中,无论是本地存储库还是其他存储库,并详细说明他们针对此类情况提出的解决方案。也许您可以看到那里是否有什么现在可以解决您的问题/将来在功能集成熟时可以解决?

无论如何,Leiningen实际上可能还没有为某些复杂情况准备好故事。如果您认为这对您的情况是正确的(并且我的意思是在考虑了私有回购想法之后),那么下面是一些指向上述线程中基于maven的替代方法的链接:polyglot mavenclojure-maven-plugin此博客发布旨在对试图与Clojure一起使用Maven的人有用。我记得,梅克尔·布兰德迈尔(Meikel Brandmeyer)也在Gradle(一种Groovy构建系统)的支持下使用Gradle(一种Groovy构建系统)来容纳名为Clojuresque的Clojure。我从来没有亲自尝试过,因为不了解Groovy的第一件事,但是他声称要与它做一个非常好的建筑行为,我相信这与Maven无关-这本身就是一个优点。对于我们中的一些人。:-)


2
回复:“关于哪个是Clojure的最佳构建工具这一问题尚未达成普遍共识。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。2013年调查结果:lein-survey-2013.herokuapp.com/results
David J.

8
从Leiningen v2开始,lib /目录功能已被删除。请参阅:github.com/technomancy/leiningen/wiki/...
Jared314

到目前为止,Leiningen可能仍然是最受欢迎的,但是Boot也很受欢迎。
火星

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/*"]

Lein 2不支持通配符,但如果需要,可以使用github.com/dchelimsky/lein-expand-resource-paths插件。
2013年

2
这是我到目前为止看到的最好的答案。本地mvn安装似乎不再对我有用。
David Williams

7
这不适用于uberjar,因为uberjar会在jar中添加依赖项jar,而不是添加依赖项类文件。
Tobias Domhan

50
  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 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结合使用(自复制以来已更改)


此链接上的好步骤。这对我很有帮助。
goger 2012年

2
对于较新的版本,您可能希望使用mvn deploy:deploy-file而不是install:install-file并指定-Durl = file:repo而不是-DlocalRepositoryPath = repo。然后,您可以在projects.clj中使用::repositories {“ local”“ file:maven_repository”}请参见:gist.github.com/stuartsierra/3062743(我编辑了问题,但仍需批准)
Tobias Domhan

33

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

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


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


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


3
与其他解决方案相比,它是如此简单且有效!无需安装Maven。谢谢。
dkinzer

您如何在lein工程文件中引用生成的jar?
星际

像其他任何人一样:dependencies [[project-name "version"]]
-roboli

1
这在Windows上也很好用。如前所述,无需安装Maven。我已经在Windows上使用IntelliJ + Cursive进行了尝试,它可以完美运行。在Windows命令行上做了“ lein pom; lein jar; lein安装”。
endbegin's

4
您只需要做lein install。它将为您构建罐子和pom。
neverfox

15

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


5
谢谢,我会调查一下。尽管我不得不说,行家让我心生恐惧。如果您知道执行此操作的任何简单分步示例,请指向我。为什么在Java世界中构建如此复杂?
signaleeker



3

这些解决方案都无法解决我的问题。相反,我已经安装了本地存储库,并使用maven将jar文件安装在本地存储库中,并将本地存储库添加到我的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 ]




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进行使用。

注意:不再支持部署到Clojars的SCP

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.