2011-03-11 6 views
1

Existe-t-il un moyen de lire le contenu d'un fichier (maven.properties) dans un fichier jar/war avec Java? J'ai besoin de lire le fichier à partir du disque, quand il n'est pas utilisé (en mémoire). Des conseils sur la façon de faire cela?Lire le fichier maven.properties dans le fichier jar/war

Cordialement, Johan-Kees

Répondre

4

Une chose d'abord: techniquement, ce n'est pas un fichier. Le JAR/WAR est un fichier, ce que vous cherchez est une entrée dans une archive (une ressource AKA).

Et parce que ce n'est pas un fichier, vous devez l'obtenir comme InputStream

  1. Si le JAR/WAR est sur le classpath, vous pouvez le faire SomeClass.class.getResourceAsStream("/path/from/the/jar/to/maven.properties"), où SomeClass est une classe à l'intérieur que JAR/WAR

    // these are equivalent: 
    SomeClass.class.getResourceAsStream("/abc/def"); 
    SomeClass.class.getClassLoader().getResourceAsStream("abc/def"); 
    // note the missing slash in the second version 
    
  2. Sinon, vous devrez lire le comme JAR/WAR ceci:

    JarFile jarFile = new JarFile(file); 
    InputStream inputStream = 
        jarFile.getInputStream(jarFile.getEntry("path/to/maven.properties")); 
    

Maintenant, vous voulez probablement charger le InputStream dans un objet Properties:

Properties props = new Properties(); 
// or: Properties props = System.getProperties(); 
props.load(inputStream); 

Ou vous pouvez lire le InputStream à une chaîne. Cela est beaucoup plus facile si vous utilisez une bibliothèque comme

  • Apache Commons/IO

    String str = IOUtils.toString(inputStream) 
    
  • Google Guava

    String str = CharStreams.toString(new InputStreamReader(inputStream)); 
    
7
String path = "META-INF/maven/pom.properties"; 

Properties prop = new Properties(); 
InputStream in = ClassLoader.getSystemResourceAsStream(path); 
try { 
    prop.load(in); 
} 
catch (Exception e) { 

} finally { 
    try { in.close(); } 
    catch (Exception ex){} 
} 
System.out.println("maven properties " + prop); 
+2

+1 pour 'ClassLoader.getSystemResourceAsStream()' ne savait pas celui-là –

1

Ceci est certainement possible, bien que sans connaître votre situation exacte, il est difficile de dire précisément. Les fichiers WAR et JAR sont essentiellement des fichiers .zip. Si vous avez l'emplacement du fichier contenant le fichier .properties, vous pouvez simplement l'ouvrir en utilisant ZipFile et en extraire les propriétés.

Si c'est un fichier JAR cependant, il peut y avoir un moyen plus facile: vous pouvez simplement l'ajouter à votre classpath et charger les propriétés en utilisant quelque chose comme:

SomeClass.class.getClassLoader().getResourceAsStream("maven.properties"); 

(en supposant que le fichier de propriétés est à la racine paquet)