2015-06-14 52 views
1

SQLUtils.java類:org.openide.util.Lookup找不到任何實施

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(); 
} 

主。 java:

運行它時什麼都不做,它找不到任何實現的類。 程序試圖做的是獲取作爲SQLUtils.getDriver(字符串前綴)(在Main.java中)的參數輸入的驅動程序。 出於某種原因,我無法得到這個工作。

回答

0

我放棄了NetBeans API並切換到Reflections。我實現了Maven並使用IntelliJ運行它。適合我。

0

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

您需要在META-INF/services/文件夾中提供一個文件來描述實現特定接口的類。從Java Docs描述ServiceLoader類是這樣的例子:

如果com.example.impl.StandardCodecscom.example.CodecSet服務的實現,則其jar文件還包含一個名爲

META-INF /服務/ com。示例文件 .CodecSet

此文件包含了一行:

com.example.impl.StandardCodecs#標準的編解碼器實現com.example.CodecSet

你缺少的是一個類似的文件,需要包含在你的類路徑或你的JAR文件中。

您不包括您的軟件包名稱,因此我無法提供更直接的示例來幫助解決您的問題。

+0

所有這些都在src文件夾下。所以在根目錄下,我添加了一個META-INF/services /文件夾? – 3legit4quit

+0

正確。 'ServiceLoader'正在這個文件夾('META-INF/services /')中尋找它們,從你的源文件夾開始,例如srcFolder/META-INF /服務/ xxx.yyy.zzz.DBDriver。它不會再猜你。 –