View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      https://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.lang3;
18  
19  import java.io.File;
20  import java.nio.file.Path;
21  import java.nio.file.Paths;
22  
23  /**
24   * Helpers for {@link System}.
25   *
26   * <p>
27   * If a system property cannot be read due to security restrictions, the corresponding field in this class will be set to {@code null} and a message will be
28   * written to {@code System.err}.
29   * </p>
30   * <p>
31   * #ThreadSafe#
32   * </p>
33   *
34   * @since 1.0
35   * @see SystemProperties
36   */
37  public class SystemUtils {
38  
39      /**
40       * The prefix String for all Windows OS.
41       */
42      private static final String OS_NAME_WINDOWS_PREFIX = "Windows";
43  
44      // System property constants
45      // -----------------------------------------------------------------------
46      // These MUST be declared first. Other constants depend on this.
47  
48      /**
49       * A constant for the System Property {@code file.encoding}.
50       *
51       * <p>
52       * File encoding, such as {@code Cp1252}.
53       * </p>
54       * <p>
55       * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
56       * </p>
57       * <p>
58       * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
59       * called after this class is loaded, the value will be out of sync with that System property.
60       * </p>
61       *
62       * @see SystemProperties#getFileEncoding()
63       * @since 2.0
64       * @since Java 1.2
65       */
66      public static final String FILE_ENCODING = SystemProperties.getFileEncoding();
67  
68      /**
69       * A constant for the System Property {@code file.separator}.
70       * <p>
71       * The file separator is:
72       * </p>
73       * <ul>
74       * <li>{@code "/"} on Unix</li>
75       * <li>{@code "\"} on Windows.</li>
76       * </ul>
77       *
78       * <p>
79       * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
80       * </p>
81       * <p>
82       * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
83       * called after this class is loaded, the value will be out of sync with that System property.
84       * </p>
85       *
86       * @see SystemProperties#getFileSeparator()
87       * @deprecated Use {@link File#separator}, since it is guaranteed to be a string containing a single character and it does not require a privilege check.
88       * @since Java 1.1
89       */
90      @Deprecated
91      public static final String FILE_SEPARATOR = SystemProperties.getFileSeparator();
92  
93      /**
94       * A constant for the System Property {@code java.awt.fonts}.
95       *
96       * <p>
97       * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
98       * </p>
99       * <p>
100      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
101      * called after this class is loaded, the value will be out of sync with that System property.
102      * </p>
103      *
104      * @see SystemProperties#getJavaAwtFonts()
105      * @since 2.1
106      * @deprecated Deprecated without replacement.
107      */
108     @Deprecated
109     public static final String JAVA_AWT_FONTS = SystemProperties.getJavaAwtFonts();
110 
111     /**
112      * A constant for the System Property {@code java.awt.graphicsenv}.
113      *
114      * <p>
115      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
116      * </p>
117      * <p>
118      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
119      * called after this class is loaded, the value will be out of sync with that System property.
120      * </p>
121      *
122      * @see SystemProperties#getJavaAwtGraphicsenv()
123      * @since 2.1
124      * @deprecated Deprecated without replacement.
125      */
126     @Deprecated
127     public static final String JAVA_AWT_GRAPHICSENV = SystemProperties.getJavaAwtGraphicsenv();
128 
129     /**
130      * A constant for the System Property {@code java.awt.headless}. The value of this property is the String {@code "true"} or {@code "false"}.
131      *
132      * <p>
133      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
134      * </p>
135      * <p>
136      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
137      * called after this class is loaded, the value will be out of sync with that System property.
138      * </p>
139      *
140      * @see #isJavaAwtHeadless()
141      * @see SystemProperties#getJavaAwtHeadless()
142      * @since 2.1
143      * @since Java 1.4
144      * @deprecated Deprecated without replacement.
145      */
146     @Deprecated
147     public static final String JAVA_AWT_HEADLESS = SystemProperties.getJavaAwtHeadless();
148 
149     /**
150      * A constant for the System Property {@code java.awt.printerjob}.
151      *
152      * <p>
153      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
154      * </p>
155      * <p>
156      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
157      * called after this class is loaded, the value will be out of sync with that System property.
158      * </p>
159      *
160      * @see SystemProperties#getJavaAwtPrinterjob()
161      * @since 2.1
162      * @deprecated Deprecated without replacement.
163      */
164     @Deprecated
165     public static final String JAVA_AWT_PRINTERJOB = SystemProperties.getJavaAwtPrinterjob();
166 
167     /**
168      * A constant for the System Property {@code java.class.path}. Java class path.
169      *
170      * <p>
171      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
172      * </p>
173      * <p>
174      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
175      * called after this class is loaded, the value will be out of sync with that System property.
176      * </p>
177      *
178      * @see SystemProperties#getJavaClassPath()
179      * @since Java 1.1
180      */
181     public static final String JAVA_CLASS_PATH = SystemProperties.getJavaClassPath();
182 
183     /**
184      * A constant for the System Property {@code java.class.version}. Java class format version number.
185      *
186      * <p>
187      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
188      * </p>
189      * <p>
190      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
191      * called after this class is loaded, the value will be out of sync with that System property.
192      * </p>
193      *
194      * @see SystemProperties#getJavaClassVersion()
195      * @since Java 1.1
196      */
197     public static final String JAVA_CLASS_VERSION = SystemProperties.getJavaClassVersion();
198 
199     /**
200      * A constant for the System Property {@code java.compiler}. Name of JIT compiler to use. First in JDK version 1.2. Not used in Sun JDKs after 1.2.
201      *
202      * <p>
203      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
204      * </p>
205      * <p>
206      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
207      * called after this class is loaded, the value will be out of sync with that System property.
208      * </p>
209      *
210      * @see SystemProperties#getJavaCompiler()
211      * @since Java 1.2. Not used in Sun versions after 1.2.
212      * @deprecated Deprecated without replacement.
213      */
214     @Deprecated
215     public static final String JAVA_COMPILER = SystemProperties.getJavaCompiler();
216 
217     /**
218      * A constant for the System Property {@code java.endorsed.dirs}. Path of endorsed directory or directories.
219      *
220      * <p>
221      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
222      * </p>
223      * <p>
224      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
225      * called after this class is loaded, the value will be out of sync with that System property.
226      * </p>
227      *
228      * @see SystemProperties#getJavaEndorsedDirs()
229      * @since Java 1.4
230      * @deprecated Deprecated without replacement.
231      */
232     @Deprecated
233     public static final String JAVA_ENDORSED_DIRS = SystemProperties.getJavaEndorsedDirs();
234 
235     /**
236      * A constant for the System Property {@code java.ext.dirs}. Path of extension directory or directories.
237      *
238      * <p>
239      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
240      * </p>
241      * <p>
242      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
243      * called after this class is loaded, the value will be out of sync with that System property.
244      * </p>
245      *
246      * @see SystemProperties#getJavaExtDirs()
247      * @since Java 1.3
248      * @deprecated Deprecated without replacement.
249      */
250     @Deprecated
251     public static final String JAVA_EXT_DIRS = SystemProperties.getJavaExtDirs();
252 
253     /**
254      * A constant for the System Property {@code java.home}. Java installation directory.
255      *
256      * <p>
257      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
258      * </p>
259      * <p>
260      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
261      * called after this class is loaded, the value will be out of sync with that System property.
262      * </p>
263      *
264      * @see SystemProperties#getJavaHome()
265      * @since Java 1.1
266      */
267     public static final String JAVA_HOME = SystemProperties.getJavaHome();
268 
269     /**
270      * A constant for the System Property {@code java.io.tmpdir}. Default temp file path.
271      *
272      * <p>
273      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
274      * </p>
275      * <p>
276      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
277      * called after this class is loaded, the value will be out of sync with that System property.
278      * </p>
279      *
280      * @see SystemProperties#getJavaIoTmpdir()
281      * @since Java 1.2
282      */
283     public static final String JAVA_IO_TMPDIR = SystemProperties.getJavaIoTmpdir();
284 
285     /**
286      * A constant for the System Property {@code java.library.path}. List of paths to search when loading libraries.
287      *
288      * <p>
289      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
290      * </p>
291      * <p>
292      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
293      * called after this class is loaded, the value will be out of sync with that System property.
294      * </p>
295      *
296      * @see SystemProperties#getJavaLibraryPath()
297      * @since Java 1.2
298      */
299     public static final String JAVA_LIBRARY_PATH = SystemProperties.getJavaLibraryPath();
300 
301     /**
302      * A constant for the System Property {@code java.runtime.name}. Java Runtime Environment name.
303      *
304      * <p>
305      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
306      * </p>
307      * <p>
308      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
309      * called after this class is loaded, the value will be out of sync with that System property.
310      * </p>
311      *
312      * @see SystemProperties#getJavaRuntimeName()
313      * @since 2.0
314      * @since Java 1.3
315      */
316     public static final String JAVA_RUNTIME_NAME = SystemProperties.getJavaRuntimeName();
317 
318     /**
319      * A constant for the System Property {@code java.runtime.version}. Java Runtime Environment version.
320      *
321      * <p>
322      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
323      * </p>
324      * <p>
325      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
326      * called after this class is loaded, the value will be out of sync with that System property.
327      * </p>
328      *
329      * @see SystemProperties#getJavaRuntimeVersion()
330      * @since 2.0
331      * @since Java 1.3
332      */
333     public static final String JAVA_RUNTIME_VERSION = SystemProperties.getJavaRuntimeVersion();
334 
335     /**
336      * A constant for the System Property {@code java.specification.name}. Java Runtime Environment specification name.
337      *
338      * <p>
339      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
340      * </p>
341      * <p>
342      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
343      * called after this class is loaded, the value will be out of sync with that System property.
344      * </p>
345      *
346      * @see SystemProperties#getJavaSpecificationName()
347      * @since Java 1.2
348      */
349     public static final String JAVA_SPECIFICATION_NAME = SystemProperties.getJavaSpecificationName();
350 
351     /**
352      * A constant for the System Property {@code java.specification.vendor}. Java Runtime Environment specification vendor.
353      *
354      * <p>
355      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
356      * </p>
357      * <p>
358      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
359      * called after this class is loaded, the value will be out of sync with that System property.
360      * </p>
361      *
362      * @see SystemProperties#getJavaSpecificationVendor()
363      * @since Java 1.2
364      */
365     public static final String JAVA_SPECIFICATION_VENDOR = SystemProperties.getJavaSpecificationVendor();
366 
367     /**
368      * A constant for the System Property {@code java.specification.version}. Java Runtime Environment specification version.
369      *
370      * <p>
371      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
372      * </p>
373      * <p>
374      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
375      * called after this class is loaded, the value will be out of sync with that System property.
376      * </p>
377      *
378      * @see SystemProperties#getJavaSpecificationVersion()
379      * @since Java 1.3
380      */
381     public static final String JAVA_SPECIFICATION_VERSION = SystemProperties.getJavaSpecificationVersion();
382 
383     private static final JavaVersion JAVA_SPECIFICATION_VERSION_AS_ENUM = JavaVersion.get(JAVA_SPECIFICATION_VERSION);
384 
385     /**
386      * A constant for the System Property {@code java.util.prefs.PreferencesFactory}. A class name.
387      *
388      * <p>
389      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
390      * </p>
391      * <p>
392      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
393      * called after this class is loaded, the value will be out of sync with that System property.
394      * </p>
395      *
396      * @see SystemProperties#getJavaUtilPrefsPreferencesFactory()
397      * @since 2.1
398      * @since Java 1.4
399      */
400     public static final String JAVA_UTIL_PREFS_PREFERENCES_FACTORY = SystemProperties.getJavaUtilPrefsPreferencesFactory();
401 
402     /**
403      * A constant for the System Property {@code java.vendor}. Java vendor-specific string.
404      *
405      * <p>
406      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
407      * </p>
408      * <p>
409      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
410      * called after this class is loaded, the value will be out of sync with that System property.
411      * </p>
412      *
413      * @see SystemProperties#getJavaVendor()
414      * @since Java 1.1
415      */
416     public static final String JAVA_VENDOR = SystemProperties.getJavaVendor();
417 
418     /**
419      * A constant for the System Property {@code java.vendor.url}. Java vendor URL.
420      *
421      * <p>
422      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
423      * </p>
424      * <p>
425      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
426      * called after this class is loaded, the value will be out of sync with that System property.
427      * </p>
428      *
429      * @see SystemProperties#getJavaVendorUrl()
430      * @since Java 1.1
431      */
432     public static final String JAVA_VENDOR_URL = SystemProperties.getJavaVendorUrl();
433 
434     /**
435      * A constant for the System Property {@code java.version}. Java version number.
436      *
437      * <p>
438      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
439      * </p>
440      * <p>
441      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
442      * called after this class is loaded, the value will be out of sync with that System property.
443      * </p>
444      *
445      * @see SystemProperties#getJavaVersion()
446      * @since Java 1.1
447      */
448     public static final String JAVA_VERSION = SystemProperties.getJavaVersion();
449 
450     /**
451      * A constant for the System Property {@code java.vm.info}. Java Virtual Machine implementation info.
452      *
453      * <p>
454      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
455      * </p>
456      * <p>
457      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
458      * called after this class is loaded, the value will be out of sync with that System property.
459      * </p>
460      *
461      * @see SystemProperties#getJavaVmInfo()
462      * @since 2.0
463      * @since Java 1.2
464      */
465     public static final String JAVA_VM_INFO = SystemProperties.getJavaVmInfo();
466 
467     /**
468      * A constant for the System Property {@code java.vm.name}. Java Virtual Machine implementation name.
469      *
470      * <p>
471      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
472      * </p>
473      * <p>
474      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
475      * called after this class is loaded, the value will be out of sync with that System property.
476      * </p>
477      *
478      * @see SystemProperties#getJavaVmName()
479      * @since Java 1.2
480      */
481     public static final String JAVA_VM_NAME = SystemProperties.getJavaVmName();
482 
483     /**
484      * A constant for the System Property {@code java.vm.specification.name}. Java Virtual Machine specification name.
485      *
486      * <p>
487      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
488      * </p>
489      * <p>
490      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
491      * called after this class is loaded, the value will be out of sync with that System property.
492      * </p>
493      *
494      * @see SystemProperties#getJavaVmSpecificationName()
495      * @since Java 1.2
496      */
497     public static final String JAVA_VM_SPECIFICATION_NAME = SystemProperties.getJavaVmSpecificationName();
498 
499     /**
500      * A constant for the System Property {@code java.vm.specification.vendor}. Java Virtual Machine specification vendor.
501      *
502      * <p>
503      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
504      * </p>
505      * <p>
506      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
507      * called after this class is loaded, the value will be out of sync with that System property.
508      * </p>
509      *
510      * @see SystemProperties#getJavaVmSpecificationVendor()
511      * @since Java 1.2
512      */
513     public static final String JAVA_VM_SPECIFICATION_VENDOR = SystemProperties.getJavaVmSpecificationVendor();
514 
515     /**
516      * A constant for the System Property {@code java.vm.specification.version}. Java Virtual Machine specification version.
517      *
518      * <p>
519      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
520      * </p>
521      * <p>
522      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
523      * called after this class is loaded, the value will be out of sync with that System property.
524      * </p>
525      *
526      * @see SystemProperties#getJavaVmSpecificationVersion()
527      * @since Java 1.2
528      */
529     public static final String JAVA_VM_SPECIFICATION_VERSION = SystemProperties.getJavaVmSpecificationVersion();
530 
531     /**
532      * A constant for the System Property {@code java.vm.vendor}. Java Virtual Machine implementation vendor.
533      *
534      * <p>
535      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
536      * </p>
537      * <p>
538      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
539      * called after this class is loaded, the value will be out of sync with that System property.
540      * </p>
541      *
542      * @see SystemProperties#getJavaVmVendor()
543      * @since Java 1.2
544      */
545     public static final String JAVA_VM_VENDOR = SystemProperties.getJavaVmVendor();
546 
547     /**
548      * A constant for the System Property {@code java.vm.version}. Java Virtual Machine implementation version.
549      *
550      * <p>
551      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
552      * </p>
553      * <p>
554      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
555      * called after this class is loaded, the value will be out of sync with that System property.
556      * </p>
557      *
558      * @see SystemProperties#getJavaVmVersion()
559      * @since Java 1.2
560      */
561     public static final String JAVA_VM_VERSION = SystemProperties.getJavaVmVersion();
562 
563     /**
564      * A constant for the System Property {@code line.separator}. Line separator ({@code &quot;\n&quot;} on Unix).
565      *
566      * <p>
567      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
568      * </p>
569      * <p>
570      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
571      * called after this class is loaded, the value will be out of sync with that System property.
572      * </p>
573      *
574      * @see SystemProperties#getLineSeparator()
575      * @deprecated Use {@link System#lineSeparator()} instead, since it does not require a privilege check.
576      * @since Java 1.1
577      */
578     @Deprecated
579     public static final String LINE_SEPARATOR = SystemProperties.getLineSeparator();
580 
581     /**
582      * A constant for the System Property {@code os.arch}. Operating system architecture.
583      *
584      * <p>
585      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
586      * </p>
587      * <p>
588      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
589      * called after this class is loaded, the value will be out of sync with that System property.
590      * </p>
591      *
592      * @see SystemProperties#getOsArch()
593      * @since Java 1.1
594      */
595     public static final String OS_ARCH = SystemProperties.getOsArch();
596 
597     /**
598      * A constant for the System Property {@code os.name}. Operating system name.
599      *
600      * <p>
601      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
602      * </p>
603      * <p>
604      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
605      * called after this class is loaded, the value will be out of sync with that System property.
606      * </p>
607      *
608      * @see SystemProperties#getOsName()
609      * @since Java 1.1
610      */
611     public static final String OS_NAME = SystemProperties.getOsName();
612 
613     /**
614      * A constant for the System Property {@code os.version}. Operating system version.
615      *
616      * <p>
617      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
618      * </p>
619      * <p>
620      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
621      * called after this class is loaded, the value will be out of sync with that System property.
622      * </p>
623      *
624      * @see SystemProperties#getOsVersion()
625      * @since Java 1.1
626      */
627     public static final String OS_VERSION = SystemProperties.getOsVersion();
628 
629     /**
630      * A constant for the System Property {@code path.separator}. Path separator ({@code &quot;:&quot;} on Unix).
631      *
632      * <p>
633      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
634      * </p>
635      * <p>
636      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
637      * called after this class is loaded, the value will be out of sync with that System property.
638      * </p>
639      *
640      * @see SystemProperties#getPathSeparator()
641      * @deprecated Use {@link File#pathSeparator}, since it is guaranteed to be a string containing a single character and it does not require a privilege
642      *             check.
643      * @since Java 1.1
644      */
645     @Deprecated
646     public static final String PATH_SEPARATOR = SystemProperties.getPathSeparator();
647 
648     /**
649      * A constant for the System Property {@code user.country} or {@code user.region}. User's country code, such as {@code "GB"}. First in Java version 1.2 as
650      * {@code user.region}. Renamed to {@code user.country} in 1.4
651      *
652      * <p>
653      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
654      * </p>
655      * <p>
656      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
657      * called after this class is loaded, the value will be out of sync with that System property.
658      * </p>
659      *
660      * @since 2.0
661      * @since Java 1.2
662      */
663     public static final String USER_COUNTRY = SystemProperties.getProperty(SystemProperties.USER_COUNTRY,
664             () -> SystemProperties.getProperty(SystemProperties.USER_REGION));
665 
666     /**
667      * A constant for the System Property {@code user.dir}. User's current working directory.
668      *
669      * <p>
670      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
671      * </p>
672      * <p>
673      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
674      * called after this class is loaded, the value will be out of sync with that System property.
675      * </p>
676      *
677      * @see SystemProperties#getUserDir()
678      * @since Java 1.1
679      */
680     public static final String USER_DIR = SystemProperties.getUserDir();
681 
682     /**
683      * A constant for the System Property {@code user.home}. User's home directory.
684      *
685      * <p>
686      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
687      * </p>
688      * <p>
689      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
690      * called after this class is loaded, the value will be out of sync with that System property.
691      * </p>
692      *
693      * @see SystemProperties#getUserHome()
694      * @since Java 1.1
695      */
696     public static final String USER_HOME = SystemProperties.getUserHome();
697 
698     /**
699      * A constant for the System Property {@code user.language}. User's language code, such as {@code "en"}.
700      *
701      * <p>
702      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
703      * </p>
704      * <p>
705      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
706      * called after this class is loaded, the value will be out of sync with that System property.
707      * </p>
708      *
709      * @see SystemProperties#getUserLanguage()
710      * @since 2.0
711      * @since Java 1.2
712      */
713     public static final String USER_LANGUAGE = SystemProperties.getUserLanguage();
714 
715     /**
716      * A constant for the System Property {@code user.name}. User's account name.
717      *
718      * <p>
719      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
720      * </p>
721      * <p>
722      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
723      * called after this class is loaded, the value will be out of sync with that System property.
724      * </p>
725      *
726      * @see SystemProperties#getUserName()
727      * @since Java 1.1
728      */
729     public static final String USER_NAME = SystemProperties.getUserName();
730 
731     /**
732      * A constant for the System Property {@code user.timezone}. For example: {@code "America/Los_Angeles"}.
733      *
734      * <p>
735      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
736      * </p>
737      * <p>
738      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
739      * called after this class is loaded, the value will be out of sync with that System property.
740      * </p>
741      *
742      * @see SystemProperties#getUserTimezone()
743      * @since 2.1
744      */
745     public static final String USER_TIMEZONE = SystemProperties.getUserTimezone();
746 
747     // Java version checks
748     // -----------------------------------------------------------------------
749     // These MUST be declared after those above as they depend on the
750     // values being set up
751 
752     /**
753      * The constant {@code true} if this is Java version 1.1 (also 1.1.x versions).
754      * <p>
755      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
756      * </p>
757      * <p>
758      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
759      * </p>
760      * <p>
761      * This value is initialized when the class is loaded.
762      * </p>
763      */
764     public static final boolean IS_JAVA_1_1 = getJavaVersionMatches("1.1");
765 
766     /**
767      * The constant {@code true} if this is Java version 1.2 (also 1.2.x versions).
768      * <p>
769      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
770      * </p>
771      * <p>
772      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
773      * </p>
774      * <p>
775      * This value is initialized when the class is loaded.
776      * </p>
777      */
778     public static final boolean IS_JAVA_1_2 = getJavaVersionMatches("1.2");
779 
780     /**
781      * The constant {@code true} if this is Java version 1.3 (also 1.3.x versions).
782      * <p>
783      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
784      * </p>
785      * <p>
786      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
787      * </p>
788      * <p>
789      * This value is initialized when the class is loaded.
790      * </p>
791      */
792     public static final boolean IS_JAVA_1_3 = getJavaVersionMatches("1.3");
793 
794     /**
795      * The constant {@code true} if this is Java version 1.4 (also 1.4.x versions).
796      * <p>
797      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
798      * </p>
799      * <p>
800      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
801      * </p>
802      * <p>
803      * This value is initialized when the class is loaded.
804      * </p>
805      */
806     public static final boolean IS_JAVA_1_4 = getJavaVersionMatches("1.4");
807 
808     /**
809      * The constant {@code true} if this is Java version 1.5 (also 1.5.x versions).
810      * <p>
811      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
812      * </p>
813      * <p>
814      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
815      * </p>
816      * <p>
817      * This value is initialized when the class is loaded.
818      * </p>
819      */
820     public static final boolean IS_JAVA_1_5 = getJavaVersionMatches("1.5");
821 
822     /**
823      * The constant {@code true} if this is Java version 1.6 (also 1.6.x versions).
824      * <p>
825      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
826      * </p>
827      * <p>
828      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
829      * </p>
830      * <p>
831      * This value is initialized when the class is loaded.
832      * </p>
833      */
834     public static final boolean IS_JAVA_1_6 = getJavaVersionMatches("1.6");
835 
836     /**
837      * The constant {@code true} if this is Java version 1.7 (also 1.7.x versions).
838      * <p>
839      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
840      * </p>
841      * <p>
842      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
843      * </p>
844      * <p>
845      * This value is initialized when the class is loaded.
846      * </p>
847      *
848      * @since 3.0
849      */
850     public static final boolean IS_JAVA_1_7 = getJavaVersionMatches("1.7");
851 
852     /**
853      * The constant {@code true} if this is Java version 1.8 (also 1.8.x versions).
854      * <p>
855      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
856      * </p>
857      * <p>
858      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
859      * </p>
860      * <p>
861      * This value is initialized when the class is loaded.
862      * </p>
863      *
864      * @since 3.3.2
865      */
866     public static final boolean IS_JAVA_1_8 = getJavaVersionMatches("1.8");
867 
868     /**
869      * The constant {@code true} if this is Java version 1.9 (also 1.9.x versions).
870      * <p>
871      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
872      * </p>
873      * <p>
874      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
875      * </p>
876      * <p>
877      * This value is initialized when the class is loaded.
878      * </p>
879      *
880      * @since 3.4
881      * @deprecated As of release 3.5, replaced by {@link #IS_JAVA_9}.
882      */
883     @Deprecated
884     public static final boolean IS_JAVA_1_9 = getJavaVersionMatches("9");
885 
886     /**
887      * The constant {@code true} if this is Java version 9 (also 9.x versions).
888      * <p>
889      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
890      * </p>
891      * <p>
892      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
893      * </p>
894      * <p>
895      * This value is initialized when the class is loaded.
896      * </p>
897      *
898      * @since 3.5
899      */
900     public static final boolean IS_JAVA_9 = getJavaVersionMatches("9");
901 
902     /**
903      * The constant {@code true} if this is Java version 10 (also 10.x versions).
904      * <p>
905      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
906      * </p>
907      * <p>
908      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
909      * </p>
910      * <p>
911      * This value is initialized when the class is loaded.
912      * </p>
913      *
914      * @since 3.7
915      */
916     public static final boolean IS_JAVA_10 = getJavaVersionMatches("10");
917 
918     /**
919      * The constant {@code true} if this is Java version 11 (also 11.x versions).
920      * <p>
921      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
922      * </p>
923      * <p>
924      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
925      * </p>
926      * <p>
927      * This value is initialized when the class is loaded.
928      * </p>
929      *
930      * @since 3.8
931      */
932     public static final boolean IS_JAVA_11 = getJavaVersionMatches("11");
933 
934     /**
935      * The constant {@code true} if this is Java version 12 (also 12.x versions).
936      * <p>
937      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
938      * </p>
939      * <p>
940      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
941      * </p>
942      * <p>
943      * This value is initialized when the class is loaded.
944      * </p>
945      *
946      * @since 3.9
947      */
948     public static final boolean IS_JAVA_12 = getJavaVersionMatches("12");
949 
950     /**
951      * The constant {@code true} if this is Java version 13 (also 13.x versions).
952      * <p>
953      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
954      * </p>
955      * <p>
956      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
957      * </p>
958      * <p>
959      * This value is initialized when the class is loaded.
960      * </p>
961      *
962      * @since 3.9
963      */
964     public static final boolean IS_JAVA_13 = getJavaVersionMatches("13");
965 
966     /**
967      * The constant {@code true} if this is Java version 14 (also 14.x versions).
968      * <p>
969      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
970      * </p>
971      * <p>
972      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
973      * </p>
974      * <p>
975      * This value is initialized when the class is loaded.
976      * </p>
977      *
978      * @since 3.10
979      */
980     public static final boolean IS_JAVA_14 = getJavaVersionMatches("14");
981 
982     /**
983      * The constant {@code true} if this is Java version 15 (also 15.x versions).
984      * <p>
985      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
986      * </p>
987      * <p>
988      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
989      * </p>
990      * <p>
991      * This value is initialized when the class is loaded.
992      * </p>
993      *
994      * @since 3.10
995      */
996     public static final boolean IS_JAVA_15 = getJavaVersionMatches("15");
997 
998     /**
999      * The constant {@code true} if this is Java version 16 (also 16.x versions).
1000      * <p>
1001      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1002      * </p>
1003      * <p>
1004      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1005      * </p>
1006      * <p>
1007      * This value is initialized when the class is loaded.
1008      * </p>
1009      *
1010      * @since 3.13.0
1011      */
1012     public static final boolean IS_JAVA_16 = getJavaVersionMatches("16");
1013 
1014     /**
1015      * The constant {@code true} if this is Java version 17 (also 17.x versions).
1016      * <p>
1017      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1018      * </p>
1019      * <p>
1020      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1021      * </p>
1022      * <p>
1023      * This value is initialized when the class is loaded.
1024      * </p>
1025      *
1026      * @since 3.13.0
1027      */
1028     public static final boolean IS_JAVA_17 = getJavaVersionMatches("17");
1029 
1030     /**
1031      * The constant {@code true} if this is Java version 18 (also 18.x versions).
1032      * <p>
1033      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1034      * </p>
1035      * <p>
1036      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1037      * </p>
1038      * <p>
1039      * This value is initialized when the class is loaded.
1040      * </p>
1041      *
1042      * @since 3.13.0
1043      */
1044     public static final boolean IS_JAVA_18 = getJavaVersionMatches("18");
1045 
1046     /**
1047      * The constant {@code true} if this is Java version 19 (also 19.x versions).
1048      * <p>
1049      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1050      * </p>
1051      * <p>
1052      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1053      * </p>
1054      * <p>
1055      * This value is initialized when the class is loaded.
1056      * </p>
1057      *
1058      * @since 3.13.0
1059      */
1060     public static final boolean IS_JAVA_19 = getJavaVersionMatches("19");
1061 
1062     /**
1063      * The constant {@code true} if this is Java version 20 (also 20.x versions).
1064      * <p>
1065      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1066      * </p>
1067      * <p>
1068      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1069      * </p>
1070      * <p>
1071      * This value is initialized when the class is loaded.
1072      * </p>
1073      *
1074      * @since 3.13.0
1075      */
1076     public static final boolean IS_JAVA_20 = getJavaVersionMatches("20");
1077 
1078     /**
1079      * The constant {@code true} if this is Java version 21 (also 21.x versions).
1080      * <p>
1081      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1082      * </p>
1083      * <p>
1084      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1085      * </p>
1086      * <p>
1087      * This value is initialized when the class is loaded.
1088      * </p>
1089      *
1090      * @since 3.13.0
1091      */
1092     public static final boolean IS_JAVA_21 = getJavaVersionMatches("21");
1093 
1094     /**
1095      * The constant {@code true} if this is Java version 22 (also 22.x versions).
1096      * <p>
1097      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1098      * </p>
1099      * <p>
1100      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1101      * </p>
1102      * <p>
1103      * This value is initialized when the class is loaded.
1104      * </p>
1105      *
1106      * @since 3.15.0
1107      */
1108     public static final boolean IS_JAVA_22 = getJavaVersionMatches("22");
1109 
1110     /**
1111      * The constant {@code true} if this is Java version 23 (also 23.x versions).
1112      * <p>
1113      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1114      * </p>
1115      * <p>
1116      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1117      * </p>
1118      * <p>
1119      * This value is initialized when the class is loaded.
1120      * </p>
1121      *
1122      * @since 3.18.0
1123      */
1124     public static final boolean IS_JAVA_23 = getJavaVersionMatches("23");
1125 
1126     /**
1127      * The constant {@code true} if this is Java version 24 (also 24.x versions).
1128      * <p>
1129      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1130      * </p>
1131      * <p>
1132      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1133      * </p>
1134      * <p>
1135      * This value is initialized when the class is loaded.
1136      * </p>
1137      *
1138      * @since 3.18.0
1139      */
1140     public static final boolean IS_JAVA_24 = getJavaVersionMatches("24");
1141 
1142     // Operating system checks
1143     // -----------------------------------------------------------------------
1144     // These MUST be declared after those above as they depend on the
1145     // values being set up
1146     // Please advise dev@commons.apache.org if you want another added
1147     // or a mistake corrected
1148 
1149     /**
1150      * The constant {@code true} if this is AIX.
1151      * <p>
1152      * The result depends on the value of the {@link #OS_NAME} constant.
1153      * </p>
1154      * <p>
1155      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1156      * </p>
1157      * <p>
1158      * This value is initialized when the class is loaded.
1159      * </p>
1160      *
1161      * @since 2.0
1162      */
1163     public static final boolean IS_OS_AIX = getOsNameMatches("AIX");
1164 
1165     /**
1166      * The constant {@code true} if this is Android.
1167      *
1168      * <p>
1169      * See https://developer.android.com/reference/java/lang/System#getProperties().
1170      * </p>
1171      * <p>
1172      * This value is initialized when the class is loaded.
1173      * </p>
1174      *
1175      * @since 3.15.0
1176      */
1177     public static final boolean IS_OS_ANDROID = Strings.CS.contains(SystemProperties.getJavaVendor(), "Android");
1178 
1179     /**
1180      * The constant {@code true} if this is HP-UX.
1181      * <p>
1182      * The result depends on the value of the {@link #OS_NAME} constant.
1183      * </p>
1184      * <p>
1185      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1186      * </p>
1187      * <p>
1188      * This value is initialized when the class is loaded.
1189      * </p>
1190      *
1191      * @since 2.0
1192      */
1193     public static final boolean IS_OS_HP_UX = getOsNameMatches("HP-UX");
1194 
1195     /**
1196      * The constant {@code true} if this is IBM OS/400.
1197      * <p>
1198      * The result depends on the value of the {@link #OS_NAME} constant.
1199      * </p>
1200      * <p>
1201      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1202      * </p>
1203      * <p>
1204      * This value is initialized when the class is loaded.
1205      * </p>
1206      *
1207      * @since 3.3
1208      */
1209     public static final boolean IS_OS_400 = getOsNameMatches("OS/400");
1210 
1211     /**
1212      * The constant {@code true} if this is Irix.
1213      * <p>
1214      * The result depends on the value of the {@link #OS_NAME} constant.
1215      * </p>
1216      * <p>
1217      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1218      * </p>
1219      * <p>
1220      * This value is initialized when the class is loaded.
1221      * </p>
1222      *
1223      * @since 2.0
1224      */
1225     public static final boolean IS_OS_IRIX = getOsNameMatches("Irix");
1226 
1227     /**
1228      * The constant {@code true} if this is Linux.
1229      * <p>
1230      * The result depends on the value of the {@link #OS_NAME} constant.
1231      * </p>
1232      * <p>
1233      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1234      * </p>
1235      * <p>
1236      * This value is initialized when the class is loaded.
1237      * </p>
1238      *
1239      * @since 2.0
1240      */
1241     public static final boolean IS_OS_LINUX = getOsNameMatches("Linux");
1242 
1243     /**
1244      * The constant {@code true} if this is Mac.
1245      * <p>
1246      * The result depends on the value of the {@link #OS_NAME} constant.
1247      * </p>
1248      * <p>
1249      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1250      * </p>
1251      * <p>
1252      * This value is initialized when the class is loaded.
1253      * </p>
1254      *
1255      * @since 2.0
1256      */
1257     public static final boolean IS_OS_MAC = getOsNameMatches("Mac");
1258 
1259     /**
1260      * The constant {@code true} if this is Mac.
1261      * <p>
1262      * The result depends on the value of the {@link #OS_NAME} constant.
1263      * </p>
1264      * <p>
1265      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1266      * </p>
1267      * <p>
1268      * This value is initialized when the class is loaded.
1269      * </p>
1270      *
1271      * @since 2.0
1272      */
1273     public static final boolean IS_OS_MAC_OSX = getOsNameMatches("Mac OS X");
1274 
1275     /**
1276      * The constant {@code true} if this is macOS X Cheetah.
1277      * <p>
1278      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1279      * </p>
1280      * <p>
1281      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1282      * </p>
1283      * <p>
1284      * This value is initialized when the class is loaded.
1285      * </p>
1286      *
1287      * @since 3.4
1288      */
1289     public static final boolean IS_OS_MAC_OSX_CHEETAH = getOsMatches("Mac OS X", "10.0");
1290 
1291     /**
1292      * The constant {@code true} if this is macOS X Puma.
1293      * <p>
1294      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1295      * </p>
1296      * <p>
1297      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1298      * </p>
1299      * <p>
1300      * This value is initialized when the class is loaded.
1301      * </p>
1302      *
1303      * @since 3.4
1304      */
1305     public static final boolean IS_OS_MAC_OSX_PUMA = getOsMatches("Mac OS X", "10.1");
1306 
1307     /**
1308      * The constant {@code true} if this is macOS X Jaguar.
1309      * <p>
1310      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1311      * </p>
1312      * <p>
1313      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1314      * </p>
1315      * <p>
1316      * This value is initialized when the class is loaded.
1317      * </p>
1318      *
1319      * @since 3.4
1320      */
1321     public static final boolean IS_OS_MAC_OSX_JAGUAR = getOsMatches("Mac OS X", "10.2");
1322 
1323     /**
1324      * The constant {@code true} if this is macOS X Panther.
1325      * <p>
1326      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1327      * </p>
1328      * <p>
1329      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1330      * </p>
1331      * <p>
1332      * This value is initialized when the class is loaded.
1333      * </p>
1334      *
1335      * @since 3.4
1336      */
1337     public static final boolean IS_OS_MAC_OSX_PANTHER = getOsMatches("Mac OS X", "10.3");
1338 
1339     /**
1340      * The constant {@code true} if this is macOS X Tiger.
1341      * <p>
1342      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1343      * </p>
1344      * <p>
1345      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1346      * </p>
1347      * <p>
1348      * This value is initialized when the class is loaded.
1349      * </p>
1350      *
1351      * @since 3.4
1352      */
1353     public static final boolean IS_OS_MAC_OSX_TIGER = getOsMatches("Mac OS X", "10.4");
1354 
1355     /**
1356      * The constant {@code true} if this is macOS X Leopard.
1357      * <p>
1358      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1359      * </p>
1360      * <p>
1361      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1362      * </p>
1363      * <p>
1364      * This value is initialized when the class is loaded.
1365      * </p>
1366      *
1367      * @since 3.4
1368      */
1369     public static final boolean IS_OS_MAC_OSX_LEOPARD = getOsMatches("Mac OS X", "10.5");
1370 
1371     /**
1372      * The constant {@code true} if this is macOS X Snow Leopard.
1373      * <p>
1374      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1375      * </p>
1376      * <p>
1377      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1378      * </p>
1379      * <p>
1380      * This value is initialized when the class is loaded.
1381      * </p>
1382      *
1383      * @since 3.4
1384      */
1385     public static final boolean IS_OS_MAC_OSX_SNOW_LEOPARD = getOsMatches("Mac OS X", "10.6");
1386 
1387     /**
1388      * The constant {@code true} if this is macOS X Lion.
1389      * <p>
1390      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1391      * </p>
1392      * <p>
1393      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1394      * </p>
1395      * <p>
1396      * This value is initialized when the class is loaded.
1397      * </p>
1398      *
1399      * @since 3.4
1400      */
1401     public static final boolean IS_OS_MAC_OSX_LION = getOsMatches("Mac OS X", "10.7");
1402 
1403     /**
1404      * The constant {@code true} if this is macOS X Mountain Lion.
1405      * <p>
1406      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1407      * </p>
1408      * <p>
1409      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1410      * </p>
1411      * <p>
1412      * This value is initialized when the class is loaded.
1413      * </p>
1414      *
1415      * @since 3.4
1416      */
1417     public static final boolean IS_OS_MAC_OSX_MOUNTAIN_LION = getOsMatches("Mac OS X", "10.8");
1418 
1419     /**
1420      * The constant {@code true} if this is macOS X Mavericks.
1421      * <p>
1422      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1423      * </p>
1424      * <p>
1425      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1426      * </p>
1427      * <p>
1428      * This value is initialized when the class is loaded.
1429      * </p>
1430      *
1431      * @since 3.4
1432      */
1433     public static final boolean IS_OS_MAC_OSX_MAVERICKS = getOsMatches("Mac OS X", "10.9");
1434 
1435     /**
1436      * The constant {@code true} if this is macOS X Yosemite.
1437      * <p>
1438      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1439      * </p>
1440      * <p>
1441      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1442      * </p>
1443      * <p>
1444      * This value is initialized when the class is loaded.
1445      * </p>
1446      *
1447      * @since 3.4
1448      */
1449     public static final boolean IS_OS_MAC_OSX_YOSEMITE = getOsMatches("Mac OS X", "10.10");
1450 
1451     /**
1452      * The constant {@code true} if this is macOS X El Capitan.
1453      * <p>
1454      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1455      * </p>
1456      * <p>
1457      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1458      * </p>
1459      * <p>
1460      * This value is initialized when the class is loaded.
1461      * </p>
1462      *
1463      * @since 3.5
1464      */
1465     public static final boolean IS_OS_MAC_OSX_EL_CAPITAN = getOsMatches("Mac OS X", "10.11");
1466 
1467     /**
1468      * The constant {@code true} if this is macOS X Sierra.
1469      * <p>
1470      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1471      * </p>
1472      * <p>
1473      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1474      * </p>
1475      * <p>
1476      * This value is initialized when the class is loaded.
1477      * </p>
1478      *
1479      * @since 3.12.0
1480      */
1481     public static final boolean IS_OS_MAC_OSX_SIERRA = getOsMatches("Mac OS X", "10.12");
1482 
1483     /**
1484      * The constant {@code true} if this is macOS X High Sierra.
1485      * <p>
1486      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1487      * </p>
1488      * <p>
1489      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1490      * </p>
1491      * <p>
1492      * This value is initialized when the class is loaded.
1493      * </p>
1494      *
1495      * @since 3.12.0
1496      */
1497     public static final boolean IS_OS_MAC_OSX_HIGH_SIERRA = getOsMatches("Mac OS X", "10.13");
1498 
1499     /**
1500      * The constant {@code true} if this is macOS X Mojave.
1501      * <p>
1502      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1503      * </p>
1504      * <p>
1505      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1506      * </p>
1507      * <p>
1508      * This value is initialized when the class is loaded.
1509      * </p>
1510      *
1511      * @since 3.12.0
1512      */
1513     public static final boolean IS_OS_MAC_OSX_MOJAVE = getOsMatches("Mac OS X", "10.14");
1514 
1515     /**
1516      * The constant {@code true} if this is macOS X Catalina.
1517      *
1518      * <p>
1519      * The field will return {@code false} if {@code OS_NAME} is {@code null}.
1520      * </p>
1521      * <p>
1522      * This value is initialized when the class is loaded.
1523      * </p>
1524      *
1525      * @since 3.12.0
1526      */
1527     public static final boolean IS_OS_MAC_OSX_CATALINA = getOsMatches("Mac OS X", "10.15");
1528 
1529     /**
1530      * The constant {@code true} if this is macOS X Big Sur.
1531      * <p>
1532      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1533      * </p>
1534      * <p>
1535      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1536      * </p>
1537      * <p>
1538      * This value is initialized when the class is loaded.
1539      * </p>
1540      *
1541      * @since 3.12.0
1542      */
1543     public static final boolean IS_OS_MAC_OSX_BIG_SUR = getOsMatches("Mac OS X", "11");
1544 
1545     /**
1546      * The constant {@code true} if this is macOS X Monterey.
1547      * <p>
1548      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1549      * </p>
1550      * <p>
1551      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1552      * </p>
1553      * <p>
1554      * This value is initialized when the class is loaded.
1555      * </p>
1556      *
1557      * @since 3.13.0
1558      */
1559     public static final boolean IS_OS_MAC_OSX_MONTEREY = getOsMatches("Mac OS X", "12");
1560 
1561     /**
1562      * The constant {@code true} if this is macOS X Ventura.
1563      * <p>
1564      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1565      * </p>
1566      * <p>
1567      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1568      * </p>
1569      * <p>
1570      * This value is initialized when the class is loaded.
1571      * </p>
1572      *
1573      * @since 3.13.0
1574      */
1575     public static final boolean IS_OS_MAC_OSX_VENTURA = getOsMatches("Mac OS X", "13");
1576 
1577     /**
1578      * The constant {@code true} if this is macOS X Sonoma.
1579      * <p>
1580      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1581      * </p>
1582      * <p>
1583      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1584      * </p>
1585      * <p>
1586      * This value is initialized when the class is loaded.
1587      * </p>
1588      *
1589      * @since 3.15.0
1590      */
1591     public static final boolean IS_OS_MAC_OSX_SONOMA = getOsMatches("Mac OS X", "14");
1592 
1593     /**
1594      * The constant {@code true} if this is macOS X Sequoia.
1595      * <p>
1596      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1597      * </p>
1598      * <p>
1599      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1600      * </p>
1601      * <p>
1602      * This value is initialized when the class is loaded.
1603      * </p>
1604      *
1605      * @since 3.18.0
1606      */
1607     public static final boolean IS_OS_MAC_OSX_SEQUOIA = getOsMatches("Mac OS X", "15");
1608 
1609     /**
1610      * The constant {@code true} if this is FreeBSD.
1611      * <p>
1612      * The result depends on the value of the {@link #OS_NAME} constant.
1613      * </p>
1614      * <p>
1615      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1616      * </p>
1617      * <p>
1618      * This value is initialized when the class is loaded.
1619      * </p>
1620      *
1621      * @since 3.1
1622      */
1623     public static final boolean IS_OS_FREE_BSD = getOsNameMatches("FreeBSD");
1624 
1625     /**
1626      * The constant {@code true} if this is OpenBSD.
1627      * <p>
1628      * The result depends on the value of the {@link #OS_NAME} constant.
1629      * </p>
1630      * <p>
1631      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1632      * </p>
1633      * <p>
1634      * This value is initialized when the class is loaded.
1635      * </p>
1636      *
1637      * @since 3.1
1638      */
1639     public static final boolean IS_OS_OPEN_BSD = getOsNameMatches("OpenBSD");
1640 
1641     /**
1642      * The constant {@code true} if this is NetBSD.
1643      * <p>
1644      * The result depends on the value of the {@link #OS_NAME} constant.
1645      * </p>
1646      * <p>
1647      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1648      * </p>
1649      * <p>
1650      * This value is initialized when the class is loaded.
1651      * </p>
1652      *
1653      * @since 3.1
1654      */
1655     public static final boolean IS_OS_NET_BSD = getOsNameMatches("NetBSD");
1656 
1657     /**
1658      * The constant {@code true} if this is Netware.
1659      * <p>
1660      * The result depends on the value of the {@link #OS_NAME} constant.
1661      * </p>
1662      * <p>
1663      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1664      * </p>
1665      * <p>
1666      * This value is initialized when the class is loaded.
1667      * </p>
1668      *
1669      * @since 3.19.0
1670      */
1671     public static final boolean IS_OS_NETWARE = getOsNameMatches("Netware");
1672 
1673     /**
1674      * The constant {@code true} if this is OS/2.
1675      * <p>
1676      * The result depends on the value of the {@link #OS_NAME} constant.
1677      * </p>
1678      * <p>
1679      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1680      * </p>
1681      * <p>
1682      * This value is initialized when the class is loaded.
1683      * </p>
1684      *
1685      * @since 2.0
1686      */
1687     public static final boolean IS_OS_OS2 = getOsNameMatches("OS/2");
1688 
1689     /**
1690      * The constant {@code true} if this is Solaris.
1691      * <p>
1692      * The result depends on the value of the {@link #OS_NAME} constant.
1693      * </p>
1694      * <p>
1695      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1696      * </p>
1697      * <p>
1698      * This value is initialized when the class is loaded.
1699      * </p>
1700      *
1701      * @since 2.0
1702      */
1703     public static final boolean IS_OS_SOLARIS = getOsNameMatches("Solaris");
1704 
1705     /**
1706      * The constant {@code true} if this is SunOS.
1707      * <p>
1708      * The result depends on the value of the {@link #OS_NAME} constant.
1709      * </p>
1710      * <p>
1711      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1712      * </p>
1713      * <p>
1714      * This value is initialized when the class is loaded.
1715      * </p>
1716      *
1717      * @since 2.0
1718      */
1719     public static final boolean IS_OS_SUN_OS = getOsNameMatches("SunOS");
1720 
1721     /**
1722      * The constant {@code true} if this is a Unix like system, as in any of AIX, HP-UX, Irix, Linux, MacOSX, Solaris or SUN OS.
1723      *
1724      * <p>
1725      * The field will return {@code false} if {@code OS_NAME} is {@code null}.
1726      * </p>
1727      * <p>
1728      * This value is initialized when the class is loaded.
1729      * </p>
1730      *
1731      * @since 2.1
1732      */
1733     public static final boolean IS_OS_UNIX = IS_OS_AIX || IS_OS_HP_UX || IS_OS_IRIX || IS_OS_LINUX || IS_OS_MAC_OSX || IS_OS_SOLARIS || IS_OS_SUN_OS
1734             || IS_OS_FREE_BSD || IS_OS_OPEN_BSD || IS_OS_NET_BSD;
1735 
1736     /**
1737      * The constant {@code true} if this is Windows.
1738      * <p>
1739      * The result depends on the value of the {@link #OS_NAME} constant.
1740      * </p>
1741      * <p>
1742      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1743      * </p>
1744      * <p>
1745      * This value is initialized when the class is loaded.
1746      * </p>
1747      *
1748      * @since 2.0
1749      */
1750     public static final boolean IS_OS_WINDOWS = getOsNameMatches(OS_NAME_WINDOWS_PREFIX);
1751 
1752     /**
1753      * The constant {@code true} if this is Windows 2000.
1754      * <p>
1755      * The result depends on the value of the {@link #OS_NAME} constant.
1756      * </p>
1757      * <p>
1758      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1759      * </p>
1760      * <p>
1761      * This value is initialized when the class is loaded.
1762      * </p>
1763      *
1764      * @since 2.0
1765      */
1766     public static final boolean IS_OS_WINDOWS_2000 = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " 2000");
1767 
1768     /**
1769      * The constant {@code true} if this is Windows 2003.
1770      * <p>
1771      * The result depends on the value of the {@link #OS_NAME} constant.
1772      * </p>
1773      * <p>
1774      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1775      * </p>
1776      * <p>
1777      * This value is initialized when the class is loaded.
1778      * </p>
1779      *
1780      * @since 3.1
1781      */
1782     public static final boolean IS_OS_WINDOWS_2003 = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " 2003");
1783 
1784     /**
1785      * The constant {@code true} if this is Windows Server 2008.
1786      * <p>
1787      * The result depends on the value of the {@link #OS_NAME} constant.
1788      * </p>
1789      * <p>
1790      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1791      * </p>
1792      * <p>
1793      * This value is initialized when the class is loaded.
1794      * </p>
1795      *
1796      * @since 3.1
1797      */
1798     public static final boolean IS_OS_WINDOWS_2008 = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " Server 2008");
1799 
1800     /**
1801      * The constant {@code true} if this is Windows Server 2012.
1802      * <p>
1803      * The result depends on the value of the {@link #OS_NAME} constant.
1804      * </p>
1805      * <p>
1806      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1807      * </p>
1808      * <p>
1809      * This value is initialized when the class is loaded.
1810      * </p>
1811      *
1812      * @since 3.4
1813      */
1814     public static final boolean IS_OS_WINDOWS_2012 = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " Server 2012");
1815 
1816     /**
1817      * The constant {@code true} if this is Windows 95.
1818      * <p>
1819      * The result depends on the value of the {@link #OS_NAME} constant.
1820      * </p>
1821      * <p>
1822      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1823      * </p>
1824      * <p>
1825      * This value is initialized when the class is loaded.
1826      * </p>
1827      *
1828      * @since 2.0
1829      */
1830     public static final boolean IS_OS_WINDOWS_95 = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " 95");
1831 
1832     /**
1833      * The constant {@code true} if this is Windows 98.
1834      * <p>
1835      * The result depends on the value of the {@link #OS_NAME} constant.
1836      * </p>
1837      * <p>
1838      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1839      * </p>
1840      * <p>
1841      * This value is initialized when the class is loaded.
1842      * </p>
1843      *
1844      * @since 2.0
1845      */
1846     public static final boolean IS_OS_WINDOWS_98 = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " 98");
1847 
1848     /**
1849      * The constant {@code true} if this is Windows ME.
1850      * <p>
1851      * The result depends on the value of the {@link #OS_NAME} constant.
1852      * </p>
1853      * <p>
1854      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1855      * </p>
1856      * <p>
1857      * This value is initialized when the class is loaded.
1858      * </p>
1859      *
1860      * @since 2.0
1861      */
1862     public static final boolean IS_OS_WINDOWS_ME = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " Me");
1863 
1864     /**
1865      * The constant {@code true} if this is Windows NT.
1866      * <p>
1867      * The result depends on the value of the {@link #OS_NAME} constant.
1868      * </p>
1869      * <p>
1870      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1871      * </p>
1872      * <p>
1873      * This value is initialized when the class is loaded.
1874      * </p>
1875      *
1876      * @since 2.0
1877      */
1878     public static final boolean IS_OS_WINDOWS_NT = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " NT");
1879 
1880     /**
1881      * The constant {@code true} if this is Windows XP.
1882      * <p>
1883      * The result depends on the value of the {@link #OS_NAME} constant.
1884      * </p>
1885      * <p>
1886      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1887      * </p>
1888      * <p>
1889      * This value is initialized when the class is loaded.
1890      * </p>
1891      *
1892      * @since 2.0
1893      */
1894     public static final boolean IS_OS_WINDOWS_XP = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " XP");
1895 
1896     /**
1897      * The constant {@code true} if this is Windows Vista.
1898      * <p>
1899      * The result depends on the value of the {@link #OS_NAME} constant.
1900      * </p>
1901      * <p>
1902      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1903      * </p>
1904      * <p>
1905      * This value is initialized when the class is loaded.
1906      * </p>
1907      *
1908      * @since 2.4
1909      */
1910     public static final boolean IS_OS_WINDOWS_VISTA = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " Vista");
1911 
1912     /**
1913      * The constant {@code true} if this is Windows 7.
1914      * <p>
1915      * The result depends on the value of the {@link #OS_NAME} constant.
1916      * </p>
1917      * <p>
1918      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1919      * </p>
1920      * <p>
1921      * This value is initialized when the class is loaded.
1922      * </p>
1923      *
1924      * @since 3.0
1925      */
1926     public static final boolean IS_OS_WINDOWS_7 = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " 7");
1927 
1928     /**
1929      * The constant {@code true} if this is Windows 8.
1930      * <p>
1931      * The result depends on the value of the {@link #OS_NAME} constant.
1932      * </p>
1933      * <p>
1934      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1935      * </p>
1936      * <p>
1937      * This value is initialized when the class is loaded.
1938      * </p>
1939      *
1940      * @since 3.2
1941      */
1942     public static final boolean IS_OS_WINDOWS_8 = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " 8");
1943 
1944     /**
1945      * The constant {@code true} if this is Windows 10.
1946      * <p>
1947      * The result depends on the value of the {@link #OS_NAME} constant.
1948      * </p>
1949      * <p>
1950      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1951      * </p>
1952      * <p>
1953      * This value is initialized when the class is loaded.
1954      * </p>
1955      *
1956      * @since 3.5
1957      */
1958     public static final boolean IS_OS_WINDOWS_10 = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " 10");
1959 
1960     /**
1961      * The constant {@code true} if this is Windows 11.
1962      * <p>
1963      * The result depends on the value of the {@link #OS_NAME} constant.
1964      * </p>
1965      * <p>
1966      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1967      * </p>
1968      * <p>
1969      * OpenJDK fixed the return value for {@code os.name} on Windows 11 to versions 8, 11, and 17:
1970      * </p>
1971      * <ul>
1972      * <li>Affects Java versions 7u321, 8u311, 11.0.13-oracle, 17.0.1: https://bugs.openjdk.org/browse/JDK-8274737</li>
1973      * <li>Fixed in OpenJDK commit https://github.com/openjdk/jdk/commit/97ea9dd2f24f9f1fb9b9345a4202a825ee28e014</li>
1974      * </ul>
1975      * <p>
1976      * This value is initialized when the class is loaded.
1977      * </p>
1978      *
1979      * @since 3.13.0
1980      */
1981     public static final boolean IS_OS_WINDOWS_11 = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " 11");
1982 
1983     /**
1984      * The constant {@code true} if this is z/OS.
1985      * <p>
1986      * The result depends on the value of the {@link #OS_NAME} constant.
1987      * </p>
1988      * <p>
1989      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1990      * </p>
1991      * <p>
1992      * This value is initialized when the class is loaded.
1993      * </p>
1994      *
1995      * @since 3.5
1996      */
1997     // Values on a z/OS system I tested (Gary Gregory - 2016-03-12)
1998     // os.arch = s390x
1999     // os.encoding = ISO8859_1
2000     // os.name = z/OS
2001     // os.version = 02.02.00
2002     public static final boolean IS_OS_ZOS = getOsNameMatches("z/OS");
2003 
2004     /**
2005      * The System property key for the user home directory.
2006      */
2007     public static final String USER_HOME_KEY = "user.home";
2008 
2009     /**
2010      * The System property key for the user name.
2011      *
2012      * @deprecated Use {@link SystemProperties#USER_NAME}.
2013      */
2014     @Deprecated
2015     public static final String USER_NAME_KEY = "user.name";
2016 
2017     /**
2018      * The System property key for the user directory.
2019      *
2020      * @deprecated Use {@link SystemProperties#USER_DIR}.
2021      */
2022     @Deprecated
2023     public static final String USER_DIR_KEY = "user.dir";
2024 
2025     /**
2026      * The System property key for the Java IO temporary directory.
2027      *
2028      * @deprecated Use {@link SystemProperties#JAVA_IO_TMPDIR}.
2029      */
2030     @Deprecated
2031     public static final String JAVA_IO_TMPDIR_KEY = "java.io.tmpdir";
2032 
2033     /**
2034      * The System property key for the Java home directory.
2035      *
2036      * @deprecated Use {@link SystemProperties#JAVA_HOME}.
2037      */
2038     @Deprecated
2039     public static final String JAVA_HOME_KEY = "java.home";
2040 
2041     /**
2042      * A constant for the System Property {@code awt.toolkit}.
2043      *
2044      * <p>
2045      * Holds a class name, on Windows XP this is {@code sun.awt.windows.WToolkit}.
2046      * </p>
2047      * <p>
2048      * <strong>On platforms without a GUI, this value is {@code null}.</strong>
2049      * </p>
2050      * <p>
2051      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
2052      * </p>
2053      * <p>
2054      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
2055      * called after this class is loaded, the value will be out of sync with that System property.
2056      * </p>
2057      *
2058      * @since 2.1
2059      * @see SystemProperties#getAwtToolkit()
2060      * @deprecated Deprecated without replacement.
2061      */
2062     @Deprecated
2063     public static final String AWT_TOOLKIT = SystemProperties.getAwtToolkit();
2064 
2065     /**
2066      * Gets an environment variable, defaulting to {@code defaultValue} if the variable cannot be read.
2067      *
2068      * <p>
2069      * If a {@link SecurityException} is caught, the return value is {@code defaultValue} and a message is written to {@code System.err}.
2070      * </p>
2071      *
2072      * @param name         the environment variable name.
2073      * @param defaultValue the default value.
2074      * @return the environment variable value or {@code defaultValue} if a security problem occurs.
2075      * @since 3.8
2076      */
2077     public static String getEnvironmentVariable(final String name, final String defaultValue) {
2078         try {
2079             final String value = System.getenv(name);
2080             return value == null ? defaultValue : value;
2081         } catch (final SecurityException ex) {
2082             // we are not allowed to look at this property
2083             // System.err.println("Caught a SecurityException reading the environment variable '" + name + "'.");
2084             return defaultValue;
2085         }
2086     }
2087 
2088     /**
2089      * Gets the host name from an environment variable ({@code COMPUTERNAME} on Windows, {@code HOSTNAME} elsewhere).
2090      *
2091      * <p>
2092      * If you want to know what the network stack says is the host name, you should use {@code InetAddress.getLocalHost().getHostName()}.
2093      * </p>
2094      *
2095      * @return the host name. Will be {@code null} if the environment variable is not defined.
2096      * @since 3.6
2097      */
2098     public static String getHostName() {
2099         return IS_OS_WINDOWS ? System.getenv("COMPUTERNAME") : System.getenv("HOSTNAME");
2100     }
2101 
2102     /**
2103      * Gets the current Java home directory as a {@link File}.
2104      *
2105      * @return a directory.
2106      * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow access to the specified system property.
2107      * @see SystemProperties#getJavaHome()
2108      * @since 2.1
2109      */
2110     public static File getJavaHome() {
2111         return new File(SystemProperties.getJavaHome());
2112     }
2113 
2114     /**
2115      * Gets the current Java home directory as a {@link File}.
2116      *
2117      * @return a directory.
2118      * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow access to the specified system property.
2119      * @see SystemProperties#getJavaHome()
2120      * @since 3.18.0
2121      */
2122     public static Path getJavaHomePath() {
2123         return Paths.get(SystemProperties.getJavaHome());
2124     }
2125 
2126     /**
2127      * Gets the current Java IO temporary directory as a {@link File}.
2128      *
2129      * @return a directory.
2130      * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow access to the specified system property.
2131      * @see SystemProperties#getJavaIoTmpdir()
2132      * @since 2.1
2133      */
2134     public static File getJavaIoTmpDir() {
2135         return new File(SystemProperties.getJavaIoTmpdir());
2136     }
2137 
2138     /**
2139      * Gets the current Java IO temporary directory as a {@link Path}.
2140      *
2141      * @return a directory.
2142      * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow access to the specified system property.
2143      * @see SystemProperties#getJavaIoTmpdir()
2144      * @since 3.18.0
2145      */
2146     public static Path getJavaIoTmpDirPath() {
2147         return Paths.get(SystemProperties.getJavaIoTmpdir());
2148     }
2149 
2150     /**
2151      * Tests if the Java version matches the version we are running.
2152      * <p>
2153      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
2154      * </p>
2155      *
2156      * @param versionPrefix the prefix for the Java version.
2157      * @return true if matches, or false if not or can't determine.
2158      */
2159     private static boolean getJavaVersionMatches(final String versionPrefix) {
2160         return isJavaVersionMatch(JAVA_SPECIFICATION_VERSION, versionPrefix);
2161     }
2162 
2163     /**
2164      * Tests if the operating system matches the given name prefix and version prefix.
2165      * <p>
2166      * The result depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
2167      * </p>
2168      * <p>
2169      * The method returns {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
2170      * </p>
2171      *
2172      * @param osNamePrefix    the prefix for the OS name.
2173      * @param osVersionPrefix the prefix for the version.
2174      * @return true if matches, or false if not or can't determine.
2175      */
2176     private static boolean getOsMatches(final String osNamePrefix, final String osVersionPrefix) {
2177         return isOsMatch(OS_NAME, OS_VERSION, osNamePrefix, osVersionPrefix);
2178     }
2179 
2180     /**
2181      * Tests if the operating system matches the given string with a case-insensitive comparison.
2182      * <p>
2183      * The result depends on the value of the {@link #OS_NAME} constant.
2184      * </p>
2185      * <p>
2186      * The method returns {@code false} if {@link #OS_NAME} is {@code null}.
2187      * </p>
2188      *
2189      * @param osNamePrefix the prefix for the OS name.
2190      * @return true if matches, or false if not or can't determine.
2191      */
2192     private static boolean getOsNameMatches(final String osNamePrefix) {
2193         return isOsNameMatch(OS_NAME, osNamePrefix);
2194     }
2195 
2196     /**
2197      * Gets the current user directory as a {@link File}.
2198      * <p>
2199      * The result is based on the system property {@value SystemProperties#USER_DIR}.
2200      * </p>
2201      *
2202      * @return a directory.
2203      * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow access to the specified system property.
2204      * @see SystemProperties#getUserDir()
2205      * @since 2.1
2206      */
2207     public static File getUserDir() {
2208         return new File(SystemProperties.getUserDir());
2209     }
2210 
2211     /**
2212      * Gets the current user directory as a {@link Path}.
2213      * <p>
2214      * The result is based on the system property {@value SystemProperties#USER_DIR}.
2215      * </p>
2216      *
2217      * @return a directory.
2218      * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow access to the specified system property.
2219      * @see SystemProperties#getUserDir()
2220      * @since 3.18.0
2221      */
2222     public static Path getUserDirPath() {
2223         return Paths.get(SystemProperties.getUserDir());
2224     }
2225 
2226     /**
2227      * Gets the current user home directory as a {@link File}.
2228      * <p>
2229      * The result is based on the system property {@value SystemProperties#USER_HOME}.
2230      * </p>
2231      *
2232      * @return a directory.
2233      * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow access to the specified system property.
2234      * @see SystemProperties#getUserHome()
2235      * @since 2.1
2236      */
2237     public static File getUserHome() {
2238         return new File(SystemProperties.getUserHome());
2239     }
2240 
2241     /**
2242      * Gets the current user home directory as a {@link Path}.
2243      * <p>
2244      * The result is based on the system property {@value SystemProperties#USER_HOME}.
2245      * </p>
2246      *
2247      * @return a directory.
2248      * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow access to the specified system property.
2249      * @see SystemProperties#getUserHome()
2250      * @since 3.18.0
2251      */
2252     public static Path getUserHomePath() {
2253         return Paths.get(SystemProperties.getUserHome());
2254     }
2255 
2256     /**
2257      * Gets the current user name.
2258      * <p>
2259      * The result is based on the system property {@value SystemProperties#USER_NAME}.
2260      * </p>
2261      *
2262      * @return a name.
2263      * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow access to the specified system property.
2264      * @see SystemProperties#getUserName()
2265      * @since 3.10
2266      * @deprecated Use {@link SystemProperties#getUserName()}.
2267      */
2268     @Deprecated
2269     public static String getUserName() {
2270         return SystemProperties.getUserName();
2271     }
2272 
2273     /**
2274      * Gets the user name.
2275      * <p>
2276      * The result is based on the system property {@value SystemProperties#USER_NAME}.
2277      * </p>
2278      *
2279      * @param defaultValue A default value.
2280      * @return a name.
2281      * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow access to the specified system property.
2282      * @see SystemProperties#getUserName()
2283      * @since 3.10
2284      * @deprecated Use {@link SystemProperties#getUserName(String)}.
2285      */
2286     @Deprecated
2287     public static String getUserName(final String defaultValue) {
2288         return SystemProperties.getUserName(defaultValue);
2289     }
2290 
2291     /**
2292      * Tests whether the {@link #JAVA_AWT_HEADLESS} value is {@code true}.
2293      * <p>
2294      * The result is based on the system property {@value SystemProperties#JAVA_AWT_HEADLESS}.
2295      * </p>
2296      *
2297      * @return {@code true} if {@code JAVA_AWT_HEADLESS} is {@code "true"}, {@code false} otherwise.
2298      * @see #JAVA_AWT_HEADLESS
2299      * @since 2.1
2300      * @since Java 1.4
2301      * @deprecated Deprecated without replacement.
2302      */
2303     @Deprecated
2304     public static boolean isJavaAwtHeadless() {
2305         return Boolean.TRUE.toString().equals(JAVA_AWT_HEADLESS);
2306     }
2307 
2308     /**
2309      * Tests whether the Java version at least the requested version.
2310      * <p>
2311      * The result is based on the system property saved in {@link #JAVA_SPECIFICATION_VERSION}.
2312      * </p>
2313      *
2314      * @param requiredVersion the required version, for example 1.31f.
2315      * @return {@code true} if the actual version is equal or greater than the required version.
2316      */
2317     public static boolean isJavaVersionAtLeast(final JavaVersion requiredVersion) {
2318         return JAVA_SPECIFICATION_VERSION_AS_ENUM != null && JAVA_SPECIFICATION_VERSION_AS_ENUM.atLeast(requiredVersion);
2319     }
2320 
2321     /**
2322      * Tests whether the Java version at most the requested version.
2323      * <p>
2324      * The result is based on the system property saved in {@link #JAVA_SPECIFICATION_VERSION}.
2325      * </p>
2326      *
2327      * @param requiredVersion the required version, for example 1.31f.
2328      * @return {@code true} if the actual version is equal or less than the required version.
2329      * @since 3.9
2330      */
2331     public static boolean isJavaVersionAtMost(final JavaVersion requiredVersion) {
2332         return JAVA_SPECIFICATION_VERSION_AS_ENUM != null && JAVA_SPECIFICATION_VERSION_AS_ENUM.atMost(requiredVersion);
2333     }
2334 
2335     /**
2336      * Tests whether the Java version matches.
2337      *
2338      * <p>
2339      * This method is package private instead of private to support unit test invocation.
2340      * </p>
2341      *
2342      * @param version       the actual Java version.
2343      * @param versionPrefix the prefix for the expected Java version.
2344      * @return true if matches, or false if not or can't determine.
2345      */
2346     static boolean isJavaVersionMatch(final String version, final String versionPrefix) {
2347         if (version == null) {
2348             return false;
2349         }
2350         return version.startsWith(versionPrefix);
2351     }
2352 
2353     /**
2354      * Tests whether the operating system matches.
2355      * <p>
2356      * This method is package private instead of private to support unit test invocation.
2357      * </p>
2358      *
2359      * @param osName          the actual OS name.
2360      * @param osVersion       the actual OS version.
2361      * @param osNamePrefix    the prefix for the expected OS name.
2362      * @param osVersionPrefix the prefix for the expected OS version.
2363      * @return true if matches, or false if not or can't determine.
2364      */
2365     static boolean isOsMatch(final String osName, final String osVersion, final String osNamePrefix, final String osVersionPrefix) {
2366         if (osName == null || osVersion == null) {
2367             return false;
2368         }
2369         return isOsNameMatch(osName, osNamePrefix) && isOsVersionMatch(osVersion, osVersionPrefix);
2370     }
2371 
2372     /**
2373      * Tests whether the operating system matches with a case-insensitive comparison.
2374      * <p>
2375      * This method is package private instead of private to support unit test invocation.
2376      * </p>
2377      *
2378      * @param osName       the actual OS name.
2379      * @param osNamePrefix the prefix for the expected OS name.
2380      * @return true for a case-insensitive match, or false if not.
2381      */
2382     static boolean isOsNameMatch(final String osName, final String osNamePrefix) {
2383         if (osName == null) {
2384             return false;
2385         }
2386         return Strings.CI.startsWith(osName, osNamePrefix);
2387     }
2388 
2389     /**
2390      * Tests whether the operating system version matches.
2391      * <p>
2392      * This method is package private instead of private to support unit test invocation.
2393      * </p>
2394      *
2395      * @param osVersion       the actual OS version.
2396      * @param osVersionPrefix the prefix for the expected OS version.
2397      * @return true if matches, or false if not or can't determine.
2398      */
2399     static boolean isOsVersionMatch(final String osVersion, final String osVersionPrefix) {
2400         if (StringUtils.isEmpty(osVersion)) {
2401             return false;
2402         }
2403         // Compare parts of the version string instead of using String.startsWith(String) because otherwise
2404         // osVersionPrefix 10.1 would also match osVersion 10.10
2405         final String[] versionPrefixParts = JavaVersion.split(osVersionPrefix);
2406         final String[] versionParts = JavaVersion.split(osVersion);
2407         for (int i = 0; i < Math.min(versionPrefixParts.length, versionParts.length); i++) {
2408             if (!versionPrefixParts[i].equals(versionParts[i])) {
2409                 return false;
2410             }
2411         }
2412         return true;
2413     }
2414 
2415     /**
2416      * SystemUtils instances shouldn't be constructed in standard programming. Instead, elements should be accessed directly, for example
2417      * {@code SystemUtils.FILE_SEPARATOR}.
2418      *
2419      * <p>
2420      * This constructor is public to permit tools that require a JavaBean instance to operate.
2421      * </p>
2422      */
2423     public SystemUtils() {
2424     }
2425 
2426 }