###### 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