2016-06-29 10 views
0

플러그인을 확장하는 내용을로드하려고하는 ServiceLoader가 있습니다. 서비스 파일을 설정 했는데도 아무 것도 찾지 못했습니다.ServiceLoader가 플러그인을 찾지 못했습니다.

소스 코드 (com.otabi.firestar.pajamatale.plugin.loader.PluginFinder는 클래스) : https://github.com/firestar115/PajamaTale

는 플러그인 : https://github.com/firestar115/PajamaTest

은 내가 잘못 여기서 뭐하는 거지? 왜 플러그인이 나타나서 "Test Kappa"를 인쇄하지 않습니까?

+0

무엇이 문제입니까? –

+0

classLoader에없는 JAR 파일을 ServiceLoader에 표시하려면 어떻게해야합니까? @NicolasFilotto – TsundereBug

답변

1

당신은 내부 상황 ClassLoader 사용하는 어떤 당신이 부모 클래스 로더 (나는 Thread.currentThread().getContextClassLoader()을 의미)와 같은 맥락 ClassLoader와 플러그인을 포함하는 대신 ServiceLoader.load(Plugin.class)ServiceLoader.load(Plugin.class, myURLClassLoader)를 사용하는 디렉토리의 URL을 제공하기 위해 URLClassLoader의 인스턴스를 생성해야하는 플러그인이 클래스 경로에 없기 때문에 충분하지 않습니다. 같은

뭔가 :

ClassLoader myURLClassLoader = new URLClassLoader(
    new URL[]{new File("plugins").toURI().toURL()}, 
    Thread.currentThread().getContextClassLoader() 
); 
ServiceLoader<Plugin> loader = ServiceLoader.load(Plugin.class, myURLClassLoader); 
+0

그래서 기본적으로'ServiceLoader.load (새로운 URLClassLoader ("plugins /"))'? – TsundereBug

+0

예 부모 클래스 로더 인 컨텍스트 클래스 로더를 사용하는 아이디어 –

+0

URL을 생성하려면'file : //'프로토콜을 사용하거나 일반적인'plugin'을 사용합니까? – TsundereBug

1

은 내가 URLClassLoaderPlugin 나타내는 각 jar에 대한 URL 필요로 확인할 수 있습니다. 파일 을 포함하는 디렉토리에 URL으로 클래스 로더를 인스턴스화 할만큼 충분하지 않은 파일은 이 아니며이 아닙니다. 그래서 당신은해야 할 일 :

File[] pluginFiles = directory.listFiles((File dir, String name) -> name.endsWith(".jar")); 
    List<URL> urlsList = new ArrayList<>(); 
    for (File file : pluginFiles) { 
     try { 
      urlsList.add(file.toURI().toURL()); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } 
    } 
    URLClassLoader classLoader = URLClassLoader.newInstance(urlsList.toArray(new URL[]{}), Thread.currentThread().getContextClassLoader()); 

다음, ServiceLoader이 플러그인을 찾을 수있을 것입니다.