2014-11-28 5 views
4

현재 자바 프로젝트가 다른 프로젝트의 메소드와 변수를 사용하고 있습니다 (동일한 패키지). 지금 당장 다른 프로젝트의 항아리가 제대로 작동하려면 classpath에 있어야합니다. 내 문제는 여기서 항아리의 이름은 버전이 증가 할 수 있기 때문에 변경 될 수 있으며 매니페스트 클래스 경로에 와일드 카드를 사용할 수 없기 때문에 클래스 패스에 추가 할 수 없습니다. 그래서 현재 내 응용 프로그램을 시작하는 유일한 옵션은 명령 행의 -cp 인수를 사용하고 프로젝트가 의존하는 다른 jar를 수동으로 추가하는 것입니다.런타임에 jar를 동적으로로드 하시겠습니까?

이 문제를 개선하기 위해 jar를 동적으로로드하고 ClassLoader 사용에 대해 읽었습니다. 나는 그것을위한 많은 예제를 읽었지 만, 나는 아직도 나의 경우에 그것을 사용하는 방법을 이해하지 못한다.

내가 원하는 것은 jar 파일을로드하는 것이고, myDependency-2.4.1-SNAPSHOT.jar라고 할 수 있지만, 이미 버전 번호가 언제든지 바뀔 수 있다고 말했기 때문에 myDependency-으로 시작하는 jar 파일을 검색 할 수 있어야합니다. 그렇다면 지금처럼 코드의 메서드와 변수를 사용할 수 있어야합니다 (예 : ClassInMyDependency.exampleMethod()).

지금까지 몇 시간 동안 웹을 검색해 왔지만 방금 설명한 방법으로 ClassLoader를 사용하는 방법을 얻지 못했지만 누구나이 도움을 줄 수 있습니까?

미리 감사드립니다.

+1

(+1) 질문에 상당한 연구가 필요하다는 것을 근거로 "give me the codez"솔루션을 추가했습니다. – Bathsheba

+1

http://stackoverflow.com/questions/60764/how-should-i-load-jars-dynamically-at-runtime?lq=1 – Thilo

답변

8

실제로 이것은 때때로 필요합니다. 이것은 내가 생산에서 어떻게하는지입니다. 리플렉션을 사용하여 시스템 클래스 로더에서 addURL의 캡슐화를 우회합니다.

/* 
    * Adds the supplied Java Archive library to java.class.path. This is benign 
    * if the library is already loaded. 
    */ 
    public static synchronized void loadLibrary(java.io.File jar) throws MyException 
    { 
     try { 
      /*We are using reflection here to circumvent encapsulation; addURL is not public*/ 
      java.net.URLClassLoader loader = (java.net.URLClassLoader)ClassLoader.getSystemClassLoader(); 
      java.net.URL url = jar.toURI().toURL(); 
      /*Disallow if already loaded*/ 
      for (java.net.URL it : java.util.Arrays.asList(loader.getURLs())){ 
       if (it.equals(url)){ 
        return; 
       } 
      } 
      java.lang.reflect.Method method = java.net.URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{java.net.URL.class}); 
      method.setAccessible(true); /*promote the method to public access*/ 
      method.invoke(loader, new Object[]{url}); 
     } catch (final java.lang.NoSuchMethodException | 
      java.lang.IllegalAccessException | 
      java.net.MalformedURLException | 
      java.lang.reflect.InvocationTargetException e){ 
      throw new MyException(e); 
     } 
    } 
+0

정말 고마워요, 매력처럼 작동합니다. – JoelP

관련 문제