Java Properties

in Arbeit ...

1. Überblick

https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html [System Properties (The Java™ Tutorials > Essential Java Classes > The Platform Environment)] …​ 24.11.2022, 10:29:33

2. System Properties

Viele Systemeigenschaften können in Windows, Linux, OS-X etc. über Environment-Variable (Umgebungsvariable) ausgelesen werden.

Java hat (vermutlich zur Vereinheitlichung über Betriebssystemgrenzen) einen eigenen Ansatz: die System Properties. Allerdings sind in neueren Java-Versionen auch die Environment-Variablen leicht abfragbar – siehe unten.

2.1. Wichtige System-Properties

Bestimmte System Properties könnten für einzelne Betriebssysteme nicht definiert sein. In der Praxis existieren die hier angeführten jedoch für alle gängigen Implementationen.

Table 1. Tabelle der wichtigsten System Properties
Property Key Beschreibung Anmerkungen

"file.separator"

Character that separates components of a file path. This is "/" on UNIX and "\" on Windows.

 — 

"java.class.path"

Path used to find directories and JAR archives containing class files. Elements of the class path are separated by a platform-specific character specified in the path.separator property.

"java.home"

Installation directory for Java Runtime Environment (JRE)

"java.vendor"

JRE vendor name

"java.vendor.url"

JRE vendor URL

"java.version"

JRE version number

"line.separator"

Sequence used by operating system to separate lines in text files

"os.arch"

Operating system architecture

"os.name"

Operating system name

"os.version"

Operating system version

"path.separator"

Path separator character used in java.class.path

"user.dir"

User working directory

"user.home"

User home directory

"user.name"

User account name

2.2. Definieren eigene SysProps bei App-Aufruf

Man kann eigene System Properties bei Programmstart definieren. Dazu definiert man ein VM-Argument beginnend mit -D, direkt gefolgt vom Property Key/Namen: "-Dder.prop.name=der Prop Wert" (Gänsefüßchen nötig, wenn Leerzeichen in Wert vorhanden)

Eine Kommandozeile könnte sein:
java "-Dmy.prop.name=Der Prop Wert" -cp my-app-archive.jar my.app.pkg.ClassWithMain

2.3. Auslesen einzelne SysProp

Der Key und Wert einer System Property sind Strings. Auslesen des Wertes (wenn nicht definiert, wird null zurückgeliefert):
String userHome = System.getProperty("user.home");

Alternativ kann ein Default-Wert als 2. Parameter übergeben werden, der dann bei nicht definiertem Key anstatt null zurückgeliefert wird:

String userDir = System.getProperty("user.dir", userHome); // userHome von oben

2.4. Auflisten aller definierten SysProps

Hier eine Methode, die alle SysProps geordnet und formatiert darstellt. Dazu werden die SysProps in eine SortedMap aufgenommen.

    public static void listSysProps() {
        Properties sysProps = System.getProperties();
        SortedMap<String, String> sortedMap = new TreeMap(new TreeMap<>());
        int maxKeyLen = 0;
        for (Object keyObj : sysProps.keySet()) {
            Object valObj = sysProps.get(keyObj);
            String key = (String) keyObj;
            if (key.length() > maxKeyLen) {
                maxKeyLen = key.length();
            }
            sortedMap.put((String) keyObj, (String) valObj);
        }
        for (String key : sortedMap.keySet()) {
            System.out.format("%" + maxKeyLen + "s -> [%s]%n", key, sortedMap.get(key));
        }
    }

Ausgegeben wird (abhängig von Rechner, Betriebssystem, etc.):

                file.encoding -> [UTF-8]
               file.separator -> [/]
              java.class.path -> [/home/mxrenkin/.0_WORK/0_git-repos/rx-htlw5/sj2223/k2chif-01/Trial2/target/Trial2-1.0-SNAPSHOT.jar]
           java.class.version -> [61.0]
                    java.home -> [/home/mxrenkin/.0_SHARE/java/JDK/jdk-17.0.5+8-tem-lin]
               java.io.tmpdir -> [/tmp]
            java.library.path -> [/usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib]
            java.runtime.name -> [OpenJDK Runtime Environment]
         java.runtime.version -> [17.0.5+8]
      java.specification.name -> [Java Platform API Specification]
    java.specification.vendor -> [Oracle Corporation]
   java.specification.version -> [17]
java.util.logging.config.file -> [./logging.properties]
                  java.vendor -> [Eclipse Adoptium]
              java.vendor.url -> [https://adoptium.net/]
          java.vendor.url.bug -> [https://github.com/adoptium/adoptium-support/issues]
          java.vendor.version -> [Temurin-17.0.5+8]
                 java.version -> [17.0.5]
            java.version.date -> [2022-10-18]
   java.vm.compressedOopsMode -> [Zero based]
                 java.vm.info -> [mixed mode, sharing]
                 java.vm.name -> [OpenJDK 64-Bit Server VM]
   java.vm.specification.name -> [Java Virtual Machine Specification]
 java.vm.specification.vendor -> [Oracle Corporation]
java.vm.specification.version -> [17]
               java.vm.vendor -> [Eclipse Adoptium]
              java.vm.version -> [17.0.5+8]
                    jdk.debug -> [release]
               line.separator -> [
]
              native.encoding -> [UTF-8]
                      os.arch -> [amd64]
                      os.name -> [Linux]
                   os.version -> [5.15.0-57-generic]
               path.separator -> [:]
          sun.arch.data.model -> [64]
        sun.boot.library.path -> [/home/mxrenkin/.0_SHARE/java/JDK/jdk-17.0.5+8-tem-lin/lib]
               sun.cpu.endian -> [little]
      sun.io.unicode.encoding -> [UnicodeLittle]
             sun.java.command -> [/home/mxrenkin/.0_WORK/0_git-repos/rx-htlw5/sj2223/k2chif-01/Trial2/target/Trial2-1.0-SNAPSHOT.jar athtlw5.rx2223_2chif.trial2.SysPropsDemo1]
            sun.java.launcher -> [SUN_STANDARD]
             sun.jnu.encoding -> [UTF-8]
      sun.management.compiler -> [HotSpot 64-Bit Tiered Compilers]
                 user.country -> [AT]
                     user.dir -> [/home/mxrenkin/.0_WORK/0_git-repos/rx-htlw5/sj2223/k2chif-01/Trial2]
                    user.home -> [/home/mxrenkin]
                user.language -> [de]
                    user.name -> [mxrenkin]

3. Nutzung eigener Properties

3.1. Definieren

3.2. Nutzen

3.3. Speichern

3.4. Einlesen

4. Environment-Variable

TODO  System.getEnv(..)

Die nachfolgende Klasse EnvMap listet (in der main-Methode) alle Environment-Variablen auf, die zum Zeitpunkt des Aufrufes auf diesem Rechner für den aktuellen Benutzer definiert sind:

 import java.util.Map;

public class EnvMap {
    public static void main (String[] args) {
        Map<String, String> env = System.getenv();
        for (String envName : env.keySet()) {
            System.out.format("%s=%s%n",
                              envName,
                              env.get(envName));
        }
    }
}

5. Character encoding

Application

Das Standard-Character-Encoding ist UTF-8 ab Java-9

Der Wert ist u.a. per System-Property file.encoding feststellbar (und auch über Kommandozeilen-Parameter (z.B. -Dfile.encoding=UTF-8 änderbar)

Properties

Auszug daraus:
…​ In Java SE 9, properties files are loaded in UTF-8 encoding. In previous releases, ISO-8859-1 encoding was used for loading property resource bundles. UTF-8 is a much more convenient way to represent non-Latin characters.

Most existing properties files should not be affected: UTF-8 and ISO-8859-1 have the same encoding for ASCII characters, and human-readable non-ASCII ISO-8859-1 encoding is not valid UTF-8. If an invalid UTF-8 byte sequence is detected, the Java runtime automatically rereads the file in ISO-8859-1.

import java.nio.charset.Charset;

public class DemoDefaultCharset {

    public static void main(String[] args) {
        // Get the default charset of the running JVM:
        Charset cs = Charset.defaultCharset();

        System.outformat("Current VM is using '%s' as default charset",
                cs.displayName());
    }
}

5.1. Maven

MAVEN_OPTS=-Dfile.encoding=UTF-8

https://www.baeldung.com/java-char-encoding [Guide to Character Encoding | Baeldung] …​ 2023-01-07