【问题标题】:Using Java code in Leiningen project在 Leiningen 项目中使用 Java 代码
【发布时间】:2011-12-02 16:08:05
【问题描述】:

我的 Leiningen 项目需要一些我试图从 Clojure 访问的外部 Java 类。

起初我尝试将类文件放在 my_project/resources/ 中,因为该目录位于通过运行确认的类路径中

lein classpath

但是,我什至无法从位于所述目录中的 Clojure 访问一个简单的玩具 Java 类。为了让事情尽可能简单,我的玩具类没有包声明。

我的第二种方法涉及向我的 project.clj 添加一个 :java-source-path 键,但我再次被失败所震惊(与上述行为相同,我无法从 Clojure REPL 访问该类)。

我哪里错了?

【问题讨论】:

    标签: java clojure leiningen


    【解决方案1】:

    可能出错的几件事:

    您使用的是 .class 文件还是 .java 文件? java-source-path 用于sources,即.java 文件。并且.java文件需要编译才能加载。

    此外,java 类需要在 clojure 代码中导入或使用其完整的包名进行限定。

    如果可能,并且您的 java 代码不直接与 clojure 相关联,最简单的方法是将您的 java 文件编译并捆绑在一个 jar 中,您可以将其添加到您的 leiningen 项目的依赖项中。

    【讨论】:

    • .class 和 .java 文件都驻留在 resources/ 和 java 源目录(在我的例子中是 java/)中。无论如何,由于 resources/ is 实际上在类路径上,我希望 Java 类可以从 Clojure 轻松获得(我的 Java 类没有任何包声明,因此我希望它们无需导入即可使用任何东西)。
    • 我不会指望没有包的类自动随处可用,但我不知道 java 类加载器或编译器的细节。 Clojure 本身需要对 java.lang 之外的任何内容进行显式导入(甚至 clojure.lang 类也不会自动导入)。如果没有更好的建议出现,我会尝试为类设置包(在 clojure 代码中使用 java 文件和导入语句的相应目录)
    • 超出编辑时间限制:如果你的类没有包,我想 clojure 代码中的普通 (import 'YourClass) 应该可以工作,尽管建议使用至少 2 级包clojure,由于技术原因,我现在不记得了。
    【解决方案2】:

    将java源码放入路径后,是否运行了lein compile?

    【讨论】:

    • 是的,它编译正确。然而,Joost 解决了我的问题(缺少导入)。
    【解决方案3】:

    在项目的 .project 文件中,将 :java-source-paths 指定为 ["java"] 而不是 "java"1 如果“java”目录是您放置 java 的位置项目目录中的源文件。

    如果您在 .project 文件中指定了 :java-source-paths 和 :main ,则运行 'lein run' 应该在实际运行之前自动编译 java 源代码。

    来源:https://github.com/technomancy/leiningen/blob/master/doc/MIXED_PROJECTS.md

    1. 我犯了这个错误,并一直想知道我做错了什么。关系数据库章节中的 Chas Emerick Clojure 编程书讨论了休眠,需要更新一下。

    【讨论】:

      【解决方案4】:

      在您的 project.clj 中,您的资源路径是否有关键字?您说您有 java-source-paths 关键字,但这些关键字用于构建/运行项目时需要编译的 .java 文件。在你的 project.clj 文件中添加这个

      :resource-paths ["relative/path/to/your/classes/folder" "relative/path/to/other/classes"]
      

      这将允许您的项目在命名空间声明中使用 import 语句引用您的各种类。

      (ns my.project.name-space
        (:require [clojure.core.async :as async])
        (:import MySuperAwesomeClass))
      

      【讨论】:

        猜你喜欢
        • 2015-11-16
        • 2012-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-15
        • 2010-12-19
        • 2013-03-31
        • 1970-01-01
        相关资源
        最近更新 更多