运行jar包时如何传入外部resources文件夹路径
外置resources文件夹的jar包运行配置方案
你之前执行的java -jar myProject.jar -Dconfig=/a/full/path存在参数顺序错误:-D开头的是JVM系统属性参数,必须放在-jar参数之前,放在jar包后面的参数会被当作应用程序的入参,JVM不会识别。
下面是两种可落地的实现方案:
方案1:无需修改现有代码,将外置资源目录加入类路径
如果你的原有代码是通过类加载器的getResource()/getResourceAsStream()方法读取资源文件,只需要把外置resources目录加入运行时类路径即可,无需调整业务代码。
- Linux/macOS启动命令写法:
java -cp "/path/to/extern/resources:myProject.jar" com.xxx.YourMainClass - Windows系统启动命令写法:
java -cp "C:\path\to\extern\resources;myProject.jar" com.xxx.YourMainClass
说明:使用
-jar参数启动时JVM会忽略所有外置的classpath配置,因此需要用-cp同时指定资源目录、jar包路径,最后跟上你的项目主类全限定名。
如果希望简化启动命令,可以在jar包的MANIFEST.MF文件中添加Class-Path: ./resources/配置,之后把resources文件夹放在和jar包同级的目录下,直接执行java -jar myProject.jar即可正常读取资源。
方案2:通过系统属性传入资源路径,小幅度调整代码
如果你的代码逻辑是直接读取文件系统路径的资源,可以用系统属性传入根路径:
- 调整启动命令,注意参数顺序:
java -Dconfig.dir=/a/full/path/to/resources -jar myProject.jar - 代码中读取资源路径示例:
// 读取系统属性的资源根路径,可自定义兜底默认值 String resourceRoot = System.getProperty("config.dir", "./"); // 拼接具体属性文件路径 File configFile = new File(resourceRoot, "application.properties"); // 后续正常读取文件即可
特殊场景:SpringBoot项目
如果是SpringBoot项目,可以直接使用框架自带的配置路径参数,无需调整代码:
java -jar myProject.jar --spring.config.location=/path/to/resources/application.properties
内容的提问来源于stack exchange,提问作者tharindu
相关产品推荐
相关产品推荐

