jar包讀取jar包內部和外部的配置文件,springboot讀取外部配置文件的方法


jar包讀取jar包內部和外部的配置文件,springboot讀取外部配置文件的方法 

用系統屬性System.getProperty("user.dir")獲得執行命令的目錄(網上很多說是jar包的當前目錄是錯誤的

測試結果:

String path = System.getProperty("user.dir");
System.out.println(path);
String outpath = path + "/config/";
System.out.println(outpath);
Properties properties = new Properties();
InputStream in = new FileInputStream(new File(System.getProperty("user.dir")+File.separator+"config"+File.separator+"application.properties"));
try {
    properties.load(in);
} catch (IOException e) {
    e.printStackTrace();
}
String activemqConnection = properties.getProperty("activemq.connection");
System.out.println(activemqConnection);
------------
D:\javaworkspace\jar>java -jar atomintl-sendemail-0.0.1-SNAPSHOT.jar
D:\javaworkspace\jar
D:\javaworkspace\jar/config/
tcp://192.168.24.15:61616

D:\javaworkspace\jar>cd ..

D:\javaworkspace>java -jar jar/atomintl-sendemail-0.0.1-SNAPSHOT.jar
D:\javaworkspace
D:\javaworkspace/config/
Exception in thread "main" java.io.FileNotFoundException: D:\javaworkspace\config\application.properties (系統找不到指定的路徑。)

實例代碼

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class TestConfigPath {

    public static void main(String[] args) {
        String path = System.getProperty("user.dir");
        System.out.println(path);
        Properties properties = TestConfigPath.getProperties("application.properties");
        String activemqConnection = properties.getProperty("activemq.connection");
        System.out.println(activemqConnection);
    }

    public static Properties getProperties(String fileName) {
        try {
            String outpath = System.getProperty("user.dir")+File.separator+"config"+File.separator;//先讀取config目錄的,沒有再加載classpath的
            System.out.println(outpath);
            Properties properties = new Properties();
            InputStream in = new FileInputStream(new File(outpath + fileName));
            properties.load(in);
            return properties;
        } catch (IOException e) {
            System.out.println(e.getMessage());
            try {
                Properties properties = new Properties();
                InputStream in = TestConfigPath.class.getClassLoader().getResourceAsStream(fileName);//默認加載classpath的
                properties.load(in);
                return properties;
            } catch (IOException es) {
                System.out.println(es.getMessage());
                return null;
            }
        }
    }
}

 注:如果在docker里面運行在jar同目錄下放config目錄也是讀取不到的,Dockerfile里需要加上一句:ADD config/ /config/

然后讀出來的路徑是://config/application.properties

 

//config/application.properties
/config/application.properties (No such file or directory)

 

docker config里面的配置文件優先級比jar包的高,會覆蓋jar包里默認的配置,部署到其他服務器環境只需要修改對應配置就可以了
Dockerfile配置里需要加上:ADD config/ /config/

 

springboot讀取外部配置文件的方法,如下優先級:
第一種是在執行命令的目錄下建config文件夾。(在jar包的同一目錄下建config文件夾,執行命令需要在jar包目錄下才行),然后把配置文件放到這個文件夾下。
第二種是直接把配置文件放到jar包的同級目錄。
第三種在classpath下建一個config文件夾,然后把配置文件放進去。
第四種是在classpath下直接放配置文件。
springboot默認是優先讀取它本身同級目錄下的一個config/application.properties 文件的。
在src/main/resources 文件夾下創建的application.properties 文件的優先級是最低的

所以springboot啟動讀取外部配置文件,只需要在外面加一層配置文件覆蓋默認的即可,不用修改代碼。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM