首页 > 解决方案 > 从 Java 中确定当前 glibc 版本

问题描述

对于在linux系统上运行的java应用程序,如何确定glibc的底层版本?

背景:我想在运行时确定是否可以使用 conscrypt,现在这似乎需要 glibc 2.14(https://github.com/google/conscrypt/pull/589),但我仍然需要通过回退到标准 Java SSL 代码,优雅地支持在 CentOS 6 或其他较旧的发行版上运行。不幸的是(至少据我所知)如果 Conscrypt 在较旧的发行版上初始化,则无法捕获并从发生的错误中恢复,但如果我可以确定 glibc 版本,我可以选择是否初始化它基于此。

标签: javalinuxglibc

解决方案


执行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;
    }
}

推荐阅读