Исполняемая банка + аудиоклипы

Я получаю это исключение при запуске приложения из исполняемого файла 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" исходной папки @ "звуки".

При запуске приложения в eclipse не возникает исключений @ эта точка + воспроизводит аудиоклип при необходимости.

Помогите!:(

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

Какой неверный URI, как сказал вам javafx.

манифест

Так почему же ты Ури?

Если вы откроете свой файл Manifest, вы найдете несколько записей, которые затмение добавлены, например:

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

и вот где rsrc происходит от.

Совет

  • Обновите файл манифеста так, чтобы он соответствовал исходному манифесту, т.е. удалите rsrc начался вход и измените основной класс на свой класс;
  • Не используйте eclipse для упаковки вашей банки, используя такие инструменты, как maven, gradle
  • Используйте Intellij:)
Другие вопросы по тегам