2011-12-02 57 views
2

My Leiningen项目需要一些我试图从Clojure访问的外部Java类。在Leiningen项目中使用Java代码

起初,我试图把类文件中MY_PROJECT /资源/,因为该目录是在其上运行

lein classpath 

但是证实classpath中,我无法访问即使从简单的玩具的Java类Clojure驻留在所述目录中。为了让事情尽可能简单,我的玩具类没有包装声明。我的第二种方法是在我的project.clj中添加一个:java-source-path键,但我又一次被失败所触发(与上面相同的行为,我无法从Clojure REPL访问该类)。

我在哪里错了?

回答

2

夫妇的事情,可能是错误的:

您使用的.class文件或.java文件? java-source-path用于源文件,即.java文件。 .java文件需要在可以加载之前进行编译。

此外,java类需要导入或限定在clojure代码中的完整软件包名称。

如果可能,并且您的java代码不直接绑定到clojure的东西,最简单的方法是将您的java文件编译并捆绑到一个jar中,然后添加到您的leiningen项目的依赖项中。

+0

.class和.java文件都位于resources /和java sources目录中(java /在我的情况下)。无论如何,因为资源/ *实际上在类路径中,所以我期望Java类可以很容易地从Clojure中获得(我的Java类没有任何包声明,因此我希望它们在不导入任何内容的情况下可用)。 – Christian

+0

我不会指望没有包的类只能自动遍历,但我不知道java类加载器或编译器的细节。 Clojure本身需要显式导入java.lang之外的任何内容(即使clojure.lang类不会自动导入)。如果没有更好的建议出现,我会尝试为这些类设置软件包(java文件和clojure代码中的import语句的相应目录) –

+1

编辑的时限之外:如果您的类没有包,我想clojure代码中的普通'(import'YourClass)'应该可以工作,尽管在clojure中至少推荐使用2层包,因为我现在不记得技术原因。 –

0

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

+0

是的,它编译正确。然而,Joost解决了我的问题(这是一个缺少的导入)。 – Christian

0

在您的.project文件中为您的项目指定:java-source-paths as [“java”]而不是“java”如果“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关于数据库章节中关于休眠的编程手册需要稍微更新一下。
0

在你的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)) 
相关问题