2

기존 응용 프로그램에 대한 Java 플러그인을 만들려고합니다. 플러그인은 메인 애플리케이션에서 이미 존재하는 많은 코드베이스 (예 : 로깅, 오류 처리 등)를 다시 사용하고자합니다. Java ClassLoader가 사용 가능한 클래스를 인식하도록하려면 어떻게해야합니까?

는이 같은 .jar 파일로 플러그인을로드하려고 :

String localPath = "..."; 
String pluginName = "..."; 

File jarFile = new File(localPath); 
ClassLoader pluginLoader = URLClassLoader.newInstance(new URL[]{jarFile.toURL()}); 

pluginLoader.loadClass(pluginName).newInstance(); 

오전 데 문제는 클래스가 나는 그들이 존재에도 불구하고 찾을 수 없습니다 플러그인 내부 가져올 것입니다

NoClassDefFoundError: com/foo/exception/FooException 
at com.foo.plugins.PluginManager.loadPlugin(PluginManager.java:187) 
at com.foo.plugins.PluginManager.loadPlugins(PluginManager.java:86) 
... 

com/foo/exception/FooException이 코드에서 사방에 사용됩니다,하지만 난 플러그인 jar 파일이 클래스 (및 많은 많은 다른 사람을)를 포함하고 싶지 않았다 : 주요 응용 프로그램은,이 같은 오류를 얻고있다. 대신 나는 ClassLoader에 어떻게 든 로컬에 존재하는 클래스를 알고 싶습니다. 이것이 가능한가? 그렇다면 어떻게 할 수 있습니까?

답변

2

당신은 부모로서 주요 응용 프로그램의 클래스 로더를 사용해야합니다

ClassLoader mainLoader = ThisClass.class.getClassLoader(); // some class in the main application 
ClassLoader pluginLoader = URLClassLoader.newInstance(new URL[]{jarFile.toURL()}, mainLoader); 

그리고 주요 클래스 로더에 의해로드 된 클래스에 액세스 할 수 있습니다 플러그인 클래스 로더에 의해로드 된 클래스 (뿐만 아니라 이 클래스 로더의 부모, 하나가 있다면, 등등).