Кодирование в зависимости от ОС JRE - PullRequest
3 голосов
/ 14 февраля 2012

У меня есть код, который опирается на класс NTSystem (com.sun.security.auth.module.NTSystem), который находится в rt.jar для Windows JRE.Но когда я компилирую свой класс на компьютере с Linux, он терпит неудачу, потому что этот класс не поставляется с Linux JDK / JRE.

Теперь, когда запускается код, есть смысл, что я не смогуиспользуйте класс NTSystem и его функции.Но мой код достаточно умен, чтобы определить, на какой ОС он работает, и использовать соответствующие классы.

И наоборот, при разработке в Windows у меня нет доступа к com.sun.security.auth.module.UnixSystem.Я вынужден использовать отражение, чтобы загрузить и использовать эти классы из-за ограничения времени компиляции?Или есть специальный rt.jar, в котором есть все классы для строительства?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 16 октября 2013

Создайте файлы конфигурации JAAS для каждой целевой платформы или создайте записей для каждой платформы в одной конфигурации JAAS.Затем получите доступ к информации через API Java SE, не используя пакеты com.sun. * Напрямую.Это можно выполнить с помощью Службы аутентификации и авторизации Java (JAAS) (javax.security.auth. * И javax.security.auth.login. *).Создайте файл конфигурации JAAS со следующей записью:

sampleApp {
    com.sun.security.auth.module.NTLoginModule required debug=false;
};

Сохраните эту запись как sampleapp_jaas.config.Затем установите системное свойство, чтобы Java искала файл конфигурации.

-Djava.security.auth.login.config==sampleapp_jaas.config

Обратите внимание, что двойное равенство имеет особое значение.Подробности о порядке загрузки см. В com.sun.security.auth.login.ConfigFile .

Затем создайте LoginContext, который будет искать запись в конфигурации JAAS.Звоните логин, чтобы заполнить тему.Оттуда вы можете получить доступ к информации, используя предметный API.Например, в следующем примере просто перечислите группы, назначенные текущему пользователю.

LoginContext l = new LoginContext("sampleApp");
l.login();
try {
    Subject s = l.getSubject();
    for (Principal p : s.getPrincipals()) {
        System.out.println(p);
    }
} finally {
    l.logout();
}

Используя эту настройку, Java будет использовать класс com.sun.security.auth.module.NTSystem для получения информации, но ни одной.вашего кода будет привязан к нестандартным API.

0 голосов
/ 14 февраля 2012

Если вам действительно нужны эти классы, специфичные для ОС, я бы получил исходники для них, скомпилировал их и создал вашу собственную маленькую библиотеку для компиляции.9 Или вы можете использовать копию классов из разных установок)

Я полагаю, что OpenJDK имеет до трех разновидностей (включая Solaris), поэтому было бы не сложно создать простую библиотеку из них всех.

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