微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java声音:在IntelliJ中运行但在SBT中找不到的设备

我正在尝试在Scala SBT管理的项目中使用Java Sound API.

这是一个可播放音符的玩具应用.

import javax.sound.midi._

object MyMain extends App {
  val infos = Midisystem.getMidiDeviceInfo()
  println( "[DEBUG] midi devices found: " + infos.length )

  val myMsg = new ShortMessage;
  // Start playing the note Middle C (60),
  // moderately loud (veLocity = 93).
  myMsg.setMessage(ShortMessage.NOTE_ON, 0, 60, 93);
  val timeStamp = -1;
  val rcvr : Receiver = Midisystem.getReceiver();
  rcvr.send(myMsg, timeStamp);

  readChar()  // give time to play note
}

当我在SBT中执行运行时,由于infos.length返回0,所以我得到了javax.sound.midi.MidiUnavailableException.也就是说,当我在IntelliJ中运行该应用程序时,发现了两个设备,并且笔记运行得很好.

SBT要使其运行需要知道什么?是否有需要添加到类路径的东西?我注意到IntelliJ将一大堆jar附加到执行命令(但是,删除来自jdk / jre / lib /的jar无效,而其他则与scala相关或与IntelliJ相关).

解决方法:

SBT使用一些类加载器魔术来在程序中运行您的应用程序,这可能会阻止Midisystem查找(使用SPI)声音组件.

您可以尝试派生一个新的JVM来运行您的应用程序:fork in run:= true.请参阅文档中的Forking.

注意:

>认情况下,它不会将输入重定向到应用程序.您可以添加以下内容

connectInput in run := true

>分叉的JVM可以被任何外部工具毫无问题地杀死(使用kill或任何类型的任务管理器)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐