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.
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]
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
Siehe Internationalization Enhancements in JDK 9 … 2023-01-07
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.
https://docs.oracle.com/en/java/javase/17/intl/supported-encodings.html#GUID-D29CF3AD-FC0B-465F-8897-C38C0395AB02 [Supported Encodings] … 2023-01-07
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