2012-03-07 5 views
1

현재 운영 체제에 대해 플랫폼 종속 라이브러리 jar를 동적으로로드하는 방법을 찾으려고합니다. JNI 호출을 사용하는 타사 라이브러리에 액세스해야하며 Mac 및 Windows에 대해 다른 Jar 파일을 사용해야합니다. 두 라이브러리에 대한 모든 호출과 반환은 동일하며 컴파일 작업 후 lib 디렉토리의 jar 파일을 간단히 교체하지만 응용 프로그램에서 런타임에로드 할 jar를 결정할 수 있어야합니다.OS에 따라 동적으로 jar를로드하십시오.

나는 비슷한 게시물을 여기에서 발견했지만이 질문에 직접 답하는 것은 없습니다. this post은 ClassLoader를 통해 jars를 동적으로로드하는 방법을 보여줍니다. 그러나 이걸 모으는 것으로부터 Method method = clazz.getDeclaredMethod("methodName"), method.invoke() 접근 방식을 사용해야한다는 것을 의미합니다. 클래스에 제공된 메소드를 호출하고 명시 적으로로드 할 각 클래스를 호출해야합니다. 클래스 로더 (나는 그것을 피하고 싶다).

내가 좋아하는 뭔가 보이는 솔루션을 찾기 위해 바라고 있어요 : 당신이 JCL 클래스 로더 프레임 워크에 대한 답을 가지고 참조

import external.lib.namespace.LibClassA; 
import external.lib.namespace.LibClassB; 

public class MyClass { 
    static { 
     if (System.getProperty("os.name").contains("Windows") { 
      ClassLoader.getSystemClassLoader().load("Lib_win.jar"); 
     } else { 
      ClassLoader.getSystemClassLoader().load("Lib_mac.jar"); 
     } 
    } 

    public static void Main(String[] args) { 
     LibClassA.platformDependantCall(); 
     LibClassB.someOtherCall(); 
    } 
} 
+0

두 jar가 모두 classpath에 있으면 어떻게됩니까? –

+0

@ MarkRobinson - Java ClassLoader의 작동 방법에 대한 전문가는 아니지만 제 경험상 jar 파일에 다른 jar 또는 Java API와 동일한 네임 스페이스 및 이름을 가진 클래스가 포함되어있는 경우 ClassLoader가로드 할로드를 임의로 결정합니다 . 로드 할 메소드를 결정하는 데 사용되는 메소드가있을 수 있지만이 상황에 관계없이 도움이되지는 않습니다. 이 문제에 대해 내가 틀렸고 누군가가 더 설명하고 싶다면 제발하십시오. 감사. – IgnisFatuus

답변

0

게시물을 - 당신이 보면 https://stackoverflow.com/a/1450837/982341

참조 이 프레임 워크에 대한 문서를 보면로드 된 클래스의 인스턴스를 만드는 것을 지원하고 리플렉션을 사용할 필요가 없도록 적절한 객체에 캐스팅하는 메서드를 제공한다는 것을 알 수 있습니다.

+0

응답 GreyBeardedGeek를 지적 해 주셔서 감사합니다. 나는 그것을 놓쳤다. JCL 프레임 워크를 살펴보고 내가 원하는 것을 할 수 있는지 살펴 보겠습니다. – IgnisFatuus

+0

여기 내 진짜 목표는 동적으로 런타임에로드 할 항아리를이 라이브러리에서 제공하는 클래스를 사용하는 코드를 변경하지 않고 동적으로 결정할 수있게하는 것입니다. 이는 다음을 의미합니다. 해결책은 반사를 사용할 수 없습니다. 2. (1에 의해 암시) 클래스 정의는 컴파일 할 때 사용할 수 있어야합니다. 여기 실제 답변은 "할 수 없다"는 것을 수집하고 있습니까? – IgnisFatuus

+0

JCL 프레임 워크에서 제공하는 캐스팅 기능은 라이브러리에서로드 된 실제 클래스가 아닌 알려진 클래스 또는 인터페이스로만 캐스팅 할 수 있으므로이 기능이 도움이되지 않는 것 같습니다. 내가 잘못? – IgnisFatuus

0
System.getProperty("os.name") 

은 매번 OS에 대한 정보를 얻는 데 사용할 수 없습니다. JVM을 호출하는 사용자에게 필수 보안 권한이없는 경우 SecurityException 예외로 인해 실패합니다.

관련 문제