[java] jar file met externe properties file ?

Pagina: 1
Acties:

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Ik heb nu mijn properties file in mijn jar zitten, maar aangezien de jar op verschillende systemen gaat draaien, en ik zonder de jar opnieuw te packagen instellingen wil kunnen wijzigen, wil ik de properties file graag eruit halen.

Hoe kan ik het properties bestand (relatief) terugvinden vanuit een class in mijn jar ?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Als hij in de root staat kan je gewoon duf de filename opgeven. Als het een in een submap zit kan je de mapnaam ervoor zetten of als het een map lager zit kan je zelfs nog met .. werken.

Wat je ook kan doen, is de properties file in de "user.home" zetten. Je bent dan gelijk van alle problemen af en het is een gebruikelijke plek voor configuratie files (onder Linux zijn files in mappen waar applicaties instaan vaak niet editable).

Ik gebruik zelf een leuk en makkelijk systeem: ResourceManager. De locatie van resources wordt gespecificeerd in een XML file. Alle resources kan je daarna laden via de ResourceManager. Het voordeel hiervan is, dat je makkelijk in een networkomgeving van een globale configuratie gebruik kan maken en dat je ook eenvoudig meerdere configuraties kunt toepassen.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • B-Man
  • Registratie: Februari 2000
  • Niet online
Ik weet dat ik met getResource() een bestand kan terugvinden in mijn JAR file, relatief vanaf de root van mijn JAR. Maar ik wil dus dat de file buiten de JAR staat. Een file openen die "naast" de JAR staat is me nog niet gelukt.

Ik wil dat de de file er naast staat (in dezelfde dir als de JAR), zodat ik nergens hoef te specificeren waar de properties staan.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Je kan volgens mij zowel via een FileInputStream als via Class.getResource werken.

Je kan het gewoon met new FileInputStream(new File("filename")). een InputStream naar een file openen. Als de file op dezelfde plek staat als waar het programma wordt uitgevoerd hoef je alleen maar de bestandsnaam op te geven.

Als je Class.getResource(..) gebruikt wordt er gezocht op de classpath. Je files mogen dan ook buiten de huidige jar staan (of zelfs in een andere jar). Als je getResource("bla.dat") doet wordt het huidige package voor de filenaam gezet. Als je getResource("/bla.dat") wordt er in de root gekeken. Waarschijnlijk is dat dus de oplossing.

Op zich wel grappig, meestal hebben mensen meer moeite met het openen van een file in een jar dan erbuiten ;) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Wat voor prog is het? Applet of applicatie?

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Het gaat om een applicatie.

Als ik "/" voor de filenaam zet, in welke root wordt er dan gekeken ? in de root van de JAR file ?

Ik had voorheen het bestand er al naast staan, en kwam er toen achter dat ik met
code:
1
InputStream in = new FileInputStream("/pad/naar/properties");

alleen de file kan benaderen als ik een absoluut pad opgeef (alleen de naam van de properties file leverde een FileNotFoundException op, terwijl er een "." in mijn classpath staat...).

Kan een FileInputStream alleen geinitialiseerd worden met een absoluut pad ? Ik las net dat een File object ook met een relatief pad kan worden geinitialiseerd, zal het zometeen eens proberen.

  • Stephan Oudmaijer
  • Registratie: Oktober 2000
  • Laatst online: 16-08-2023
Op woensdag 24 oktober 2001 20:12 schreef B-Man het volgende:
Ik weet dat ik met getResource() een bestand kan terugvinden in mijn JAR file, relatief vanaf de root van mijn JAR. Maar ik wil dus dat de file buiten de JAR staat. Een file openen die "naast" de JAR staat is me nog niet gelukt.

Ik wil dat de de file er naast staat (in dezelfde dir als de JAR), zodat ik nergens hoef te specificeren waar de properties staan.
mbravenboer zit bijna goed

URL l = this.getClass().getResource("<jouw file naam invullen hier");
l.getFile(); is dan de filename.

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Oh, en wat betreft het feit dat veel mensen moeite hebben met het vinden/laden van bestanden binnen een JAR-file: dit is een kwestie van slecht lezen denk ik. Als je snel even door de function list van java.lang.Class heenfietst, zie je al snel "getResourceAsStream(String name)".

  • B-Man
  • Registratie: Februari 2000
  • Niet online
CK: dat is de methode die ik nu gebruik, en daarmee is het me nog niet gelukt om een file te openen die naast de JAR staat. (Ik heb nog niet geprobeerd om "../../.." te doen totdat ik een niveau boven de JAR root zit...zometeen eerst maar eens proberen).

  • Stephan Oudmaijer
  • Registratie: Oktober 2000
  • Laatst online: 16-08-2023
java.sun.com en ff in search invullen werkt altijd :P

  • Stephan Oudmaijer
  • Registratie: Oktober 2000
  • Laatst online: 16-08-2023
Op donderdag 25 oktober 2001 09:59 schreef B-Man het volgende:
CK: dat is de methode die ik nu gebruik, en daarmee is het me nog niet gelukt om een file te openen die naast de JAR staat. (Ik heb nog niet geprobeerd om "../../.." te doen totdat ik een niveau boven de JAR root zit...zometeen eerst maar eens proberen).
probeer is this.getClassLoader().getResource()

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
B-Man: Als ik "/" voor de filenaam zet, in welke root wordt er dan gekeken ? in de root van de JAR file ?
Als je een / gebruikt wordt er in de root van de classpath gezocht. Dat kan dus op heel veel plaatsen op het systeem zijn en meestal ook . (punt) De huidige directory dus. Je hoeft bij Class.getResource niet percee resources uit de huidige jar file te halen.
Ik had voorheen het bestand er al naast staan, en kwam er toen achter dat ik met
code:
1
InputStream in = new FileInputStream("/pad/naar/properties");

alleen de file kan benaderen als ik een absoluut pad opgeef (alleen de naam van de properties file leverde een FileNotFoundException op, terwijl er een "." in mijn classpath staat...).
Bij het openen van een file wordt de classpath niet gebruikt. Als je er geen / voor zet, wordt er gewerkt vanaf de huidige directory.
Kan een FileInputStream alleen geinitialiseerd worden met een absoluut pad ? Ik las net dat een File object ook met een relatief pad kan worden geinitialiseerd, zal het zometeen eens proberen.
Klopt, het moet gewoon relatief kunnen. Sterk nog, ik gebruik ze altijd relatief. Ik snap eigenlijk ook niet waarom het helemaal niet lukt ;) .

Misschien is het nog wel de makkelijkste en mooiste oplossing om even van de user.home gebruik te maken. Deze system property wijst naar de home directory van de gebruiker. Uiteraard moet die file daar dan wel staan ;) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • B-Man
  • Registratie: Februari 2000
  • Niet online
Op woensdag 24 oktober 2001 20:35 schreef mbravenboer het volgende:
Je kan volgens mij zowel via een FileInputStream als via Class.getResource werken.

Je kan het gewoon met new FileInputStream(new File("filename")). een InputStream naar een file openen. Als de file op dezelfde plek staat als waar het programma wordt uitgevoerd hoef je alleen maar de bestandsnaam op te geven.

Als je Class.getResource(..) gebruikt wordt er gezocht op de classpath. Je files mogen dan ook buiten de huidige jar staan (of zelfs in een andere jar). Als je getResource("bla.dat") doet wordt het huidige package voor de filenaam gezet. Als je getResource("/bla.dat") wordt er in de root gekeken. Waarschijnlijk is dat dus de oplossing.

Op zich wel grappig, meestal hebben mensen meer moeite met het openen van een file in een jar dan erbuiten ;) .
getResource("/file");
werkt wel onder win2k, maar niet onder linux..
Althans: ik heb het nog niet aan de gang gekregen.
Pagina: 1