Java org.openide.util.Lookup找不到任何实现

Java org.openide.util.Lookup找不到任何实现,java,openide,Java,Openide,SQLUtils.java: import org.openide.util.Lookup; import java.util.ServiceLoader; // This doesn't work either public class SQLUtils { public static DBDriver getDriver(String prefix) { for(DBDriver e : Lookup.getDefault().lookupAll(DBDriver

SQLUtils.java:

import org.openide.util.Lookup;

import java.util.ServiceLoader; // This doesn't work either

public class SQLUtils {
    public static DBDriver getDriver(String prefix) {
        for(DBDriver e : Lookup.getDefault().lookupAll(DBDriver.class)) {
            System.out.println(e.getPrefix());
            if(e.getPrefix().equalsIgnoreCase(prefix)) {
                return e;
            }
        }
        return null;
    }
}
MySQLDriver.java:

public class MySQLDriver implements DBDriver {
    @Override
    public String getPrefix() {
        return "mysql";
    }
}
import java.io.Serializable;

public interface DBDriver extends Serializable {
    public String getPrefix();
}
DBDriver.java:

public class MySQLDriver implements DBDriver {
    @Override
    public String getPrefix() {
        return "mysql";
    }
}
import java.io.Serializable;

public interface DBDriver extends Serializable {
    public String getPrefix();
}
Main.java:

public class Main {
    public static void main(String[] args) {
        DBDriver d = SQLUtils.getDriver("mysql");
    }
}
当运行它时,它什么也不做,它找不到任何实现它的类。 程序试图做的是获取作为SQLUtils.getDriver(字符串前缀)(在Main.java中)的参数输入的驱动程序。
由于某些原因,我无法让它工作。

我不熟悉OpenIDE
查找机制,但我熟悉Java
ServiceLoader
机制

您需要在
META-INF/services/
文件夹中提供一个文件,描述实现特定接口的类。下面是描述
ServiceLoader
类的示例:

如果
com.example.impl.StandardCodecs
com.example.codeset
service然后它的jar文件也包含一个文件 命名

META-INF/services/com.example.codeset

此文件包含一行:

com.example.impl.StandardCodecs#实现
com.example.codeset

您缺少的是一个类似的文件,它需要包含在类路径或JAR文件中


您没有包含包名,因此我无法提供更直接的示例来帮助解决您的问题。

我不熟悉OpenIDE
查找
机制,但我熟悉Java
ServiceLoader
机制

您需要在
META-INF/services/
文件夹中提供一个文件,描述实现特定接口的类。下面是描述
ServiceLoader
类的示例:

如果
com.example.impl.StandardCodecs
com.example.codeset
service然后它的jar文件也包含一个文件 命名

META-INF/services/com.example.codeset

此文件包含一行:

com.example.impl.StandardCodecs#实现
com.example.codeset

您缺少的是一个类似的文件,它需要包含在类路径或JAR文件中


您没有包含包名,因此我无法提供更直接的示例来帮助解决您的问题。

我放弃了NetBeans API,转而使用反射。我实现了Maven并用IntelliJ运行它。对我来说效果很好。

我放弃了NetBeans API,转而使用反射。我实现了Maven并用IntelliJ运行它。对我来说效果很好。

它们都在src文件夹下。所以在根目录中,我添加了一个META-INF/services/文件夹?正确。
ServiceLoader
正在这个文件夹(
META-INF/services/
)中查找它们,从您的源文件夹开始,例如srcFolder/META-INF/services/xxx.yyy.zzz.DBDriver。它不能猜测你。它们都在src文件夹下。所以在根目录中,我添加了一个META-INF/services/文件夹?正确。
ServiceLoader
正在这个文件夹(
META-INF/services/
)中查找它们,从您的源文件夹开始,例如srcFolder/META-INF/services/xxx.yyy.zzz.DBDriver。它不能猜测你。它们都在src文件夹下。所以在根目录中,我添加了一个META-INF/services/文件夹?正确。
ServiceLoader
正在这个文件夹(
META-INF/services/
)中查找它们,从您的源文件夹开始,例如srcFolder/META-INF/services/xxx.yyy.zzz.DBDriver。它不能猜测你。