环境变量CLASSPATH <> Clojure的CLASSPATH。为什么?

6
在这里,我检查环境变量CLASSPATH
daniel@daniel-laptop:~/ps/clojure/projects/ring-tutorial$ echo $CLASSPATH
/home/daniel/ps/clojure/projects/ring-tutorial/src
在这里,我检查Java认为它是什么
daniel@daniel-laptop:~/ps/clojure/projects/ring-tutorial$ lein repl
Clojure 1.1.0 user=> (System/getProperty "java.class.path")
"src/:classes/:/home/daniel/.m2/repository/leiningen/leiningen/1.1.0/leiningen-1.1.0-standalone.jar:lib/clojure-1.1.0.jar:lib/servlet-api-2.5-6.1.14.jar:lib/commons-io-1.4.jar:lib/clj-stacktrace-0.1.0.jar:lib/clojure-contrib-1.1.0.jar:lib/ring-devel-0.2.0.jar:lib/jetty-util-6.1.14.jar:lib/clj-html-0.1.0.jar:lib/ring-jetty-adapter-0.2.0.jar:lib/jetty-6.1.14.jar:lib/ring-core-0.2.0.jar:lib/commons-fileupload-1.2.1.jar:lib/ring-servlet-0.2.0.jar:lib/commons-codec-1.4.jar:"
正如您所看到的,这两个响应完全不同。我非常确定我必须只是误解了我应该在哪里编辑Java的CLASSPATH变量“获取它”,除了我发现的一切都表明这应该起作用。那么怎么回事?Leiningen会产生自己奇怪的Clojure版本吗?我编辑了一个完全无关的变量吗?非常感谢任何帮助。

提示:去看一下lein脚本,那个可以打开您的repl的脚本。你会发现它会对CLASSPATH做一些处理。 - Belun
3个回答

9

$CLASSPATH 在这里确实是完全无关紧要的。如果在命令行上没有提供类路径信息,那么 java -the-JVM-launcher 程序就会使用它; Leiningen 会为您正在处理的任何项目提供适当的类路径。

在这种特殊情况下,"/home/.../ring-tutorial/src" 对 Ring 教程来说将不是一个非常有用的类路径,因为它只包括 Ring 教程的源代码,不包括 Clojure jar 文件(运行 Clojure 代码必需的文件)、Ring jars 文件(Ring 是一个多模块项目)或 Ring 依赖项中的任何其他 jar 文件。Leiningen 生成的类路径可能看起来很长,但它的所有组件都确实需要存在。

顺便说一句,如果您刚开始接触 Clojure,我建议您尽可能地坚持使用工具链的类路径管理功能(这可能意味着 Emacs + lein swank 或某个 IDE + Clojure 插件)。否则,这里有许多关于 Clojure 类路径问题的问题,并且还有大量其他资源可以搜索到相关主题......但现在工具的支持非常强大,通常您不需要手动操作类路径,最好避免在开始时产生痛苦。


2
使用CLASSPATH变量来管理依赖项的问题在于,所有Java和其他JVM语言都需要为其目的操纵它。很快你就会陷入困境。当你启动仅启动服务器的服务器时,它似乎有效。但是,在拥有数十个需要不同依赖项的程序和项目的Java开发人员的PC上,这种方式完全崩溃了,他们花费更多时间调试bash脚本来操作CLASSPATH变量而不是编写源代码。因此,管理类路径的这种方式已经不再使用,更喜欢其他类加载技术,或者在使用CLASSPATH时,只在本地使用它。

0

Clojure的类路径是Java类路径。

当使用-cp参数调用java可执行文件时,将忽略$CLASSPATH,这也是Leiningen(以及大多数其他Clojure构建脚本)所做的。

如果您正在使用像Leiningen这样的构建工具,则必须使用它来管理类路径。


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