Could not resolve placeholder ‘xxx‘ in value “${xxx}“ 【无法加载配置】【无法解决占位符】
查看是否有The following 1 profile is active: "prod"等类似日志,判断是否是因为没有加载配置文件报错
(2024-11-12)
一、起因
后端小兄弟在项目中新写的代码,发布到生产机的时候出现了问题,发现项目启动不成功,下载到本地后debug运行,发现如下报错:
Could not resolve placeholder 'like.swagger.enabled' in value "${like.swagger.enabled}"
经检查,yml文件中存在该配置
二、问题排查
百度了一篇文章:https://blog.csdn.net/a_helloword/article/details/118334203
解释如果没有: The following profiles are active:xxx
这句日志,则说明配置文件根本没生效
查看项目结构后发现是resource目录没有被maven识别,将resource目录设置为资源目录后,项目成功启动,设置方法自行百度
=========================================================================================================
三、历史重演
然而,经过其他调试操作后,项目又无法启动,此时配置文件依旧没有生效,但是resource目录已经可以被maven识别了。
查看日志,发现缺少The following profiles are active:xxx
这句日志,说明原因是因为配置文件没有被加载。
这究竟是为何呢。
四、抽丝剥茧
此时,我突然想起来,为了将一个本地的jar包能够使用maven package
打包到项目包中,我在pom文件中添加了这么一行xml配置:
<!-- maven打包本地jar包配置 -->
<resources>
<resource>
<directory>${basedir}/libs</directory>
<targetPath>/BOOT-INF/lib/</targetPath>
<includes>
<include>**/*.jar</include>
<include>saobei-open-sdk-1.1.4.jar</include>
</includes>
</resource>
</resources>
解释一下:
<directory>
该标签 表示资源目录
${basedir}
这个变量用来表示项目的根目录,${project.basedir}
也有同样的作用
<targetPath>
该标签 表示目标目录,即打出的jar包目录
/BOOT-INF/lib/
是jar包中用来存放依赖的jar包的目录
学习到两个命令:
jar -xf jar包名
可以解压jar包,也可以用7-zip等工具
java -jar 你的jar包名.jar 你要反编译的class文件名.class > 你的java文件名.java
可以反编译class文件为java文件,也可以用JD-GUI等反编译工具
我猜想,可能是我添加的这一行代码导致maven打包时只关注了${basedir}/libs下的资源,无视了resource目录下的资源
于是添加了新的<resource>
,即添加新的资源节点:
<!-- 该节点会扫描src/main/java目录,若该目录下有配置文件,则需要添加以下配置,保证文件能够被扫描和加载到 -->
<resource>
<directory>src/main/java</directory>
<includes>
<!-- 根据目录下的文件配置需要扫描的文件类型 -->
<include>**/*.yml</include>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<!-- 该节点会扫描src/main/resources,一般资源文件和配置文件会放在该目录下 -->
<resource>
<directory>src/main/resources</directory>
<includes>
<!-- 根据目录下的文件配置需要扫描的文件类型 -->
<include>**/*.yml</include>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
这段代码作用是让maven打包的时候扫描src/main/java目录
和src/main/resources目录
,查看其中带有yml、properties、xml
后缀的文件
解释:**/*.yml,表示父目录下所有的文件和文件夹
注意:
标签要包含在标签中
此处借鉴了文章:https://blog.csdn.net/weixin_39927203/article/details/123655192
maven可视化工具中点击刷新,重新加载pom文件中新增的配置
五、结局
运行日志中有了这句日志:
The following 1 profile is active: "prod"
想来这次能成功启动
最终看到项目启动监控成功打印了自己的日志
问题完美解决!
======================================================================================================
总结一下这次学到了些什么东西:
1.maven pom.xml文件配置标签:
<build>
maven构建配置标签
<resources>
maven项目构建的资源父级标签
<resource>
maven项目构建的资源子节点标签
<directory>
资源目录
<targetPath>
构建后文件存放的目标目录
<includes>
资源目录中需要扫描的资源父级标签
<include>
资源目录中需要扫描的资源子级标签
2.**/*.yml等
**/**
用来表示目录下所有的文件和目录
**/*.yml
用来表示目录下所有的yml文件
3.jar包目录:
/BOOT-INF/lib/
用来存放依赖的第三方jar包(外部依赖)
4、${basedir} 、${project.basedir}
可以用来表示项目的根目录
5.可以用
The following 1 profile is active: "prod"
这句日志判断是否是配置文件未成功加载问题
6、学会了如何配置maven bulid xml
7、开发新功能,一定一定要先在开发环境和测试环境测试完全后再上生产环境,毕竟能在本地环境能运行不一定在别的环境也能运行,后端小兄弟就是直接想要发布生产环境导致出现问题,虽然是自用服务没有被领导骂,但依旧引以为戒。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)