Java代码在莱宁根项目中的应用

Java代码在莱宁根项目中的应用,java,clojure,leiningen,Java,Clojure,Leiningen,我的Leiningen项目需要一些外部Java类,我正试图从Clojure访问这些类 首先,我尝试将类文件放在我的_project/resources/中,因为这个目录位于类路径上,通过运行 lein classpath 然而,我甚至无法从Clojure访问驻留在上述目录中的一个简单的玩具Java类。为了使事情尽可能简单,我的玩具类没有包声明 我的第二种方法是在project.clj中添加:java源路径键,但我再次被失败所震惊(与上面的行为相同,我无法从Clojure REPL访问该类) 我

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

首先,我尝试将类文件放在我的_project/resources/中,因为这个目录位于类路径上,通过运行

lein classpath
然而,我甚至无法从Clojure访问驻留在上述目录中的一个简单的玩具Java类。为了使事情尽可能简单,我的玩具类没有包声明

我的第二种方法是在project.clj中添加:java源路径键,但我再次被失败所震惊(与上面的行为相同,我无法从Clojure REPL访问该类)


我哪里出了问题?

有两件事可能是错的:

您使用的是.class文件还是.java文件?java源路径用于源,即.java文件。和.java文件需要先编译,然后才能加载

此外,java类需要在clojure代码中导入或限定它们的完整包名


如果可能,而且java代码不直接与clojure绑定,那么最简单的方法就是将java文件编译并打包到一个jar中,然后添加到leiningen项目的依赖项中。

将java源代码放入路径后,是否在项目的.project文件中运行了lein compile?

如果在项目目录中放置java源文件的位置是“java”目录,请将:java源路径指定为[“java”],而不是“java”1

如果在.project文件中指定了:java源路径和:main右键,那么运行“lein run”应该在实际运行之前自动编译java源代码

资料来源:

  • 我犯了这个错误,一直在想我做错了什么。关系数据库一章中关于hibernate的Chas Emerick Clojure编程书需要更新一点

  • 在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))
    

    .class和.java文件都位于resources/和java sources目录(在我的例子中是java/中)。无论如何,由于resources/实际上位于类路径上,我希望Java类可以从Clojure轻松获得(我的Java类没有任何包声明,因此我希望它们可以在不导入任何内容的情况下获得)。我不会指望没有包的类可以在任何地方自动获得,但是我不知道java类加载器或编译器的细节。Clojure本身需要显式导入java.lang以外的任何内容(即使Clojure.lang类也不会自动导入)。如果没有更好的建议出现,我会尝试在编辑时间限制之外为类设置包(在clojure代码中为java文件和导入语句设置相应的目录):如果您的类没有包,我想clojure代码中的纯
    (import'YourClass)
    应该可以工作,虽然clojure中建议至少使用两个级别的包,但由于技术原因,我现在记不清了。是的,它编译正确。然而,Joost解决了我的问题(缺少导入)。