【问题标题】:Clojure.org documentation on compilation and gen-classClojure.org 关于编译和生成类的文档
【发布时间】:2016-01-21 22:43:24
【问题描述】:
  1. 我正在阅读 clojure.org 上关于编译的documention,最后一部分是 gen-class 示例。我做了示例,然后在尝试将其作为 java 应用程序运行时,在终端中使用:java -cp ./classes:clojure.jar clojure.examples.hello Fred,我得到:Error: Could not find or load main class clojure.examples.hello。有人可以帮忙吗?

  2. 谁能介绍一下在哪里可以了解 gen-class 和 :gen-class,我在网上找不到太多文档

【问题讨论】:

  • 您在运行java -cp 命令的目录中有classes 目录吗?尝试找到一个名为 clojure/examples/hello.class 的文件
  • 我用 leiningen 生成了一些项目 tst,并且有一个 classes 目录在:tst/target/base+system+user+dave .所以我 cd 到目录 base+system+user+dave 并从那里运行 java -cp ./classes:clojure.jar tst.core Fred 并得到:Exception in thread "main" java.lang.NoClassDefFoundError: clojure/lang/IFn 错误,我尝试 java -cp ./classes:clojure.jar tst Fred 并得到 Error: Could not find or load main class tst

标签: clojure gen-class


【解决方案1】:

来自你的 base+system+user+dave 的命令java -cp ./classes:clojure.jar tst.core 几乎是正确的。 java.lang.NoClassDefFoundError: clojure/lang/IFn错误是因为JVM找不到Clojure类,因为base+system+user+dave目录下没有clojure.jar文件,所以需要为clojure.jar文件指定正确的路径。

当您使用lein 时,它会将您的项目依赖项下载到您的local repository。其中一个依赖项将是 Clojure 本身,因此假设您在 iOS/Linux 上并且您的 lein project.clj 与 clojure 1.7.0 有依赖项,从 base+system+user+dave 目录运行的命令将是:

java -cp ./classes:~/.m2/repository/org/clojure/clojure/1.7.0/clojure-1.7.0.jar tst.core 

一旦你有多个依赖项,这会变得很烦人,我建议使用lein uberjar,它将在target 目录中创建一个名为 your-project-name-standalone.jar 的文件,该文件将包含所有必需的类,所以要从命令行运行它,请转到目标目录并运行类似:

java -cp tst-standalone.jar tst.core

要了解有关类路径在 JVM 中如何工作的更多信息,您可以从 Wikipedia 开始

【讨论】:

  • 感谢您的详细回答,但其中没有一个对我有用!我从 base+system+user+dave 目录运行 java -cp ./classes:~/.m2/repository/org/clojure/clojure/1.7.0/clojure-1.7.0.jar tst.core 并得到:Exception in thread "main" java.lang.NoClassDefFoundError: clojure/lang/IFn
  • 您必须找到在您的系统上使用的 Clojure jar 的位置并将其插入到命令中。
猜你喜欢
  • 2019-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
相关资源
最近更新 更多