Динамически загружать банку в зависимости от ОС - PullRequest
1 голос
/ 08 марта 2012

Я пытаюсь найти способ динамически загружать зависимую от платформы библиотечную флягу для текущей ОС.Мне нужен доступ к сторонней библиотеке, которая использует вызовы JNI и имеет разные jar-файлы для Mac и Windows.Все вызовы и возвраты для этих двух библиотек идентичны и просто заменяют файл jar в каталоге lib после компиляции работ, но я бы хотел, чтобы мое приложение могло определить, какой jar должен быть загружен во время выполнения.

Я нашел похожие посты здесь, но ничего, что напрямую касалось этого вопроса. этот пост показывает, как динамически загружать jar через ClassLoader, но из того, что я понял, это означает, что мне придется использовать подход Method method = clazz.getDeclaredMethod("methodName"), method.invoke() для вызова любых методов, предоставляемых этим классом, а такжекак явно вызвать каждый класс для загрузки в загрузчик классов (которого я очень хотел бы избежать).

Я надеюсь найти решение, которое выглядит примерно так:

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();
    }
}

Ответы [ 2 ]

0 голосов
/ 08 августа 2013
System.getProperty("os.name") 

нельзя использовать для получения информации об ОС каждый раз. Произойдет сбой с исключением SecurityException, если у пользователя, вызывающего JVM, нет необходимых разрешений безопасности.

0 голосов
/ 08 марта 2012

В публикации, на которую вы ссылаетесь, содержится ответ об инфраструктуре JCL ClassLoader - см. https://stackoverflow.com/a/1450837/982341

Если вы посмотрите документацию для этой платформы, вы увидите, что она поддерживает создание экземпляров загруженных классов и предоставляет методы для приведения их к соответствующим объектам, чтобы вам не приходилось использовать отражение. *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...