---
# System prepended metadata

title: individuelle Umgebungsvariablen/Properties innerhalb eines Projektes
tags: [Programmierhinweise]

---

###### tags: `Programmierhinweise`

# individuelle Umgebungsvariablen/Properties innerhalb eines Projektes

Problemstellung:
Manche Projekte benötigen individuelle Konfigurationen, damit sie bei jedem funktionieren.

in unserem Beispiel nehmen wir mal folgende Zeile:
System.setProperty("webdriver.chrome.driver","D:\\Studium\\CertifiedTester\\chromedriver.exe")

Wenn nun mehrere Personen über mehreren Systemen unterschiedliche Pfade haben, muss dort eine Lösung gefunden werden, die bei jeden individuell funktioniert.

Man unterscheidet dabei, ob man mit Properties oder Umgebungsvariablen das Problem löst:
Properties können zur Runtime verändert werden und sind nur für den Java-Prozess vorhanden/zugänglich, während Umgebungsvariablen  zur Laufzeit unveränderlich sind

Dabei gibt es mehrere Ansätze, um dieses Problem zu lösen.


## 1. Variante über driver.properties
Für git wird eine driver.properties.sample erstellt.
Diese muss dann für jeden individuell modifiziert werden und anschließend ohne ".sample"Endung kopiert werden. 
Anschließend setzt man diese neu kopierte Datei in die git-ignore, damit diese nicht in git mit hoch gepusht wird
in dieser steht der Pfad drin, Bsp:
driver.path=D:\\Studium\\CertifiedTester\\chromedriver.exe

Im Programm müssen dann diese Parameter aus der Datei gelesen werden.
in diesem fall sieht die o.g. Zeile dann so aus, wenn die Datei im root des Projektes ist:

try (InputStream propertyFile = new FileInputStream(driver.properties)) {
            properties.load(propertyFile);
System.setProperty("webdriver.chrome.driver", properties.getProperty(driver.path));

Vorteil:
- alles in einer Datei ausgelagert und nicht jede Projektdatei, an der mit dem Pfad gearbeitet wird, muss nicht nach jedem merge von jedem wieder angepasst werden
- gängige Art
Nachteil:
- muss von jedem individuell modifiziert werden, Projektfremde wissen evtl nicht bescheid
- Modifizerung von außerhalb möglich
- muss geschaut werden, das das NICHT mit versioniert wird (Git-Ignore)
- Jeder kann an der Programmdatei rumfuschen, damit es bei ihm funktioniert
- Auslieferung

## 2. Variante setzen von Systemvariablen
man setzt eine Umgebungsvariable, hier z.B. Variable driver.chrome.webdriverrr als den Pfad 
D:\Studium\CertifiedTester\chromedriver.exe

nun muss im Projekt diese Variable eingelesen werden. Dadruch würde man "nur noch" folgende Zeile haben
System.setProperty("webdriver.chrome.driver", System.getenv("driver.chrome.webdriverrr"));

Vorteil:
- weniger Code
- keine weitere Datei
- Aktuelle Regeln von Microservices werden dabei berücksichtigt -> https://12factor.net/config
- Code as Infrastruktur
Nachteil:
- Erklärungsaufwand, für jedes System muss diese Variable individuell gesetzt werden
- nach Abschluss des Projektes, muss manuell diese Umgebungsvariable entfernt werden, oder man lebt damit, das man irgendwann sehr viele Umgebungsvariablen gesetzt hat

## 3. Variante
Setzen von VM-Paramtern

Man kann unter z.B. Intellji unter Run -> Run.. -> VM options
-> "-Ddriver.chrome.webdriver=D:\\Studium\\CertifiedTester\\chromedriver.exe"

und console sähe es wie folgt aus:
java -jar jarName -DpropertyName=value

Man muss nun innerhalb des Projektes keine Parameter mehr setzen und kann dann damit arbeiten

Vorteil:
- kein setzen der Property mehr notwendig
Nachteil:
- jeder muss wieder individuell seine Startparameter setzen, damit das Programm ohne Probleme funktioniert