java jar 包资源文件找不到以及空指针之坑

关于如何从 jar 包中读写资源文件,网上已经有很多相关的博客文档了,这里就不重复增加冗余信息,较好的资料可以参考:
Intellij IDEA 生成 jar 包:http://blog.youkuaiyun.com/folmarcher/article/details/50889361
从 jar 包中读写资源文件:http://blog.youkuaiyun.com/b_h_l/article/details/7767829

我这里要说的是,我在这个过程当中发现的一个坑。

第一步:
在 Intellij IDEA 开发好所有程序,使用 Debug 和 Run 模式运行均正常。注意程序中访问资源文件已经是使用的 getResourceAsStream() 方法了。

第二步:
生成 jar 包,并在 cmd 命令行下使用 “java -jar XXX.jar” 执行j jar 包。奇迹就在此刻发生,竟然报错说 “NullPointerException” 如果使用绝对路径报错是 “Could not find resources”。

第三步:
反复排查、不断调试,最终发现自的粗心也是有点坑的地方,就是:资源文件的名称大小写上出了问题。

得出的结论是:在 Intellij IDEA 开发环境中资源文件名称的大小写是不敏感的,而使用 “java -jar XXX.jar” 方式运行时是大小写敏感的。切记切记!!!

**==========================================**
**疑问?帮助?批评?欢迎评论 | QQ:593159978**
### 解决方案 为了确保 Spring Boot 项目打JAR 文件后能够正确输出空指针异常 (NullPointerException, NPE) 的堆栈信息,需确认几个方面: #### 配置日志级别 默认情况下,Spring Boot 使用 `Logback` 作为其日志记录实现。如果未看到详细的错误消息,则可能是由于日志级别设置不当所致。 可以在 `src/main/resources/application.properties` 或者 `application.yml` 中调整日志级别到更细粒度的程度,比如 DEBUG 或 ERROR: 对于 properties 文件: ```properties logging.level.root=ERROR ``` 对于 yml 文件: ```yaml logging: level: root: ERROR ``` 这会使得任何发生的严重错误,括 NullPointerException,在控制台或指定的日志文件中有完整的堆栈跟踪显示[^1]。 #### 处理全局异常 通过创建自定义的全局异常处理器来捕获所有的未处理异常,并确保这些异常被适当地记录下来。可以利用 `@ControllerAdvice` 和 `@ExceptionHandler` 注解完成这一功能。 下面是一个简单的例子: ```java import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(NullPointerException.class) public void handleNullPointerExcpetion(NullPointerException ex){ // 记录异常详情至日志系统或其他地方 System.err.println(ex.getMessage()); ex.printStackTrace(); } } ``` 上述代码片段展示了如何捕捉特定类型的异常并将它们的信息打印出来。当然也可以扩展此方法以适应更多种类的异常情况[^2]。 #### 打与运行时注意事项 当构建可执行 jar 时,请务必遵循官方文档推荐的最佳实践,特别是关于依赖管理和插件使用的部分。有时第三方库之间的版本不匹配可能会引发意想不到的行为,因此建议仔细审查 pom.xml 或 build.gradle 文件内的配置项,必要时排除不必要的传递性依赖关系[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值