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

Posted

技术标签:

【中文标题】leiningen - 如何为本地 jar 添加依赖项?【英文标题】:leiningen - how to add dependencies for local jars? 【发布时间】:2011-01-25 03:43:00 【问题描述】:

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

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

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

谢谢

【问题讨论】:

谢谢大家。正如我的每个人都指出的那样,这是一个棘手的问题,目前还没有明确的答案。 【参考方案1】:

最好的选择是设置一个私有 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 使用它。

注意不再支持将 SCP 部署到 Clojars

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

【讨论】:

【参考方案2】:

    在项目中创建目录:

    mkdir maven_repository

    将本地 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

    将以下内容添加到project.clj

    :repositories "local" "file:maven_repository"

    现在普通的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 下载。

原文出处:Using local JAR's with Leiningen(抄袭后更改)

【讨论】:

这个链接的好步骤。这对我很有帮助。 对于较新的版本,您可能希望使用 mvn deploy:deploy-file 而不是 install:install-file 并指定 -Durl=file:repo 而不是 -DlocalRepositoryPath=repo。然后在 projects.clj 中,您可以使用: :repositories "local" "file:maven_repository" 见:gist.github.com/stuartsierra/3062743(我编辑了问题,但仍需要批准)【参考方案3】:

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

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


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


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

【讨论】:

与其他解决方案相比,这非常简单而且有效!无需安装maven。谢谢。 如何在 lein 项目文件中引用生成的 jar? 和其他:dependencies [[project-name "version"]]一样 这在 Windows 上也很有效。不需要像已经提到的那样安装 maven。我已经在 Windows 上使用 IntelliJ + Cursive 进行了尝试,并且效果很好。在 Windows 命令行上执行了“lein pom;lein jar;lein install”。 你只需要lein install。它会为你构建 jar 和 pom。【参考方案4】:

这些解决方案都不适合我。相反,我安装了一个本地存储库,并使用 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]

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

只需在 project.clj 文件中使用 :resource-paths。我用它,例如连接到 Siebel 服务器。刚刚在我的项目目录中创建了一个 resources 目录,并在其中复制了 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 不支持 globbing,但如果您需要,可以使用 github.com/dchelimsky/lein-expand-resource-paths 插件。 这是迄今为止我看到的最好的答案。本地 mvn 安装似乎不再适合我了。 这不适用于 uberjar,因为 uberjar 会在 jar 中添加依赖 jar,而不是添加依赖类文件。【参考方案7】:

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

【讨论】:

【参考方案8】:

Phil 为 Leiningen 开发的 s3-wagon-private 插件:https://github.com/technomancy/s3-wagon-private

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

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

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

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


(HR 表示 Leiningen 特定的部分截止点...继续下面了解有关 Clojure 领域的一般构建/依赖管理工具故事的信息,包括一些我认为可以派上用场的链接你的情况。)

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

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

【讨论】:

回复:“对于哪个是 Clojure 的最佳构建工具的问题没有普遍的共识”......截至今天,Leiningen 似乎是现在失控的标准。 2013年调查结果:lein-survey-2013.herokuapp.com/results 从 Leiningen v2 开始,lib/ 目录功能已被删除。见:github.com/technomancy/leiningen/wiki/… 时至今日,Leiningen 可能仍然是最流行的,但 Boot 也很流行。【参考方案11】:

我相信“正确”的方法是create a private Maven Repository,这样您就可以将罐子存储在一个位置,您的所有分支等都会接受更改。这可能对你的所作所为有点矫枉过正。我很好奇这些方法是否更简单。

【讨论】:

谢谢,我会调查的。虽然我不得不说maven在我心中引起了恐惧。如果您知道任何简单的分步示例来做到这一点,请指出我。为什么在 Java 世界中构建如此复杂?

以上是关于leiningen - 如何为本地 jar 添加依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Hive 自定义 UDF 添加 JAR,使其在 HDInsight 群集上永久可用?

如何为maven项目添加依赖? (如何从外部 jar 文件中找出 GroupID / ArtifactID)[重复]

如何用 Leiningen 运行图书馆的`main`?

如何为本地 git (github) 存储库永久添加 SSH 密钥? [复制]

Maven - 如何为休眠添加所有必需的依赖项?

Leiningen 中的本地依赖项而不创建 Maven 存储库?