从Java获取Linux发行版

8

我从Java中获取了我正在使用的操作系统的名称。请参见以下代码:

System.out.println(System.getProperty("os.name"));

在Windows XP中,它的打印如下:Windows XP。但在Ubuntu/Fedora中,它只显示Linux。请问有人可以帮我使用Java代码找出我正在使用的Linux版本(如Ubuntu或Fedora)吗?是否可能从Java中找到Linux发行版?

2
尝试使用 os.version。我正在运行Windows,不确定在*nix上会返回什么。 - Andrew Thompson
1
http://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html - Brian Roach
1
一定要添加@BrianRoach(或其他人)以通知他们有新的评论。顺便问一下 - 这和什么相关? 如果用户足够在意,他们已经知道自己使用哪个Linux发行版和应用程序。很少需要这样的信息。你想通过了解那些信息提供什么功能? - Andrew Thompson
读取MariaDB配置文件的位置可能存在差异。为获取此文件,需要了解Linux发行版。 - Haseena
你是有意忽略我的评论吗?我建议你添加一个通知。我不需要添加一个,因为提问的人(你)会自动收到新评论的通知。所以,实际上你想要的不是名称,而是数据库的路径。在问题中提到这一点是很有帮助的,因为它可能与问题相关。 - Andrew Thompson
显示剩余5条评论
4个回答

7
从这里开始,我扩展了代码,以包括不同的后备方案,以便在多个平台上获取操作系统版本。
  • Windows已经很描述性了,您可以从“os.name”系统属性中获取信息
  • Mac OS:您需要根据版本保留发布名称列表
  • Linux:这是最复杂的,以下是回退列表:
    - 如果发行版符合LSB,则从LSB release文件中获取信息
    - 如果存在,则从/ etc / system-release获取信息
    - 在/ etc /中以“-release”结尾的任何文件中获取信息
    - 在/ etc /中以“_version”结尾的任何文件中获取信息(主要用于Debian)
    - 如果存在,则从/ etc / issue获取信息
    - 最坏的情况下,从/ proc / version可用的信息中获取信息

  • 您可以在此处获取实用程序类:
    https://github.com/aurbroszniowski/os-platform-finder


    他明确地询问如何获取Linux发行版的名称(例如Ubuntu,Linux和macOS)。更多信息请参见此处 - Rishon_JR

    6
    这段代码可以帮助你:
    String[] cmd = {
    "/bin/sh", "-c", "cat /etc/*-release" };
    
    try {
        Process p = Runtime.getRuntime().exec(cmd);
        BufferedReader bri = new BufferedReader(new InputStreamReader(
                p.getInputStream()));
    
        String line = "";
        while ((line = bri.readLine()) != null) {
            System.out.println(line);
        }
    } catch (IOException e) {
    
        e.printStackTrace();
    }
    

    更新

    如果你只需要版本,可以尝试使用uname -a命令。

    更新

    一些Linux发行版在/proc/version文件中包含发行版的版本。以下是一个示例,可以从Java中打印出所有这些版本,而不需要调用任何SO命令。

    //lists all the files ending with -release in the etc folder
    File dir = new File("/etc/");
    File fileList[] = new File[0];
    if(dir.exists()){
        fileList =  dir.listFiles(new FilenameFilter() {
            public boolean accept(File dir, String filename) {
                return filename.endsWith("-release");
            }
        });
    }
    //looks for the version file (not all linux distros)
    File fileVersion = new File("/proc/version");
    if(fileVersion.exists()){
        fileList = Arrays.copyOf(fileList,fileList.length+1);
        fileList[fileList.length-1] = fileVersion;
    }       
    //prints all the version-related files
    for (File f : fileList) {
        try {
            BufferedReader myReader = new BufferedReader(new FileReader(f));
            String strLine = null;
            while ((strLine = myReader.readLine()) != null) {
                System.out.println(strLine);
            }
            myReader.close();
        } catch (Exception e) {
            System.err.println("Error: " + e.getMessage());
        }
    }
    

    1
    如果 (file.getName().endsWith("-release")) 看起来比所有用了ProcessBufferedReader的东西都简单。 - Andrew Mao

    0
    获取Linux发行版名称的一种临时方法是读取/etc/*-release文件的内容。它会给你类似于CentOS release 6.3 (Final)的东西。

    从Java中读取此文件的内容很简单。

    这可能不是最好的方法,但它可以完成工作,而且仅适用于*nix系统,而不适用于Windows。

    似乎这只适用于RedHat派生的发行版。 - Andrew Mao

    0
    你可以使用Java运行uname -r并获取结果;这通常会显示发行版,除非它是由某个人从源代码在他的地下室编译的。对于我的机器:
    mao@korhal ~ $ uname -r
    3.4.9-gentoo
    

    并运行它:

    Process p = Runtime.getRuntime().exec("uname -r");  
    BufferedReader in = new BufferedReader(  
                        new InputStreamReader(p.getInputStream()));  
    String distro = in.readLine();  
    
    // Do something with distro and close reader
    

    编辑:也许对于大多数发行版来说,uname -a 更适合这里。或者查看 /etc/*-release 文件,在大多数情况下都有定义。


    我不认为官方的Ubuntu服务器发行版是由一个在地下室里的家伙编译的:2.6.38-13-server ;) - Brian Roach
    1
    它的输出与os.version相同。 - Haseena
    "uname -a" 正好符合我的需求。 - Haseena

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接