(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、开发新功能,一定一定要先在开发环境和测试环境测试完全后再上生产环境,毕竟能在本地环境能运行不一定在别的环境也能运行,后端小兄弟就是直接想要发布生产环境导致出现问题,虽然是自用服务没有被领导骂,但依旧引以为戒。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐