Java 为什么我添加的SPI JAR不能在我的Netbeans平台项目中注册?

Java 为什么我添加的SPI JAR不能在我的Netbeans平台项目中注册?,java,audio,netbeans,netbeans-platform,netbeans-8,Java,Audio,Netbeans,Netbeans Platform,Netbeans 8,在Netbeans 8.0中,我有一个包含多个模块的项目。我想要一个模块打开一个音频文件的文件选择器,应用程序将使用javax.sound.sampled库播放这些文件。我使用AudioSystem.getAudioFileTypes()来获取可以使用的文件类型,并查看只有3种可用(“wav”、“au”和“aif”),但我也希望能够处理mp3、ogg和flac 所以我下载了我需要的编解码器的SPI。所有文档都告诉我,我只需要将JAR放入类路径中,编解码器就可以用于Java的声音库。在我的项目中,

在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();
    }
}
私有静态字符串[]audioFileExtensions;
静止的
{
AudioFileFormat.Type[]formatTypes=AudioSystem.getAudioFileTypes();
audioFileExtensions=新字符串[formatTypes.length];
for(int i=0;i

我在这段代码中使用调试器来查看我想要的文件类型不可用。

应该使用该机制注册SPI,而您下载的JAR似乎没有这样做。这可能是他们包装中的一个缺陷

我从未使用过jflac,但看起来您应该注册:

  • org.kc7bfi.jflac.sound.spi.FlacAudioFileReader
    作为
    javax.sound.sampled.spi.AudioFileReader
  • org.kc7bbi.jflac.sound.spi.FlacFormatConversionProvider
    作为一个
    javax.sound.sampled.spi.FormatConversionProvider

实际上包含了必要的服务文件。将这些添加到
META-INF/services
下的资源中,谢谢!但是我如何添加这些资源呢?我试着将它们放入jar文件中,然后删除我的包装器模块并重新制作,但没有成功。在包装器模块中,我可以看到
下的JAR,我可以展开每个JAR以找到
META-INF
节点,但这些节点下没有
服务
节点,只有一个清单文件。同样在jflac模块的
源程序包
节点下,我创建了一个新文件夹
META-INF
,并在其中创建了一个文件夹
services
,然后在IDE外部将这两个文件复制到该文件夹中。但它仍然不起作用。@TobyKenobi似乎表示您将文件添加到
META-INF/services
下的源目录中。整个项目是一个netbeans平台项目,没有
src
文件夹。它是一个模块的集合,每个模块就像它自己的项目一样。在我的主项目文件夹下,每个模块都有一个文件夹,每个文件夹都有一个
src
文件夹。我把这些文件放在jflac包装模块的
src
文件夹下,在
META-INF/services
下,它仍然不起作用。唯一相关的是,在您的最终项目中,类加载器可以看到这两个服务文件及其引用的类。我不知道如何在NetBeans应用程序中做到这一点。它的答案对你有帮助吗?