web-dev-qa-db-ja.com

Javaでオペレーティングシステムをプログラム的に決定する方法

私のJavaプログラムがプログラムで実行しているホストのオペレーティングシステムを決定したいと思います(例えば、私がWindowsまたはUnixプラットフォームのどちらにいるかに基づいて、異なるプロパティーをロードできるようにしたいです)。 100%の信頼性でこれを行うための最も安全な方法は何ですか?

460
karlgrz

あなたが使用することができます:

System.getProperty("os.name")

P.Sこのコードは役に立ちます。

class ShowProperties {
    public static void main(String[] args) {
        System.getProperties().list(System.out);
    }
}

それがするすべてはあなたのJava実装によって提供されるすべてのプロパティをプリントアウトすることです。それはあなたのプロパティを介してあなたのJava環境についてあなたが見つけることができるもののアイデアを与えるでしょう。 :-)

565

他の回答で示されているように、System.getPropertyは生データを提供します。しかし、 Apache Commons Langコンポーネント はJava.lang.System用の ラッパーを提供しますSystemUtils.IS_OS_WINDOWS のような便利なプロパティで、前述のSwingx OSのutilとよく似ています。

133
Leif Carlsen

2008年10月:

静的変数にキャッシュすることをお勧めします。

public static final class OsUtils
{
   private static String OS = null;
   public static String getOsName()
   {
      if(OS == null) { OS = System.getProperty("os.name"); }
      return OS;
   }
   public static boolean isWindows()
   {
      return getOsName().startsWith("Windows");
   }

   public static boolean isUnix() // and so on
}

そのように、あなたがOsを要求する度に、あなたはあなたのアプリケーションの寿命の間に複数回プロパティを取得することはありません。


2016年2月:7年以上後:

Windows 10にはバグがあります(これは元の回答の時点では存在していませんでした)。
「Windows 10用の Javaの“ os.name”? 」を参照してください。

74
VonC

上記の回答のリンクのいくつかは壊れているようです。以下のコードに現在のソースコードへのポインタを追加し、結果を評価するときにswitchステートメントを使用できるように、答えとしてenumを使用してチェックを処理するためのアプローチを提供します。

OsCheck.OSType ostype=OsCheck.getOperatingSystemType();
switch (ostype) {
    case Windows: break;
    case MacOS: break;
    case Linux: break;
    case Other: break;
}

ヘルパークラスは次のとおりです。

/**
 * helper class to check the operating system this Java VM runs in
 *
 * please keep the notes below as a pseudo-license
 *
 * http://stackoverflow.com/questions/228477/how-do-i-programmatically-determine-operating-system-in-Java
 * compare to http://svn.terracotta.org/svn/tc/dso/tags/2.6.4/code/base/common/src/com/tc/util/runtime/Os.Java
 * http://www.docjar.com/html/api/org/Apache/commons/lang/SystemUtils.Java.html
 */
import Java.util.Locale;
public static final class OsCheck {
  /**
   * types of Operating Systems
   */
  public enum OSType {
    Windows, MacOS, Linux, Other
  };

  // cached result of OS detection
  protected static OSType detectedOS;

  /**
   * detect the operating system from the os.name System property and cache
   * the result
   * 
   * @returns - the operating system detected
   */
  public static OSType getOperatingSystemType() {
    if (detectedOS == null) {
      String OS = System.getProperty("os.name", "generic").toLowerCase(Locale.ENGLISH);
      if ((OS.indexOf("mac") >= 0) || (OS.indexOf("darwin") >= 0)) {
        detectedOS = OSType.MacOS;
      } else if (OS.indexOf("win") >= 0) {
        detectedOS = OSType.Windows;
      } else if (OS.indexOf("nux") >= 0) {
        detectedOS = OSType.Linux;
      } else {
        detectedOS = OSType.Other;
      }
    }
    return detectedOS;
  }
}
36
Wolfgang Fahl

次のJavaFXクラスには、現在のOSを判断するための静的メソッドがあります(isWindows()、isLinux()...)。

  • com.Sun.javafx.PlatformUtil
  • com.Sun.media.jfxmediaimpl.HostUtils
  • com.Sun.javafx.util.Utils

例:

if (PlatformUtil.isWindows()){
           ...
}
33
Igor Rybak
    private static String OS = System.getProperty("os.name").toLowerCase();

    public static void detectOS() {
        if (isWindows()) {

        } else if (isMac()) {

        } else if (isUnix()) {

        } else {

        }
    }

    private static boolean isWindows() {
        return (OS.indexOf("win") >= 0);
    }

    private static boolean isMac() {
        return (OS.indexOf("mac") >= 0);
    }

    private static boolean isUnix() {
        return (OS.indexOf("nux") >= 0);
    }
11
Nikesh Jauhari

オープンソースプロジェクトがどのようにこのようなことをするのかに興味があるなら、ここでこのジャンクを処理するTerracottaクラス(Os.Java)をチェックすることができます。

そして、あなたはここでJVMバージョン(Vm.JavaとVmVersion.Java)を扱うための同様のクラスを見ることができます:

9
Alex Miller

そのような効用関数のためのUtilクラスがあるとしましょう。次に、オペレーティングシステムの種類ごとにパブリック列挙体を作成します。

public class Util {     
        public enum OS {
            WINDOWS, LINUX, MAC, SOLARIS
        };// Operating systems.

    private static OS os = null;

    public static OS getOS() {
        if (os == null) {
            String operSys = System.getProperty("os.name").toLowerCase();
            if (operSys.contains("win")) {
                os = OS.WINDOWS;
            } else if (operSys.contains("nix") || operSys.contains("nux")
                    || operSys.contains("aix")) {
                os = OS.LINUX;
            } else if (operSys.contains("mac")) {
                os = OS.MAC;
            } else if (operSys.contains("sunos")) {
                os = OS.SOLARIS;
            }
        }
        return os;
    }
}

そうすれば、次のようにして任意のクラスからクラスを簡単に呼び出すことができます。

            switch (Util.getOS()) {
            case WINDOWS:
                //do windows stuff
                break;
            case LINUX:

等々...

8
Memin

このプロジェクトからの引用 https://github.com/RishiGupta12/serial-communication-manager

String osName = System.getProperty("os.name");
String osNameMatch = osName.toLowerCase();
if(osNameMatch.contains("linux")) {
    osType = OS_LINUX;
}else if(osNameMatch.contains("windows")) {
    osType = OS_WINDOWS;
}else if(osNameMatch.contains("solaris") || osNameMatch.contains("sunos")) {
    osType = OS_SOLARIS;
}else if(osNameMatch.contains("mac os") || osNameMatch.contains("macos") || osNameMatch.contains("darwin")) {
    osType = OS_MAC_OS_X;
}else {
}
8
john miller

これを試してください、シンプルで簡単

System.getProperty("os.name");
System.getProperty("os.version");
System.getProperty("os.Arch");
6
Kamidu

私はSwingxの OS Utils がその仕事をしていることがわかりました。

6

以下のコードは、システムAPIから取得できる値、このAPIを介して取得できるすべてのものを示しています。

public class App {
    public static void main( String[] args ) {
        //Operating system name
        System.out.println(System.getProperty("os.name"));

        //Operating system version
        System.out.println(System.getProperty("os.version"));

        //Path separator character used in Java.class.path
        System.out.println(System.getProperty("path.separator"));

        //User working directory
        System.out.println(System.getProperty("user.dir"));

        //User home directory
        System.out.println(System.getProperty("user.home"));

        //User account name
        System.out.println(System.getProperty("user.name"));

        //Operating system architecture
        System.out.println(System.getProperty("os.Arch"));

        //Sequence used by operating system to separate lines in text files
        System.out.println(System.getProperty("line.separator"));

        System.out.println(System.getProperty("Java.version")); //JRE version number

        System.out.println(System.getProperty("Java.vendor.url")); //JRE vendor URL

        System.out.println(System.getProperty("Java.vendor")); //JRE vendor name

        System.out.println(System.getProperty("Java.home")); //Installation directory for Java Runtime Environment (JRE)

        System.out.println(System.getProperty("Java.class.path"));

        System.out.println(System.getProperty("file.separator"));
    }
}

回答: -

Windows 7
6.1
;
C:\Users\user\Documents\workspace-Eclipse\JavaExample
C:\Users\user
user
AMD64


1.7.0_71
http://Java.Oracle.com/
Oracle Corporation
C:\Program Files\Java\jre7
C:\Users\user\Documents\workspace-Eclipse\JavaExample\target\classes
\
5
PAA

フォローすることで、より少ない行でより広い範囲をカバーできると思います

import org.Apache.commons.exec.OS;

if (OS.isFamilyWindows()){
                //load some property
            }
else if (OS.isFamilyUnix()){
                //load some other property
            }

詳細はこちら: https://commons.Apache.org/proper/commons-exec/apidocs/org/Apache/commons/exec/OS.html

5
Nafeez Quraishi
String osName = System.getProperty("os.name");
System.out.println("Operating system " + osName);
4

そのようなものがconstであるべきだと私が信じるという理由だけで、私はWolfgangの答えが好きでした...

だから私は自分自身のためにそれを少し言い換え、それを共有することを考えました:)

/**
 * types of Operating Systems
 *
 * please keep the note below as a pseudo-license
 *
 * helper class to check the operating system this Java VM runs in
 * http://stackoverflow.com/questions/228477/how-do-i-programmatically-determine-operating-system-in-Java
 * compare to http://svn.terracotta.org/svn/tc/dso/tags/2.6.4/code/base/common/src/com/tc/util/runtime/Os.Java
 * http://www.docjar.com/html/api/org/Apache/commons/lang/SystemUtils.Java.html
 */
public enum OSType {
    MacOS("mac", "darwin"),
    Windows("win"),
    Linux("nux"),
    Other("generic");

    private static OSType detectedOS;

    private final String[] keys;

    private OSType(String... keys) {
        this.keys = keys;
    }

    private boolean match(String osKey) {
        for (int i = 0; i < keys.length; i++) {
            if (osKey.indexOf(keys[i]) != -1)
                return true;
        }
        return false;
    }

    public static OSType getOS_Type() {
        if (detectedOS == null)
            detectedOS = getOperatingSystemType(System.getProperty("os.name", Other.keys[0]).toLowerCase());
        return detectedOS;
    }

    private static OSType getOperatingSystemType(String osKey) {
        for (OSType osType : values()) {
            if (osType.match(osKey))
                return osType;
        }
        return Other;
    }
}
2
TacB0sS

あなただけのSun.awt.OSInfo#getOSType()メソッドを使用することができます

2
Kirill Gamazkov

上記の答えはすべて、System#getPropertyサブルーチンの設計内で致命的な欠陥を起こしやすい!

os.nameos.version、およびos.Archプロパティを決して信頼しないでください。これらのプロパティは実際には読み取り専用ではありません—その代わり、攻撃者は任意の文字列リテラルを簡単に挿入できます!

たとえば、私のWindows 10マシンでは、次のコードが実際に文字列リテラル "Linux"を出力します。 次の手順に従う場合:

public static void main(String[] args)
{
     System.out.println(System.getProperty("os.name");
}

これで、classを実行可能ファイルJARにパックした後、実際に実行して、下の図のように実行できます。

$ Java -jar PATH.jar -Dos.name = "Linux"

したがって、上記のallの答えは、プログラムが完全に間違って実行されていると考えるリスクを負う可能性がありますOS。この問題をどのように解決するかを自問するかもしれません。さて、現時点では、この見落としを修正する唯一の方法は、実行時にJVMのパラメーターを手動でチェックすることです。

これらのプロパティをプログラムでクエリする方法の簡単な例を次に示します。 static初期化ブロックをプライマリclassに追加するとします。次に、次のコードにより、誰でもos.nameプロパティを外部から改ざんすることができなくなります。

if (Java.util.Arrays.toString(jdk.internal.misc.VM.getRuntimeArguments()).contains("Dos.name"))
{
    throw new Java.lang.InternalError("Please refrain from tampering with the \"os.name\" property.");
}

jdk.internal.misc.VMclassは、publicを使用するためのものではありません。したがって、本番コードでは使用しないでください!

2
Niklas Simandi

システムのOSタイプ、名前、Java情報などに関するすべての情報を表示するためのこのコード。

public static void main(String[] args) {
    // TODO Auto-generated method stub
    Properties pro = System.getProperties();
    for(Object obj : pro.keySet()){
        System.out.println(" System  "+(String)obj+"     :  "+System.getProperty((String)obj));
    }
}
1
ShinnedHawks

以下のようにcom.Sun.javafx.util.Utilsを使用するだけです。

if ( Utils.isWindows()){
     // LOGIC HERE
}

または使用

boolean isWindows = OSInfo.getOSType().equals(OSInfo.OSType.WINDOWS);
       if (isWindows){
         // YOUR LOGIC HERE
       }
1
itro

Com.Sun.jna.Platformクラスには、次のような便利な静的メソッドがあります。

Platform.isWindows();
Platform.is64Bit();
Platform.isIntel();
Platform.isARM();

そしてもっとたくさん。

Mavenを使用している場合は依存関係を追加するだけです

<dependency>
 <groupId>net.Java.dev.jna</groupId>
 <artifactId>jna</artifactId>
 <version>5.2.0</version>
</dependency>

そうでなければ、jnaライブラリのjarファイル(例:jna-5.2.0.jar)を見つけてクラスパスに追加するだけです。

0