如何将 jMusic(一个 Java 库)与 Clojure 一起使用?

How do use jMusic (a Java library) with Clojure?

我决定使用 Clojure 的 Java 互操作性来使用 jMusic 库。因为我比 Clojure 更了解 Java(很多),所以我在 Java 中测试东西,然后将它们重写为(不那么惯用的)Clojure。我将 Eclipse Luna 与 Counterclockwise 插件一起使用,并且不使用 Maven,仅使用 Leiningen。顺便说一句,我不想​​使用 Emacs,因为我想一次专注于学习一种工具。

为了合并 jMusic,我下载了文件并右键单击项目文件夹,选择构建路径,然后选择添加外部存档。我在 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" 程序?

编辑:

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

分解错误信息:

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。为了加载您在 ns 声明中要求的命名空间 jm.music.data,任何一个都足够了。当然没有这样的 Clojure 命名空间。发生这种情况是因为您试图使用 use 来访问 classes,它是为访问命名空间而设计的。 import 用于访问 classes 和包。

(ns my-clojure-test.core
  (:import (jm.music.data Note)
           (jm.util Play)))

. 符号首先采用方法,然后是 class,除非访问静态方法,在这种情况下应使用 /。调用构造函数的正确方法是在 class 名称后加上 .,不带任何分隔符。

(Play/midi (Note.))