如何在Clojure中使用jMusic(Java库)?

时间:2015-03-29 23:08:41

标签: eclipse clojure

我已经决定使用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”节目?

修改

选定的答案确实有效,但请查看评论,了解有关我必须做些什么才能使其正常工作的详细信息,以防其他人遇到同样的问题。

1 个答案:

答案 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.classjm/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.))