org.openide.util.Lookup не может найти реализацию каких-либо классов

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 ответа

Решение

Я удалил API NetBeans и переключился на "Размышления". Я реализовал Maven и запустил его с IntelliJ. Хорошо работает для меня.

Я не знаком с OpenIDE Lookup механизм, но я знаком с Java ServiceLoader механизм.

Вам необходимо предоставить файл в META-INF/services/ папка с описанием того, какие классы реализуют определенные интерфейсы. Из документов Java, описывающих ServiceLoader класс это пример:

Если com.example.impl.StandardCodecs является реализацией com.example.CodecSet сервис, то его JAR-файл также содержит файл с именем

META-INF/ услуги /com.example.CodecSet

Этот файл содержит одну строку:

com.example.impl.StandardCodecs # Стандартные реализации кодеков com.example.CodecSet

Вам не хватает похожего файла, который должен быть включен в ваш путь к классам или в ваш JAR-файл.

Вы не включаете имена пакетов, поэтому я не могу привести более прямой пример, чтобы помочь решить вашу проблему.

Другие вопросы по тегам