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

时间:2010-03-08 20:18:18

标签: java build clojure maven leiningen

我想用leiningen建立和开发我的clojure项目。有没有办法修改project.clj告诉它从本地目录中挑选一些罐子?

我有一些专有的罐子无法上传到公共回购。

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

由于

11 个答案:

答案 0 :(得分:61)

只需在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数据Bean实例,例如

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

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

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

答案 1 :(得分:46)

  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

  5. 警告可以忽略,因为jar将被检入项目而不是从互联网上下载。

    原始来源: Using local JAR's with Leiningen (自复制后更改)

答案 2 :(得分:36)

你可以把你的私人罐子放在lib/中,为了lein swank等目的,他们会在类路径上;这似乎打败了使用依赖管理工具的重点,但如果你实际上想要管理这些依赖项,你可以将Leiningen视为“开源依赖管理工具”并且可能要小心与lein clean

随着情况变得越来越复杂 - 涉及的私人罐数量越来越多,它们也在不断发展,您需要考虑一些版本信息--Arthur创建私有Maven回购的想法可能更合适。 / p>


(人力资源部门代表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 mavenclojure-maven-plugin; this blog posting旨在对尝试与Clojure使用maven的人有用。我记得,Meikel Brandmeyer(也是他在kotarak的在线句柄上的SO)使用Gradle(一个Groovy构建系统)和一个插件来容纳Clojure,称为Clojuresque;我自己从未尝试过,因为不知道关于Groovy的第一件事,但他声称用它做了一个非常好的建筑行为,我相信它与maven无关 - 这本身就是一个加号本身对于我们中的一些人: - )

答案 3 :(得分:27)

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

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


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


这允许像任何其他:dependencies [[project-name "version"]]

一样调用库

答案 4 :(得分:14)

我认为“正确”的方法是create a private Maven Repository,这样您就可以将罐子存储在一个位置,所有分支等都会获取更改。对于你的所作所为,这可能有点过头了。我很好奇这些是否更容易。

答案 5 :(得分:9)

您可能希望使用插件lein-localrepohttps://github.com/kumarshantanu/lein-localrepo

答案 6 :(得分:4)

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

这应该允许您将工件发布到私人远程仓库。

答案 7 :(得分:2)

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

答案 8 :(得分:2)

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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

最佳选择是设置私有JFrog / Nexus工件并在那里部署快照/版本,然后在项目中将该工程添加为存储库.clj

其他更简单的方法是

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

N.B。不再支持部署到Clojars的SCP

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

相关问题