繁体   English   中英

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

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

我已经决定要使用Clojure的Java互操作性与jMusic库一起使用。 因为我比Clojure更好地了解Java,所以我正在用Java测试事物,然后将它们重写为Clojure。 我正在将Eclipse Luna与Counterclockwise插件一起使用,而不是使用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”程序?

编辑:

选定的答案确实有效,但是请检查注释以获取有关我必须做的更多详细信息,以防万一其他人遇到相同的问题。

要分解错误消息:

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来访问类,并且它是专为访问名称空间而设计的。 import用于访问类和包。

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

. 表示法首先使用一个方法,然后使用该类,除非访问静态方法,在这种情况下,应使用/ 调用构造函数的正确方法是使用. 在类名后面,没有任何分隔符。

(Play/midi (Note.))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM