【问题标题】:CompilerException java.lang.IllegalArgumentException: Unable to resolve classname: Carro, compiling:(carro/car.clj:6)CompilerException java.lang.IllegalArgumentException:无法解析类名:Carro,编译:(carro/car.clj:6)
【发布时间】:2013-02-19 01:29:42
【问题描述】:

所以.. 我有这个问题(标题中的那个)。只是为了说明我所做的事情的背景: 创建一个名为 Carro 的 Java 类:

public class Carro{
  public Carro(){}
  public void turnon(String sound){
     System.out.println(sound);
  }
}

我已经编译好了:

javac Carro.java

并创建了一个 .jar:

jar -cf Carro.jar Carro.class

所以,我创建了一个新的 lein 项目: lein 新测试

创建了一个 /lib 目录并将 Carro.jar 粘贴到其中。

test/src/目录下创建一个名为carro的文件夹,并创建一个.clj文件,名为car.clj

(ns carro.car
  (:import [Carro] )
)

(defn callCarro [] 
  (let [car (new Carro)]
     (.turnon "vruuum!" car)
  )
)

在所有这些之后,我编辑了 project.clj 文件并在最后一个括号后添加了一个 :import [Carro]。

所以,当我使用lein repl 运行项目时,我得到了这个错误:

    $ lein repl
    user=> (require 'carr.car :reload)
    CompilerException java.lang.IllegalArgumentException: 
Unable to resolve classname: Carro, compiling:(carro/car.clj:6) 

有什么想法可以解决这个...问题吗?

【问题讨论】:

  • thisthis 可能会有所帮助。

标签: jar clojure compiler-errors illegalargumentexception


【解决方案1】:

Leiningen 2 依赖 maven 来管理依赖关系。版本 1 用于将 jar 复制到 lib 目录,但此行为已被删除(请参阅 https://github.com/technomancy/leiningen/blob/stable/doc/FAQ.md)。如果您的项目需要某个 jar,最简单的方法是将该 jar 安装在本地 maven repo 上,然后让 leiningen 完成剩下的工作。

Maven(以及 leiningen)需要一个版本、一个组和一个用于您正在使用的 jar 的工件(请参阅https://github.com/technomancy/leiningen/blob/master/doc/TUTORIAL.md#artifact-ids-groups-and-versions)。所以我们的第一步是将 Carro.jar 重命名为 Carro-0.1.0.jar。为了让事情变得更简单,让我们使用 leiningen 插件来完成剩下的工作。将lein-localrepo 插件添加到您的project.clj,类似于:

(defproject foo "0.1.0-SNAPSHOT"
  :dependencies [[org.clojure/clojure "1.4.0"]]
  :plugins [[lein-localrepo "0.4.1"]])

然后你可以向 leiningen 询问 Carro 依赖的坐标:

$ lein localrepo coords Carro-0.1.0.jar
Carro-0.1.0.jar Carro/Carro 0.1.0

最后一部分是安装到 mvn repo 所需的信息:

$ lein localrepo install Carro-0.1.0.jar Carro/Carro 0.1.0

之后,jar 将安装在您的 mvn 存储库中:~/.m2/repository/Carro/Carro/0.1.0/Carro-0.1.0.jar。所以最后,将新安装的依赖添加到 project.clj 中:

(defproject foo "0.1.0-SNAPSHOT"
  :dependencies [[org.clojure/clojure "1.4.0"]
                 [Carro/Carro "0.1.0"]]
  :plugins [[lein-localrepo "0.4.1"]])

然后从repl:

$ lein repl
user=> (new Carro)
#<Carro Carro@7c04703c>

【讨论】:

    【解决方案2】:

    我怀疑可能有多种原因:

    • Clojure 无法在没有包的情况下加载类,从而导致此问题。
    • 如果您使用 Leiningen,这不是测试课程的典型位置
    • 如果您没有从 repl 运行 (import 'Classname),您也需要这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      • 2013-04-05
      • 1970-01-01
      • 2016-08-13
      相关资源
      最近更新 更多