多Spring Profile下适配本地及PCF云环境的jar包路径配置问题
问题根因
${project.basedir}是Maven构建阶段变量,应用运行时无此变量,会被直接当作字符串解析,无法匹配到真实路径- PCF部署的Spring Boot应用默认以可执行JAR形式运行,不存在传统WAR包的
/WEB-INF/lib文件系统路径,打包后的内部资源结构和本地IDE运行的源码目录结构完全不同 - 相对路径
./src/main/webapp/xxx指向本地源码目录,部署后的运行环境无源码目录,自然无法找到对应文件
方案1:按多Profile配置正确路径
首先将myJar.jar移到项目的src/main/resources/lib目录下,打包时该文件会被自动打入应用classpath中,无需依赖Servlet容器的目录结构。
然后为不同Profile配置对应前缀的路径(Spring的ResourceLoader天生支持classpath:、file:等路径前缀,可以自动适配资源加载逻辑):
- 本地默认配置(application.properties):
my.customJar=classpath:lib/myJar.jar - PCF云环境配置(application-dev.properties):
- 如果直接使用打包内置的jar,和本地配置一致即可,无需额外修改
- 如果需要在PCF上使用外置的jar包,配置文件系统路径即可:
提前将jar包上传到PCF应用对应目录即可,也可以直接通过PCF应用的环境变量my.customJar=file:/home/abc/app/custom-lib/myJar.jarMY_CUSTOMJAR覆盖该配置,无需重新打包。
方案2:更简便的无配置实现
如果该jar包无需动态替换,完全可以去掉配置属性,直接通过类路径读取资源,适配所有环境:
@Bean @ConditionalOnProperty(prefix = "my", name = "customJar", matchIfMissing = true) public MyProject jarUserBean() throws IOException, ProjectInvalidException, InterruptedException { Resource resource = new ClassPathResource("/lib/myJar.jar"); try (InputStream is = resource.getInputStream()) { return new MyProject(is); } }
注意:原代码未关闭输入流,补充try-with-resources语法避免资源泄漏。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

