确定Clojure Jar路径

8
这个问题的主要目的是澄清关于Clojure项目.clj依赖项以及如何指定本地依赖项的困惑。
我有一堆Clojure lein项目在一个树形结构中。
./projects/clojure/bene-csv # A csv parsing library
./projects/clojure/bene-cmp # A main program that depends on bene-csv

我正在编辑bene-cmp的project.clj文件。我想要添加一个依赖关系到./projects/clojure/bene-csv/bene-csv-1.0.0-SN.jar。
我需要使用简单的目录表示法来指定路径,还是其他什么方法?
谢谢。
编辑:
我可以通过在bene-csv项目目录中输入lein install,并在bene-cmp项目目录的project.clj文件中使用这些project.clj条目来包含bene-csv。
(defproject bene-cmp "1.0.0-SN"
  :description "This is the main benetrak/GIC comparison program."
  :dependencies [[org.clojure/clojure "1.3.0"]
                 [clojure-csv/clojure-csv "1.3.2"]
                 [bene-csv "1.0.0-SN"]])

然而,我仍然在努力弄清路径是什么,如果有任何指向或帮助,我将不胜感激。谢谢。

1个回答

13

Leiningen在底层使用Maven依赖管理,因此所有依赖项都会安装在

${HOME}/.m2/repository/${groupId-as-path}/${artifactId}/$[version}/${artifactId}-${version}.jar

对于 [org.clojure/clojure "1.3.0"],其中 groupId 是 org.clojure,artifactId 是 clojure,version 是 1.3.0。groupIds 会被转换成路径,因此一个 groupId 为 org.clojure 的路径为 org/clojure

在 pom.xml 指定的 Maven 依赖中,这应该如下所示:

<project>

    ...    

    <dependencies>
        <dependency>
           <groupId>org.clojure</groupId>
           <artifactId>clojure</artifactId>
           <version>1.3.0</version>
       </dependency>
    </dependencies>

    ...

</project>

注意 - 如果没有指定groupId,那么Leiningen会将groupId和artifactId的值设置为相同。

使用Maven依赖管理的好处是它可以为您处理传递性依赖关系,即如果您指定了对某个东西的依赖关系,则会得到它所依赖的所有东西以及所有这些东西所依赖的其他东西等等。

因此,要依赖于本地项目,正确的做法是在本地存储库中安装该本地项目。

为了在开发阶段不断更改版本,Maven支持SNAPSHOT依赖项,其中一些额外的信息附加到版本上(基本上是日期时间),而Maven知道,例如1.3.1-SNAPSHOT应该寻找该快照的最新版本。这是通过{version}-SNAPSHOT的命名约定触发的。

在Maven中,可以使用硬编码路径指定系统依赖项,但通常这是不良实践 - 它通常用于具有平台相关性的东西,即可能有本地库组件。

默认情况下,搜索Maven中央存储库,并且Leinigen添加了the clojars repository,它作为Clojure jars的中央库。

Leinigen在后台使用这些内容,并构建引用本地Maven存储库中的jars的类路径。

请注意,您可以使用lein pom从Leinigen项目生成pom.xml。然后您可以使用该文件来驱动Maven。有一个有用的功能是

mvn dependency:tree

这将给出所有依赖项的ASCII艺术表示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接