我已经决定使用Clojure的Java互操作性来使用jMusic库。因为我比Clojure更了解Java(很多),我正在用Java测试东西,然后将它们重写为(不那么惯用)Clojure。我正在使用带有逆时针插件的Eclipse Luna,而不是使用Maven,只是Leiningen。暂时不说,我不想使用Emacs,因为我想专注于一次学习一个工具。
要合并jMusic,我已下载文件,右键单击Project文件夹,选择Build Path,然后选择Add External Archive。我已经用Clojure项目和Java项目完成了这项工作。我有以下Java代码:
import jm.music.data.Note;
import jm.util.Play;
public final class TestMusic {
public static void main(String[] args) {
Play.midi(new Note());
}
}
此程序运行并发出噪音而没有问题。我无法在Clojure中重现这一点。我写了下面的代码(这可能是错的,但这是一个单独的问题):
(ns my-clojure-test.core
(:use jm.music.data Note)
(:use jm.util Play))
(. Play midi (. Note))
我收到以下错误:
;; Clojure 1.6.0
CompilerException java.io.FileNotFoundException: Could not locate jm/music/data__init.class
or jm/music/data.clj on classpath: , compiling:(my_clojure_test/core.clj:1:1)
#<Namespace my-clojure-test.core>
我尝试过同样右键单击项目并添加外部存档。我已将jMusic.jar移动到src / java,并将其文件与.jar一起提取。
我的project.clj文件如下所示:
(defproject my-clojure-test "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.6.0"]
[org.clojure/core.logic "0.8.10"]]
:source-paths ["src" "src/my-clojure-test"]
:java-source-paths ["src/java"])
如何让Clojure识别jMusic,以便我可以制作听觉“hello world”节目?
修改 的
选定的答案确实有效,但请查看评论,了解有关我必须做些什么才能使其正常工作的详细信息,以防其他人遇到同样的问题。
答案 0 :(得分:1)
要分解错误消息:
CompilerException java.io.FileNotFoundException: Could not locate jm/music/data__init.class
or jm/music/data.clj on classpath: , compiling:(my_clojure_test/core.clj:1:1)
#<Namespace my-clojure-test.core>
这就是说它正在寻找jm/music/data__init.class
或jm/music/data.clj
。任何一个都足以加载您在jm.music.data
声明中要求的名称空间ns
。当然没有这样的Clojure命名空间。发生这种情况是因为您尝试使用use
来访问类,并且它是为访问命名空间而设计的。 import
用于访问类和包。
(ns my-clojure-test.core
(:import (jm.music.data Note)
(jm.util Play)))
.
表示法首先采用方法,然后是类,除了访问静态方法时,在这种情况下应该使用/
。调用构造函数的正确方法是使用类名后面的.
,而不使用任何分隔符。
(Play/midi (Note.))