# Maven - wo gehört eine .properties-Datei hin?



## dermoritz (26. Mrz 2010)

der Titel des Themas sagt eigentlich fast alles: wie gehe ich mit .properties-Dateien um: wo gehören sie rein und was schreibe ich dazu in die pom-Datei?


----------



## kama (26. Mrz 2010)

Hallo,

der übliche Platz ist unter src/main/resources bzw. für den test src/test/resources...

Es hängt aber auch davon ab, welchen packaging type Du verwendest...

Gruß
Karl Heinz Marbaise


----------



## dermoritz (26. Mrz 2010)

vielen Dank für die Antwort,

meintest du eventuell "src/main/res...", denn die Datei ist für das Programm gedacht?

Was das Packaging betrifft kann ich nur auf meinen anderen Thread verweisen (Danke auch dort für die Antwort). Mich würde in erster Linie interessieren, wie man Maven mitteilt, das diese Datei ein Teil des Builds ist. So das sie nach dem kompilieren so liegt, das sie das Programm auch findet. Wie man in dem anderen Thread sieht benutze ich zum erstellen und ausliefern im Moment kein Maven und was die properties-Datei betrifft, die leigt irgendwo unter src/main und wird nach dem erstellen einfach zur jar/exe-Datei dazu kopiert.

könnte man mit maven diese Datei auch mit in das jar-File verpacken?


----------



## kama (26. Mrz 2010)

Hallo,



dermoritz hat gesagt.:


> meintest du eventuell "src/main/res...", denn die Datei ist für das Programm gedacht?


Dann genau da "src/main/resources"...



dermoritz hat gesagt.:


> Was das Packaging betrifft kann ich nur auf meinen anderen Thread verweisen (Danke auch dort für die Antwort).


Was steht in deiner POM "packaging" ?



dermoritz hat gesagt.:


> Mich würde in erster Linie interessieren, wie man Maven mitteilt, das diese Datei ein Teil des Builds ist. So das sie nach dem kompilieren so liegt, das sie das Programm auch findet. Wie man in dem anderen Thread sieht benutze ich zum erstellen und ausliefern im Moment kein Maven und was die properties-Datei betrifft, die leigt irgendwo unter src/main und wird nach dem erstellen einfach zur jar/exe-Datei dazu kopiert.
> könnte man mit maven diese Datei auch mit in das jar-File verpacken?


Das ist der Sinn die Datei(en) in src/main/resources zu legen. Dann wird die automatisch mit in die JAR Datei packetiert..(Convention over Configuration)...ok...das erscheint manchmal ein Wenig wie "Magie" ;-)..

Gruß
Karl Heinz Marbaise


----------



## dermoritz (26. Mrz 2010)

und nochmal danke,

und was müsste ich machen, wenn die property-Datei separat bleiben soll (ich bin mir noch nicht sicher ober der User sie anpassen können soll)?


----------



## kama (26. Mrz 2010)

Hi,

die Frage ist: Was ist das für eine Anwendung ? Kommandozeile? Web-App ? (Tomcat ?)

Welche Anpassungen soll der Benutzer denn machen können ? 

MfG
Karl Heinz Marbaise


----------



## dermoritz (26. Mrz 2010)

ich das ganze mal probiert (siehe anderer thread) und offensichtlich wird die properties datei nicht gefunden?! ich habe die datei unter src\main\resources\Paketname. es kommt an der entsprechenden Stelle eben eine File not found exception. Wenn ich die Datei aber zur -jar Datei dazu kopiere funktioniert es.
Ist die "Konvention" eventuell die resourcen nicht mitzuverpacken? so dass man es mitteilen muss, das man sie verpacken möchte?


----------



## kama (26. Mrz 2010)

Hi,

wie greifst Du denn auf die Properties Datei aus Java zu ? 

Gruß
Karl Heinz Marbaise


----------



## dermoritz (29. Mrz 2010)

also auf die Property-Datei greife ich mit:
prop = new PropertyResourceBundle(new FileInputStream("meine.properties")); zu.

edit: ok es funktioniert: es lag daran, dass ich das assembly plugin auskommentiert hatte. nun hab ich jar und assembly plugin drinne und alles funzt wie ess soll.


----------



## dermoritz (29. Mrz 2010)

esfunktioniert doch nicht. ich habe bemerkt, dass das Programm nicht die Property-Datei aus der JAr-Datei benutzt sondern die Datei die noch im Pfad der pom-Datei lag(- der aktuelle Pfad in der Konsole). Als ich die gelöscht hab gabs wieder "FileNotFoundException". Wie gesagt, in der jar-Datei ist die Property-Datei, sie wird nur nicht benutzt.

Wie sage ich Maven wo er nach Resourcen schauen soll bzw. das Maven dem Programm sagen soll, wo es nach Resourcen suchen soll? - mit dem "resource Plugin"?


----------



## mvitz (29. Mrz 2010)

Versuche es mal so:


```
prop = new PropertyResourceBundle(this.getClass().getClassloader().getResourceAsStream("meine.properties"));
```


----------



## kama (29. Mrz 2010)

Hi,


```
xyz = this.class.getResourceAsStream("/xyz.properties");
```
Sollte das Problem lösen...Da Du ja die Properties Datei aus der JAR Datei verwenden möchtest...und nicht die aus dem Dateisystem (FileInputStream("..."));...
Wie auch schon mvitz geschrieben hat...

Gruß
Karl Heinz Marbaise


----------



## dermoritz (29. Mrz 2010)

vielen Dank!

das bedeutet aber im Umkehrschluss, dass man im Code festlegen muss ob die Properties in der jar sind oder extern - was gar kein Problem ist. Ich hatte aber kurz die Hoffnung das man das per Maven "umschalten" kann.


----------



## mvitz (29. Mrz 2010)

Nein muss man nicht. Sollte die Property-Datei nicht mit in das JAR gehören, muss sie einfach in den Classpath mit aufgenommen werden.

Edit: Also nicht die Datei, sondern der Ordner in dem die Datei sich befindet.


----------



## dermoritz (30. Mrz 2010)

das heißt dann mit "this.getClass().getClassloader().getResourceAsStream("meine.properties")" komm ich dann immer ran, oder?


----------



## mvitz (30. Mrz 2010)

Solange die Datei über den Classpath auffindbar ist, ja  Also dazu kann sie entweder im .jar sein oder irgendwo auf der Platte (dann muss aber der ordner in dem sie sich befindet im Classpath sein).


----------



## dermoritz (6. Apr 2010)

ist der "aktuelle pfad" oder der pfad der jar-Datei automatisch im Classpath? Falls es 2 Dateien gibt(in der jar und im restlichen classpath) welche wird genommen?


----------



## mvitz (6. Apr 2010)

Wenn du eine Runnable JAR hast, dann ist das JAR-File selber und alle Einträge aus dem MANIFEST.MF im Pfad. Wenn du das JAR anders startest, gibst du ja den Pfad selber an und kannst so kontrollieren, welche genommen wird.

Sollte die Datei zweimal im Pfad sein, weiß ich nicht, was passiert. Müsste man mal ausprobieren.


----------



## dermoritz (6. Apr 2010)

die frage ist ob ich irgendwas "zusätzliches" tun muss, falls ich die properties datei nicht in die jar-Packe (dafür müsste ich das assembly plugin deaktivieren, oder?) sondern sie einfach neben die jar-Datei lege.
in beiden Fälllen soll das ganze durch doppelklick auf die jar gestartet werden. und die nächste frage wäre ebend ob man eine properties-Datei quasi als default-Einstellung in die jar packen kann und der user diese Einstellungen mit einer eigenen properties-Datei einfach überschreiben kann. - also geht das alles ohne zusätzlichen code/ ohne eingreifen in die pom-datei?


----------



## kama (6. Apr 2010)

Hallo,


dermoritz hat gesagt.:


> die frage ist ob ich irgendwas "zusätzliches" tun muss, falls ich die properties datei nicht in die jar-Packe (dafür müsste ich das assembly plugin deaktivieren, oder?)sondern sie einfach neben die jar-Datei lege.


Das assembly Plugin hat nichts damit zu tuen...wenn Du die properties in src/main/resources legst wird die automatisch mit in das JAR gepackt...
Wenn Du die properties Datei daneben legen willst musst Du anders packen...



dermoritz hat gesagt.:


> in beiden Fälllen soll das ganze durch doppelklick auf die jar gestartet werden. und die nächste frage wäre ebend ob man eine properties-Datei quasi als default-Einstellung in die jar packen kann


 ja das ginge...




dermoritz hat gesagt.:


> und der user diese Einstellungen mit einer eigenen properties-Datei einfach überschreiben kann. - also geht das alles ohne zusätzlichen code/ ohne eingreifen in die pom-datei?


Der User müsste nur den entsprechenden Aufruf der JVM mit eine classpath parameter versehen und in den angegebenen Path eben eine properties file ablegen...

Ich würde dann eher dazu tendieren einen ZIP/tar.gz erzeugen in dem alles drin liegt wie folgt:

```
xyz-1.0
    +-- etc
           +--- property files
    +-- lib 
           +--- jars'
    +-- bin
           +--- batch file for starting
```

Da hat mir der appassembler sehr gute Dienste erwiesen...

Dann kann der User einfach im etc-Verzeichnis die Datei ändern...
Gruß
Karl Heinz Marbaise


----------



## dermoritz (7. Apr 2010)

danke kama, aber wie es so ist erzeugen gute antworten noch mehr Fragen :

in dem anderen Thread wo es um die Ausführbare jar-Datei ging, hast du mir appasssembler oder assembly plugin empfohlen um ausführbare jar-Dateien zu erzeugen. Im Laufe des Threads hab ich dann bemerkt, dass es ohne jar-Plugin nicht funktioniert (dort habe ich auch die "Main"-Klasse angegeben).
Nun Frage ich mich welches Plugin wofür zuständig ist. Irgendeins muss ja alles zusammenpacken inkl. der Properties-Datei (das Resource -Plugin -speziell für "Resources"??, und Assembly für den Rest??). Eine ausführbare jar-Datei zu machen (jar-Plugin??)
Also welches Plugin wofür zuständig ist, ist mir noch nicht so richtig klar.


Was mein eigentliches Problem betrifft: das Feature mit den Defaulteinstellungen ist mir nicht so wichtig. Mir wäre nur wichtig wie leicht ich zwischen Properties in der jar und außerhalb(im Pfad der jar-Datei) wechseln kann. Also ob 

```
this.getClass().getClassLoader().getResourceAsStream("meine.properties")
```
 auch den Pfad der jar-Datei (per Doppelklick gestartet) beinhaltet. Dann könnte man ggf. eine Properties-Datei schreiben und die andere aus der jar-Datei löschen.


----------

