Processing 2.0 Movie не может открыть файл фильма при запуске из jar

Я пытаюсь запустить фильм, используя класс Processing 2.0 Movie.

Если я запускаю свою программу из своего редактора кода (в моем случае Eclipse), все работает нормально, и код работает безупречно: он находит и запускает фильм.

Однако, когда я экспортирую свою программу в банку и запускаю ее с моего терминала, она находит файл, но при попытке открыть его происходит сбой.

В настоящее время я использую этот код, чтобы найти строку пути к фильму.

public String locateMovie(String moviePath) {
    String movie = MoviePlayer.class.getClassLoader().getResource(moviePath).getPath();
    if (movie == null) {
        System.out.println("FATAL ERROR --- Movie file not found: '" + moviePath + "'");
    }
    return movie;
}

Как вы можете видеть, я использую classLoader, чтобы найти файл для меня, поскольку пути различаются после того, как я экспортирую его в файл .jar, и я не хочу постоянно менять пути самостоятельно. .getPath() удаляет 'File:' в File:/Path/To/My/File, так как это ненужный побочный эффект от использования описанного выше способа.

Немного дальше в моем коде я уже добавил дополнительную проверку, чтобы убедиться, что все в порядке с путем, который возвращает classLoader, я делаю это со следующими строками.

File temp = new File(moviePath);
System.out.println("If I have something after this, the file exists: '" + temp + "'");

Он всегда возвращает правильный путь, работает ли он из моего Eclipse (/Users/Path/To/My/Folder/2/java/Game/movies/introMovie.mp4) или из исполняемого файла .jar (introMovie.mp4) .

Сначала я подумал, что странно, что в файле .jar он сразу дает мне файл без пути, ведущего к нему, потому что он имеет некоторую структуру в моем проекте, но после использования

jar tf myProject.jar

команда в моей командной строке возвращает тот же файл/имя пути для файла, поэтому путь должен быть правильным, и здесь все по-прежнему хорошо.

Но теперь, когда я пытаюсь загрузить фильм через класс Processing Movie со следующим кодом:

currentMovie = new Movie(parent, moviePath);

Он генерирует исключение java.lang.StringIndexOutOfBoundsException и аварийно завершает работу. Я понятия не имею, что я делаю неправильно, поскольку этот код безупречно работает в моем редакторе кода + я использую один и тот же способ поиска файлов для моих аудиофайлов и тех, которые запускаются также, даже из исполняемого файла .jar.

Насколько я могу судить по справочной библиотеке классов Movie, ему просто нужен место для его отображения и путь к файлу, который я даю.

Я надеялся, что какой-нибудь ветеран увидит, что я делаю неправильно, и поможет мне решить эту проблему, с которой я борюсь уже несколько дней. Наверное, это какая-то глупость, которую я просто не замечаю прямо сейчас.


person Rijstkoek    schedule 21.04.2014    source источник


Ответы (1)


Я не знаю точно, что не так, но вот пара вещей, которые я бы сделал:

проверьте права доступа к видеофайлу, убедитесь, что программа имеет к нему доступ.

Я читал, что лучше использовать

Thread.currentThread().getContextClassLoader()

чем загрузчик классов класса, но я не знаю, поможет ли это.

Библиотеки обработки имеют открытый исходный код. Возможно, вы увидите, где именно выбрасывается это исключение, и посмотрите на источник. Это может помочь вам точно определить проблему.

person Taylor O'Connor    schedule 16.05.2014