2017-10-17 15 views
-1

J'ai créé un projet web avec eclipse pour exécuter mon service web sur Tomcat v7. J'ai un fichier de configuration qui doit définir certaines variables qui doivent être changées pendant que le serveur web est en place sans avoir besoin de le redémarrer. Le problème est: où puis-je mettre ce fichier? Au moment où je l'ai mis dans le "./" dir, mais il semble que lorsque j'exporte le fichier WAR et l'installe sur le serveur web, il ne fonctionne pas. Est-il possible de créer ce fichier et de le modifier dans le WAR?Création d'un fichier de configuration à l'exécution en Java exporté WAR

Voici une partie du code du fichier .class qui accède au fichier de configuration

public class ToolConfigurations { 
    private static final Logger log = LogManager.getLogger(ToolConfigurations.class); //Oggetto logging 

    private static ToolConfigurations instance = null; //verificarne la necessità 

    private static String defaultServerName = null; 
    private static String defaultDbName = "postgres"; 
    private static String defaultDbUser = "postgres"; 
    private static String defaultDbPass = "password"; 
    private static int defaultDbMaxConnNum = 10; 

    private static String configFilePath = ".\\"; 
    private static String configFileName = "tool.properties"; 
    private String serverName = null; 
    private String dbName = null; 
    private String dbUser = null; 
    private String d`enter code here`bPass = null; 
    private int dbMaxConnNum = -1; 

    private ToolConfigurations() throws Exception { 
     File file = new File(configFilePath + configFileName); 
     if(file.exists()) { 
      //file configurazione esiste 
      FileReader in = new FileReader(file); 
      BufferedReader br = new BufferedReader(in); 
      String line = null; 

      while((line = br.readLine()) != null) { //Leggo riga per riga il file 
       String[] values = line.split(" "); 
       switch (values[0]) { 
        case "serverName": 
         serverName = values[1]; 
         break; 
        case "dbName": 
         dbName = values[1]; 
         break; 
        case "dbUser": 
         dbUser = values[1]; 
         break; 
        case "dbPass": 
         dbPass = values[1]; 
         break; 
        case "dbMaxConnNum": 
         dbMaxConnNum = Integer.parseInt(values[1]); 
         break; 
        default: 
         log.warn("Elemento inaspettato nel file di configurazione: " + values[0]); 
         break; 
       } 
      } 

      br.close(); 
      in.close(); 
     }else { 
      if(file.createNewFile() == false) { 
       //Errore creazione file 
       log.error("Errore creazione file di configurazione"); 
       throw new Exception("Errore creazione file configurazione"); 
      } 
      //CREO FILE CONFIGURAZIONE CON IMPOSTAZIONI DI DEFAULT 
      FileWriter fw = new FileWriter(file); 
      fw.write("dbName " + defaultDbName + "\r\n"); 
      fw.write("dbUser " + defaultDbUser + "\r\n"); 
      fw.write("dbPass " + defaultDbPass + "\r\n"); 
      fw.write("dbMaxConnNum " + defaultDbMaxConnNum + "\r\n"); 
      fw.flush(); 
      fw.close(); 
      log.warn("File di configurazione non trovato. Path: " + file.getAbsolutePath() + ". Creato nuovo file con configurazioni di default."); 
      //CARICO IMPOSTAZIONI DI DEFAULT 
      dbName = defaultDbName; 
      dbUser = defaultDbUser; 
      dbPass = defaultDbPass; 
      dbMaxConnNum = defaultDbMaxConnNum; 
     } 
    } 

    public static synchronized ToolConfigurations getInstance() throws Exception { 
     if(instance == null) { 
      instance = new ToolConfigurations(); 
     } 
     return instance; 
    } 
    ... 
+0

GUERRE ne sont pas destinés à être modifiés lors de l'exécution. Cela dit, vous pouvez manipuler une guerre éclatée (décompressée). Je recommanderais contre. Vous pourriez trouver une meilleure idée de mettre votre configuration dans JNDI. –

+0

J'ai besoin d'un endroit où mettre et atteindre mes fichiers de configuration indépendamment de l'environnement dans lequel je l'ai mis. –

Répondre

0

La meilleure solution que j'ai trouvé était un ClassLoader pour rechercher le fichier de configuration que j'ai précédemment créé dans le répertoire principal. L'exemple d'utilisation est:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
InputStream fileInput = classLoader.getResourceAsStream(configFileName); 
if(fileInput == null){ 
    //File not found 
}else{ 
    //File found 
    InputStreamReader sr = new InputStreamReader(fileInput); 
    BufferedReader br = new BufferedReader(sr); 
    try { 
     while((line = br.readLine()) != null) { 
      //Read file line by line 
     } 
    }catch (IOException e) { 
     throw new IOException("Error parsing file: " + e.getMessage()); 
    } 
} 

0

serveur Web, les fichiers autres que .class sont directement pris en charge par le serveur. Vous n'avez pas besoin de recharger le serveur.

Mais essayez d'utiliser .properties et vérifiez la structure du fichier WAR lorsqu'il est déployé sur le serveur.

+0

Oui, j'utilise un fichier .properties, mais le problème est: comment lier par rapport à cela? –

+0

S'il vous plaît poster une partie de votre code spécialement comment vous faites pour accéder à votre fichier. – Skykaza

+0

Vous pourriez trouver https://stackoverflow.com/q/1188400/53897 intéressant. –