当前位置: 首页 > 面试题库 >

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

龙华翰
2023-03-14
问题内容

我正在尝试在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
}

当我run在SBT中执行时,我得到的javax.sound.midi.MidiUnavailableException因为
infos.length返回0。也就是说,当我在IntelliJ中运行该应用程序时,找到了两个设备,并且该音符的播放效果很好。

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


问题答案:

SBT使用一些类加载器魔术来在过程中运行您的应用程序,这可能会阻止MidiSystem找到(使用SPI)声音成分。

您可以尝试分叉新的JVM来运行您的应用程序:fork in run := true。请参阅文档中的分叉。

注意:

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

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



 类似资料:
  • 我在IntelliJ中找不到将Java设置为我的项目JDK的目录。我尝试将其指向/usr/java/java[version-number],但是IntelliJ说这是一个无效的目录。(我不记得这个文件夹的确切名称,我只记得它是Java8。) 我在谷歌上搜索了一下,发现可能是因为它被破坏了,他们建议擦掉它并重新安装...因此,我删除了/usr/java中的java[version-number]文

  • 但是,如果我使用进行构建,就可以了。我试过这里所有的方法,但还是没有运气。有什么建议吗?

  • 我有一个在eclipse和cmd提示符中运行良好的Jar。当我尝试在Unix中执行相同的程序时,它没有执行。

  • 我可以使用以下命令在Git Bash中运行Spring Bootjar: 我现在正在尝试用IntelliJ运行应用程序。运行配置包含以下内容: 当我运行应用程序在我的IDE我得到: IllegalStateException:缺少必需的加密配置属性:jasypt.encryptor.password 我尝试在我的系统环境变量、运行配置环境变量中设置的值,并直接在

  • 我有一个程序,必须从终端界面播放声音。 代码相当简单,如下所示: 该文件位于“我的源路径”中的“音乐”文件夹中。 当我在eclipse中运行程序时,所有工作都非常好。但是如果我将其导出到. jar文件中并在windows cmd中尝试它,我会收到这条消息 [编辑]音频文件确实已打包到中。jar,但它仍然不起作用。 是否有可能播放来自windows提示符的声音?如果没有,是否有这样的声音? 谢谢Si

  • 我有一个Java项目已经准备就绪,但我在最后一个障碍上绊倒了。该程序在IDE中运行良好,但在我运行mvn clean install并成功创建目标jar后,应用程序在命令行和IDE中都会失败。我可以通过在IDE中进行重建,使其在IDE中再次运行。 还有其他人经历过类似的事情吗? mvn清洁安装后的错误是 它发生故障的线路如下所示: 如果我从IDE中重建,那么变量到达这里时不是null,但在mvn命