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:"

如您所见,这两种反应完全不同。我很确定我一定是误解了我应该在哪里编辑 CLASSPATH 变量以供 java 以“获取它”,除了我发现的所有内容都表明这应该有效。那么有什么关系呢?leiningen 是否产生了它自己奇怪的 clojure 叛徒实例?我在编辑一个完全不相关的变量吗?非常感谢任何帮助。

4

3 回答 3

9

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

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

顺便说一句,如果您刚开始使用 Clojure,我建议您尽可能坚持使用工具链的类路径管理工具(这可能意味着 Emacs +lein swank或某些 IDE + Clojure 插件)。否则,在 SO 上有很多关于 Clojure 类路径问题的问题,以及关于该主题的大量其他资源,您可以通过 google 搜索...但是现在该工具支持非常强大,您通常不需要通过手,只是一开始最好避免疼痛。

于 2010-09-03T21:58:39.470 回答
2

使用 CLASSPATH 变量管理依赖项的问题在于,所有 Java 和其他 JVM 语言都需要对其进行操作。没过多久,你就在角落里画了自己。

当您启动仅启动服务器的服务器时,它会起作用。它在 Java 开发人员的 PC 上完全崩溃,他有 10 多个程序和项目都需要不同的依赖项,然后花费更多时间调试 bash 脚本来操作编写源代码的 CLASSPATH 变量。

因此,这种管理类路径的方法已被废弃,更喜欢其他类加载技术,或者在使用 CLASSPATH 时,仅在本地使用它。

于 2010-09-03T22:19:58.323 回答
0

Clojure 类路径是 Java 类路径。

$CLASSPATHjava当使用参数调用可执行文件时会被忽略-cp,Leiningen(和大多数其他 Clojure 构建脚本)都会这样做。

如果您使用的是 Leiningen 等构建工具,则必须使用它来管理类路径。

于 2010-09-04T00:43:32.423 回答