【问题标题】:org.openide.util.Lookup Cannot Find Any Classes Implementingorg.openide.util.Lookup 找不到任何实现的类
【发布时间】:2015-08-29 20:42:30
【问题描述】:

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(String prefix) 参数输入的驱动程序(在 Main.java 中)。 由于某种原因,我无法让它工作。

【问题讨论】:

    标签: java openide


    【解决方案1】:

    我不熟悉 OpenIDE Lookup 机制,但我熟悉 Java ServiceLoader 机制。

    您需要在META-INF/services/ 文件夹中提供一个文件来描述哪些类实现了特定的接口。来自描述ServiceLoader 类的Java Docs 就是这个例子:

    如果com.example.impl.StandardCodecscom.example.CodecSet service 那么它的jar文件也包含一个文件 命名

    META-INF/services/com.example.CodecSet

    这个文件包含一行:

    com.example.impl.StandardCodecs # 标准编解码器实现com.example.CodecSet

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

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

    【讨论】:

    • 它们都在一个 src 文件夹下。所以在根目录下,我添加一个 META-INF/services/ 文件夹?
    • 正确。 ServiceLoader 正在从您的源文件夹开始在此文件夹 (META-INF/services/) 中寻找它们,例如srcFolder/META-INF/services/xxx.yyy.zzz.DBDriver。它不能再猜你了。
    【解决方案2】:

    我放弃了 NetBeans API 并切换到反射。我实现了 Maven 并使用 IntelliJ 运行它。很适合我。

    【讨论】:

      猜你喜欢
      • 2020-04-07
      • 1970-01-01
      • 2014-10-22
      • 2021-08-08
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-18
      相关资源
      最近更新 更多