Определить текущую версию glibc из Java - PullRequest
0 голосов
/ 18 января 2019

Для java-приложения, работающего в системе Linux, как я могу определить базовую версию glibc?

Предыстория: я хотел бы во время выполнения определить, возможно ли использовать concerypt, который в настоящее время требует glibc 2.14 (https://github.com/google/conscrypt/pull/589),, но мне все равно нужно изящно поддерживать работу на CentOS 6 или другом более старые дистрибутивы, возвращаясь к стандартному коду Java SSL. К сожалению (по крайней мере, насколько я смог определить), нет способа отловить и исправить ошибку, которая возникает, если Conscrypt инициализируется в более старом дистрибутиве, но если Я могу определить версию glibc, которую могу выбрать, инициализировать ли ее на основе этого.

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Я предполагаю, что вы используете какой-то предварительно собранный двоичный файл. Вы должны быть в состоянии отловить исключение java.lang.UnsatisfiedLinkError, выданное методом java.lang.System.load(String). Если общий объект JNI связан правильно, динамический компоновщик обнаружит отсутствующие версии символов (предположительно GLIBC_2.14), даже если активно отложенное связывание.

В качестве альтернативы я не вижу в Conscrypt ничего такого, что препятствовало бы сборке на CentOS 6 (с коллекцией программного обеспечения Developer Toolset для компилятора C ++ 11). Он немного сложен, но зависимость от glibc 2.14, похоже, связана с тем, как создаются предварительно собранные двоичные файлы, и не присуща самому программному обеспечению.

0 голосов
/ 18 января 2019

Рабочий пример выполнения ldd --version и анализа ответа для номера версии.

public class Main {

    public static void main(String[] args) throws IOException {
        final ProcessBuilder processBuilder = new ProcessBuilder("/bin/bash").command("ldd --version");
        processBuilder.redirectErrorStream(true);

        final Process process = processBuilder.start();
        final StringBuilder stream = readStream(process.getInputStream());

        final String version = getVersion(stream.toString());

        System.out.println(version);
    }

    /**
     * Read the output stream of the process
     *
     * @param iStream InputStream
     * @return StringBuilder containing the output of the command
     */
    private static StringBuilder readStream(InputStream iStream) throws IOException {
        final StringBuilder builder = new StringBuilder();
        String line;

        try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(iStream))) {
            while ((line = bufferedReader.readLine()) != null) {
                builder.append(line);
                builder.append(System.getProperty("line.separator"));
            }
        }

        return builder;
    }

    /**
     * Parse the response for the version number.
     *
     * @param input String response of ldd --version
     * @return String of the version, or null if not found
     */
    private static String getVersion(String input) {
        final Pattern pattern = Pattern.compile("[-+]?[0-9]*\\.?[0-9]+");
        final Matcher matcher = pattern.matcher(input);

        return matcher.find() ? matcher.group() : null;
    }
}
...