Почему мои добавленные jar-файлы SPI не регистрируются в моем проекте платформы Netbeans?

В Netbeans 8.0 у меня есть проект с несколькими модулями. Я хочу, чтобы один модуль открывал средство выбора файлов для аудиофайлов, которые приложение будет воспроизводить с использованием библиотеки javax.sound.sampled. Я использую AudioSystem.getAudioFileTypes(), чтобы получить типы файлов, которые можно использовать, и вижу, что доступно только 3 (wav, au и aif), но я также хотел бы иметь дело с mp3, ogg и flac .

Итак, я скачал SPI для нужных мне кодеков. Вся документация говорит мне, что мне нужно только поместить jar-файлы в путь к классам, и кодеки станут доступны для звуковой библиотеки Java. В моем проекте я хочу, чтобы эти библиотеки могли использовать несколько модулей, поэтому я создал для них оболочки модулей. Так, например, у меня в проекте есть один модуль под названием jflac-1.3-jdk, который обертывает два jar-файла: jflac-1.3-jdk1.4.jar и jflac-1.3.jar, затем я устанавливаю модуль, который будет открывать средство выбора файлов, в зависимости от этих модулей, которые обертывают jar-файлы.

Тем не менее, доступны только те же 3 типа файлов. Что мне не хватает?

Вот код в верхнем компоненте модуля, который зависит от модулей оболочки:

private static String[] audioFileExtensions;
static
{
    AudioFileFormat.Type[] formatTypes = AudioSystem.getAudioFileTypes();
    audioFileExtensions = new String[formatTypes.length];
    for (int i = 0; i < formatTypes.length; i++) {
        audioFileExtensions[i] = formatTypes[i].getExtension();
    }
}

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


person Toby 1 Kenobi    schedule 25.11.2014    source источник


Ответы (1)


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

Я никогда не использовал jflac, но, похоже, вам стоит зарегистрироваться:

  • org.kc7bfi.jflac.sound.spi.FlacAudioFileReader как javax.sound.sampled.spi.AudioFileReader и
  • org.kc7bfi.jflac.sound.spi.FlacFormatConversionProvider as a javax.sound.sampled.spi.FormatConversionProvider.

Источник репозиторий фактически содержит необходимые служебные файлы. Добавьте их к своим ресурсам в разделе META-INF/services.

person jackrabbit    schedule 25.11.2014
comment
Спасибо! Но как мне добавить эти ресурсы? Я попытался поместить их в файлы jar, затем удалил модуль-оболочку и переделал его, но это не сработало. В модуле оболочки я вижу банки под libraries, и я могу развернуть каждый из них, чтобы найти узел META-INF, но под ними нет узлов services, только файл манифеста. - person Toby 1 Kenobi; 25.11.2014
comment
Также в узле source packages модуля jflac я создал новую папку META-INF и в ней создал папку services, а затем, вне среды IDE, скопировал два файла в эту папку. Но все равно не работает. - person Toby 1 Kenobi; 25.11.2014
comment
@ Toby1Kenobi Кажется, указывает на то, что вы добавляете файлы в исходный каталог под META-INF/services. - person jackrabbit; 25.11.2014
comment
Весь проект представляет собой проект платформы netbeans, в котором нет папки src. Это набор модулей, и каждый модуль похож на свой собственный проект, для каждого из них есть папка в моей основной папке проекта, и у каждого есть папка src. Я помещаю файлы в папку src модуля оболочки jflac, в папку META-INF/services, но она по-прежнему не работает. - person Toby 1 Kenobi; 26.11.2014
comment
Единственное, что имеет значение, это то, что в вашем последнем проекте ClassLoader может видеть эти два служебных файла и классы, на которые они ссылаются. Я не знаю, как это сделать в приложении NetBeans. Помогают ли вам этот вопрос и ответы на него? - person jackrabbit; 27.11.2014
comment
Нет, похоже, это не говорит о том, что я еще не делаю. Мои исследования показывают, что структура META-INF/services должна находиться в корне банки, и это первое, что я попробовал. Я должен отметить, что то, что я делаю, также не работает с MP3 SPI. и Vorbis SPI, оба из которых имеют служебные файлы в правильном месте в их банке. файлы. Может ли это быть связано с базой кодовых имен, которые я даю модулям-оболочкам? - person Toby 1 Kenobi; 27.11.2014
comment
Я попытался добавить банки mp3spi в модуль, который их использует (в виде обернутых банок), вместо того, чтобы иметь отдельный модуль-оболочку, но он все еще не работает. - person Toby 1 Kenobi; 27.11.2014
comment
Последняя попытка из документы Netbeans, но я уже далеко за пределами моей зоны комфорта. Если это не помогает, задайте новый вопрос на этом сайте об использовании ServiceLoader в контексте Netbeans. - person jackrabbit; 27.11.2014
comment
спасибо за попытку. Я разместил новый вопрос, как вы предложили. - person Toby 1 Kenobi; 28.11.2014