繁体   English   中英

如何将目录添加到 Clojure 的类路径?

[英]How to add directory to Clojure's classpath?

我已将带有 Maven 的库安装到 ~/.m2/repository/ 目录。 我想将该路径添加到默认的 Clojure 类路径中。 我找不到如何做到这一点的文档。

有什么提示吗?

干杯!

clj
Clojure 1.4.0
user=> (require '[clojure.java.jmx :as jmx])
FileNotFoundException Could not locate clojure/java/jmx__init.class or clojure/java/jmx.clj on classpath:   clojure.lang.RT.load (RT.java:432)

class 路径默认为:

user=> (println (seq (.getURLs (java.lang.ClassLoader/getSystemClassLoader))))
(#<URL file:/Users/myuser/cljmx/> #<URL file:/usr/local/Cellar/clojure/1.4.0/clojure-1.4.0.jar> #<URL file:/Users/myuser/cljmx/>)
nil

通过保持与项目关联的类路径的设置,Leiningen确实使这个过程变得更加痛苦,更重要的是导致可重复的构建过程 你可以在几年后回到这个项目,仍然可以获得一个repl。 在这些情况下使用leiningen的概述:

  • 莱恩新项目名称
  • 使用您选择的名称将您需要的库添加到project.clj文件中
  • 运行lein deps打印出用于将jar添加到本地仓库的命令
  • 加上罐子
  • 再次运行lein deps(如果使用leiningen2,可以跳过此步骤)
  • 运行lein repl
  • 请享用

这假设你正在使用的库不是maven仓库中的一个包的一部分或可用,很多都是。

非痛苦,流行的方法是不要直接使用maven和类路径以及JRE,并使用leiningen: https//github.com/technomancy/leiningen/

否则,你可以修改clj任何内容,并以java喜欢的方式添加/设置类路径。 请参阅例如在java类路径中设置多个jar

应该注意的是,您还可以选择在运行时使用库石榴添加类路径https://github.com/cemerick/pomegranate

这可以让你这样做:

 (require '[cemerick.pomegranate :as pom])
 (pom/add-classpath "/home/user/~.m2/....")

我假设clj是一个启动Clojure REPL的脚本。 看一下这个脚本,找到与此类似的行:

java -cp /path/to/clojure.jar clojure.main

在这里,您可以在类路径上启动类clojure.main ,其中包含“clojure.jar”。 要添加更多jar,只需将它们添加到-cp选项值的末尾即可。 例如在Linux上:

java -cp /path/to/clojure.jar:/path/to/mylib.jar clojure.main

(使用;代替:在Windows上)

但是,很快你会厌倦这种方式并寻找项目管理工具。 所以现在开始使用它是有道理的。 看看Leiningen - 它基于Maven为你管理依赖(因此添加新jar非常容易)并且有REPL。

另一种选择是在您计划运行 REPL 或保存项目文件的文件夹中创建一个deps.edn文件。

该文件用于通知 Clojure 有关依赖项、源文件、执行配置文件等...它在您运行 REPL 时加载(但还有其他用例),它由 Clojure 的核心支持,官方记录在Z5E7BA56C50BADEZ0804Cclojure.org/reference/deps_and_cli

在您的情况下,您可能只想放置以下内容,以声明您要下载的依赖项并将其放在 Java 类路径中。

{
   :deps {
      the.dependency/you-want {:mvn/version "1.0.0"}
   }
}

deps.edn ,您可以指定:

  • 第三方依赖项(例如 JAR)可以已经保存在本地,或者托管在 Maven 存储库或 Git 存储库上……
  • 路径,您的源代码所在的位置(如果有)

请注意,依赖项将被下载并缓存在deps.edn本身旁边的.cpcache/文件夹中。 我不确定您是否可以指示它使用全局~/.m2来代替。

您可以在clojars.org上找到依赖坐标(名称和最新版本)

deps.edn是“更轻的”,是核心 Clojure 的一部分,如果不如 leiningen 强大的话; 因此可能适合在 REPL 或 CLI 上为临时/探索性编码设置环境。

您还可以在~/.clojure/deps.edn中拥有一个全局deps.edn ,您可能希望在其中定义通用配置、依赖项等以在不同项目中使用。 可以使用命令行上的选项调用/覆盖特定配置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM