현재 운영 체제에 대해 플랫폼 종속 라이브러리 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();
}
}
두 jar가 모두 classpath에 있으면 어떻게됩니까? –
@ MarkRobinson - Java ClassLoader의 작동 방법에 대한 전문가는 아니지만 제 경험상 jar 파일에 다른 jar 또는 Java API와 동일한 네임 스페이스 및 이름을 가진 클래스가 포함되어있는 경우 ClassLoader가로드 할로드를 임의로 결정합니다 . 로드 할 메소드를 결정하는 데 사용되는 메소드가있을 수 있지만이 상황에 관계없이 도움이되지는 않습니다. 이 문제에 대해 내가 틀렸고 누군가가 더 설명하고 싶다면 제발하십시오. 감사. – IgnisFatuus