0

从可执行 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。

帮助!:(

4

1 回答 1

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

如果你打开你的 Manifest 文件,你会发现一些 eclipse 添加的条目,比如:</p>

...
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 :)
于 2017-05-21T08:05:34.717 回答