org.openide.util.Lookup 找不到任何 类 实施

org.openide.util.Lookup Cannot Find Any Classes Implementing

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";
    }
}

DBDriver.java:

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 Lookup机制,但我熟悉Java ServiceLoader机制

您需要在 META-INF/services/ 文件夹中提供一个文件,描述 class 实现特定接口的内容。从 Java Docs 描述 ServiceLoader class 是这个例子:

If com.example.impl.StandardCodecs is an implementation of the com.example.CodecSet service then its jar file also contains a file named

META-INF/services/com.example.CodecSet

This file contains the single line:

com.example.impl.StandardCodecs # Standard codecs implementing com.example.CodecSet

您缺少的是需要包含在您的 class 路径或 JAR 文件中的类似文件。

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

我放弃了 NetBeans API 并切换到 Reflections。我用 IntelliJ 实现了 Maven 和 运行。对我来说效果很好。