【问题标题】:executable jar + audioclips可执行 jar + 音频剪辑
【发布时间】:2016-12-22 02:44:25
【问题描述】:

从可执行 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());

“bounce.wav”位于“resources”源文件夹@“sounds”子文件夹中。

在eclipse中运行应用程序不会抛出异常@此时+在需要时播放AudioClip。

帮助! :(

【问题讨论】:

  • 你检查过getClass().getResource("/sounds/bounce.wav").toExternalForm() 产生了什么吗?也许这是构造函数不喜欢的东西。 (这就是javafx.scene.media.AudioClip.&lt;init&gt;(AudioClip.java:83) 所说的)
  • 当我在 Eclipse 中运行它时它喜欢它,但当我从可执行 jar 运行它时它不喜欢它?
  • 当涉及到图像或 css 文件时,相同的语法在 IDE 和 jar 上都没有问题。
  • 你能为此提供一些 mcve 吗? stackoverflow.com/help/mcve

标签: eclipse javafx-8 executable-jar audioclip


【解决方案1】:

来源

以下是抛出异常的代码:

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是invlaid?

如果你打开你的Manifest文件,你会发现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 :)

【讨论】:

    猜你喜欢
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 2018-05-11
    • 2016-01-16
    • 1970-01-01
    相关资源
    最近更新 更多