我在使用NetBeans模塊應用程序中的java ServiceLoader時遇到麻煩。這是我想要做的(並且它在Eclipse中的普通Java應用程序中工作):如何使java ServiceLoader在NetBeans 6.9模塊應用程序中工作
我有一個interface.jar,它聲明瞭接口。我有implements.jar,它有幾個這個接口的實現,都在spi/META-INF/services/my.package.name.MyInteface文件中指定(這個文件在實現.jar中)。
我也有類ImplementationHandler(在又一handler.jar),其具有以下的方法來加載所有實現:
private static List<MyInterface<?>> loadAllImplementations() {
List<MyInterface<?>> foundImplementations = Lists.newArrayList();
try {
for (MyInterface implementation : ServiceLoader.load(MyInterface.class)) {
foundImplementations.add(implementation);
}
} catch (ServiceConfigurationError error) {
system.out.println("Exception happened");
}
return foundImplementations;
}
此代碼返回在Eclipse正常應用的所有實現(該foundImplementations.size ()> 0)。
但是在NetBeans下,它找不到任何東西(foundImplementations.size()== 0)。
更多細節:
我有一個NetBeans模塊的應用程序(開源的,不是我寫的),我需要通過一些MyInterface的實現延長的來源。 interface.jar,implements.jar和handler.jar是在Eclipse中創建的,它們是另一個應用程序的一部分。
在NetBeans中,我打開了需要使用新圖案的模塊,並將所有3個罐子都添加爲外部庫(NetBeans將它們複製到它的ext文件夾中,我不想但我不能做任何關於 - 我想他們在另一個myext文件夾中,但這是另一個故事)。然後我重建一切,並試圖用我的實現方式之一,但它沒有被發現......這得到實現的代碼是在ImplementationHandler類,看起來像:
public static final <T> MyInteface<T> getByName(String name) {
for (MyInteface implementation : loadAllImplementations()) {
if (implementation.getName().equals(name)) {
return implementation;
}
}
throw new IllegalArgumentException("Unable to find MyInterface class for: " + name);
}
我得到了我的異常「無法找到MyInteface類爲:myImplementationName「...
我對NetBeans的知識非常有限,我想知道是否還有更多的事情需要我去做,以實現這個目標?
'spi/META-INF/services /'中的'spi'是否爲錯字? META-INF文件夾應位於類路徑的根目錄中。 – 2010-07-02 15:01:12
是的,對不起,我粘貼了從構建腳本中獲取文件的「源」路徑。它在罐子的根部,我檢查過。如果它不在那裏,它不應該在Eclipse中工作:) – 2010-07-05 14:59:58