Java org.openide.util.Lookup找不到任何实现
SQLUtils.java: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
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
查找机制,但我熟悉JavaServiceLoader
机制
您需要在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查找
机制,但我熟悉JavaServiceLoader
机制
您需要在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。它不能猜测你。