可执行jar + audioclips

时间:2016-12-22 02:44:26

标签: eclipse javafx-8 executable-jar audioclip

从可执行jar中运行应用程序时,我一直收到此异常:

java.lang.UnsupportedOperationException: Unsupported protocol "rsrc"
       at com.sun.media.jfxmedia.locator.Locator.<init>(Locator.java:233)
    at com.sun.media.jfxmediaimpl.NativeMediaAudioClip.<init>(NativeMediaAudioClip.java:53)
    at com.sun.media.jfxmediaimpl.NativeMediaAudioClip.load(NativeMediaAudioClip.java:63)
    at com.sun.media.jfxmediaimpl.AudioClipProvider.load(AudioClipProvider.java:66)
    at com.sun.media.jfxmedia.AudioClip.load(AudioClip.java:135)
    at javafx.scene.media.AudioClip.<init>(AudioClip.java:83)
    at com.aqua.snakesandladders.view.gamepieces.Token.<init>(Token.java:70)"

这里的Token.java:70,原因是:

AudioClip bounceSound = new AudioClip(getClass().getResource("/sounds/bounce.wav").toExternalForm());

&#34; bounce.wav&#34;位于&#34;资源&#34;源文件夹@&#34;声音&#34;子目录。

在eclipse中运行应用程序不会引发任何异常@此点+在需要时播放AudioClip。

帮助! :(

1 个答案:

答案 0 :(得分:0)

来源

以下是抛出异常的代码:

this.scheme = this.scheme.toLowerCase();
if (this.scheme.equals("jar")) {
  URI subURI = new URI(this.uriString.substring(4));
  this.protocol = subURI.getScheme();
  if (this.protocol == null) {
    throw new IllegalArgumentException("uri.getScheme() == null!");
  }

  this.protocol = this.protocol.toLowerCase();
} else {
  this.protocol = this.scheme;
}

if (!this.protocol.equals("file") && !this.protocol.equals("http")) {
  throw new UnsupportedOperationException("Unsupported protocol \"" + this.protocol + "\"");
} else {
  if (this.protocol.equals("http")) {
    this.canBlock = true;
  }

  this.uri = uri;
}

如果你在这里打印你的uri,你会看到类似的东西:

rsrc:foo.bar.Main

javafx告诉你,这是无效的uri。

清单

那么为什么你的uri被激活?

如果你打开你的清单文件,你会发现一些eclipse添加的条目,如:

...
Rsrc-Class-Path: ./
Rsrc-Main-Class: net.xxx.main.Main
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader

这里是rsrc的来源。

建议

  • 将您的清单文件更新为原始清单,即删除rsrc开始条目并将主类更改为您的班级;
  • 不使用eclipse打包你的jar,使用maven,gradle等工具
  • 使用Intellij:)