org.openide.util.Lookup无法找到任何实现的类

时间:2015-06-14 07:02:09

标签: 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.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前缀)参数输入的驱动程序(在Main.java中)。 出于某种原因,我无法让它发挥作用。

2 个答案:

答案 0 :(得分:0)

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

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

  

如果com.example.impl.StandardCodecs是一个实现   com.example.CodecSet服务然后它的jar文件也包含一个文件   命名

     

META-INF /服务/ com.example.CodecSet

     

此文件包含单行:

     

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

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

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

答案 1 :(得分:0)

我删除了NetBeans API并切换到了Reflections。我实现了Maven并使用IntelliJ运行它。适合我。