簡體   English   中英

在 Java 導出的 WAR 中在運行時創建配置文件

[英]Create config file at runtime in Java exported WAR

我已經用 Eclipse 制作了一個 web 項目來在 Tomcat v7 上運行我的 web 服務。 我有一個配置文件,它必須定義一些變量,這些變量應該在網絡服務器啟動時進行更改,而無需重新啟動它。 問題是:我可以把這個文件放在哪里? 目前我已將其放入“./”目錄,但似乎當我導出 WAR 文件並將其安裝在網絡服務器上時它不起作用。 有沒有辦法在 WAR 中創建這個文件並在運行時修改它?

這是訪問配置文件的 .class 文件的部分代碼

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;
    }
    ...

在web服務器中,.class以外的文件由服務器直接負責。 您不需要重新加載服務器。

但是嘗試使用.properties文件並在部署在服務器上時檢查 WAR 的結構。

我找到的最佳解決方案是使用 ClassLoader 搜索我之前在主目錄中創建的配置文件。 使用示例如下:

 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()); } }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM