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:javaworkspacejar>java -jar atomintl-sendemail-0.0.1-SNAPSHOT.jar D:javaworkspacejar D:javaworkspacejar/config/ tcp://192.168.24.15:61616 D:javaworkspacejar>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:javaworkspaceconfigapplication.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启动读取外部配置文件,只需要在外面加一层配置文件覆盖默认的即可,不用修改代码。