2010-08-11 8 views
5

Nous avons un composant de mise en commun des connexions (fichier jar) pour l'une de nos applications. A partir de maintenant, les détails de connexion de l'application sont fournis avec le fichier jar (dans le fichier .properties).Comment un fichier jar peut lire un fichier de propriétés externe

Peut-on le rendre plus générique? Pouvons-nous avoir le client dire les détails du fichier de propriétés (à la fois le chemin et le nom du fichier) et utiliser le jar pour obtenir la connexion?

Est-il logique d'avoir quelque chose comme cela dans le code client ..

XyzConnection con = connectionIF.getConnection(uname, pwd); 

avec cela, le client précisera (en quelque sorte ???) les propriétés sur le fichier qui a - les URL connecter, délai d'attente, etc.

Répondre

5

il suffit de charger les propriétés du fichier, quelque chose comme

Properties properties = new Properties(); 
InputStreamReader in = null; 
try { 
    in = new InputStreamReader(new FileInputStream("propertiesfilepathandname"), "UTF-8"); 
    properties.load(in); 
} finally { 
    if (null != in) { 
     try { 
      in.close(); 
     } catch (IOException ex) {} 
    } 
} 

Notez comment le codage est explicitement spécifié comme UTF-8 ci-dessus. Il pourrait également être omis si vous acceptez le codage ISO8859-1 par défaut, mais méfiez-vous avec des caractères spéciaux alors.

13

De la manière la plus simple, utilisez l'option -D pour définir une propriété système sur une ligne de commande java. Cette propriété système peut contenir un chemin d'accès à votre fichier de propriétés.

par exemple

java -cp ... -Dmy.app.properties=/path/to/my.app.properties my.package.App 

Ensuite, dans votre code, vous pouvez le faire (la gestion des exceptions n'apparaît pas par souci de concision):

String propPath = System.getProperty("my.app.properties"); 

final Properties myProps; 

if (propPath != null) 
{ 
    final FileInputStream in = new FileInputStream(propPath); 

    try 
    { 
     myProps = Properties.load(in); 
    } 
    finally 
    { 
     in.close(); 
    } 
} 
else 
{ 
    // Do defaults initialization here or throw an exception telling 
    // that environment is not set 
    ... 
} 
0

simple est ci-dessous. Il chargera application.properties à partir du dossier cfg en dehors du fichier jar.

Répertoire Structure

|-cfg<Folder>-->application.properties 
    |-somerunnable.jar 

code:

Properties mainProperties = new Properties(); 
    mainProperties.load(new FileInputStream("./cfg/application.properties")); 
    System.out.println(mainProperties.getProperty("error.message")); 
-1
public static String getPropertiesValue(String propValue) { 
     Properties props = new Properties(); 
     fileType = PCLLoaderLQIOrder.class.getClassLoader().getResourceAsStream(propFileName); 
     if (fileType != null) { 
      try { 
       props.load(fileType); 
      } catch (IOException e) { 
       logger.error(e); 
      } 
     } else { 
      try { 
       throw new FileNotFoundException("Property file" + propFileName + " not found in the class path"); 
      } catch (FileNotFoundException e) { 
       logger.error(e); 
      } 
     } 
     String propertiesValue = props.getProperty(propValue); 
     return propertiesValue; 
    } 

méthodes ci-dessus fonctionne pour moi, simplement stocker votre fichier de propriétés dans le répertoire où exécuter votre pot et fournir ce nom en place de propFileName, lorsque vous voulez une valeur de la propriété appelez simplement getPropertyValue("name").

+1

C'est illisible. –

1

Ceci est ma solution. d'abord dans la recherche d'app.properties dossier de démarrage, si ne pas essayer de EXISTE charger de votre paquet pot

File external = new File("app.properties"); if (external.exists()) properties.load(new FileInputStream(external)); else properties.load(Main.class.getClassLoader().getResourceAsStream("app.properties"));