SpringBoot项目jar启动异常BOOT-INF/classes!/config/* not exists

本文介绍了在尝试将项目部署到服务器时遇到的Java读取jar包内资源配置文件的服务启动错误。问题在于使用`Class.getResource()`方法无法读取jar压缩包内的文件。解决方案是改用`ClassPathResource`来获取输入流,从而正确读取资源文件。这种方法在不同环境下都能正常工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天想把项目上服务器测试,第一次mvn打jar包,然后出现了这个错误
在这里插入图片描述
这么一看就知道是读取配置文件时候出的错

问题代码:

ClassLoader classLoader = ServiceRunner.class.getClassLoader();
        URL resource = classLoader.getResource("config/services.xlsx");

使用getResource来读取resources文件夹下的文件,但是这个方法没有办法读取压缩文件里的路径,而jar本质来说是一个压缩包.

解决办法
这就好办了,改读取方法就行了,然后我又找读文件的方法,发现方法有很多,但是都是有限制,要不就win可用linux不能用,要不就是开发时能用部署没用.

修改后:

Resource resource 
`org.springframework.beans.factory.BeanCreationException` 是 Spring 框架中的异常,表示在创建某个 Bean 的过程中发生了错误。从你的描述来看,这个异常发生在尝试实例化名为 `'dataAuthRuleDbLoadImpl'` 的 Bean 时。 以下是问题的核心原因以及解决思路: ### 核心分析 1. **Bean 创建失败**: - 异常堆栈显示,在加载 `DataAuthRuleDbLoadImpl` 这个类作为 Spring 容器中的一个 Bean 时发生错误。 2. **构造函数抛出异常**: - 具体原因是该类的构造函数在执行期间引发了另一个异常 (`Constructor threw exception`)。 3. **数据库表不存在**: - 最底层的原因是由 H2 数据库驱动返回了 `JdbcSQLException: Table "SYS_DATA_AUTH" not found` 错误,表明程序试图访问的数据表 `"SYS_DATA_AUTH"` 并未存在于当前数据库中。 --- ### 解决方案 #### 步骤一:确认数据表是否存在 检查目标数据库(H2 或其他实际使用的数据库),验证是否确实存在 `SYS_DATA_AUTH` 表。如果此表缺失,则需要通过以下方式之一解决问题: - 确认项目的初始化脚本文件(如 `.sql` 文件)已正确运行,并包含建表语句。 - 如果是测试环境,手动添加对应的表结构到数据库中。 #### 步骤二:确保正确的启动配置 如果你正在使用嵌入式 H2 数据库进行本地调试,请确保其连接字符串、模式等配置无误。例如,在 application.properties 中应有类似下面的内容: ```properties spring.datasource.url=jdbc:h2:mem:testdb;MODE=MySQL; spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa spring.datasource.password=password ``` 同时注意 schema 和 data 脚本路径设置: ```properties spring.sql.init.schema-locations=classpath:schema.sql spring.sql.init.data-locations=classpath:data.sql ``` #### 步骤三:检查依赖注入与业务逻辑 审查 `DataAuthRuleDbLoadImpl` 类及其构造方法内容,判断是否有对非资源或其他前置条件的假设(比如强制查询某些记录)。如果有这种需求,请补充必要的校验或日志提示信息。 --- ### 示例代码片段 (部分修正示例) 假如我们怀疑是因为 SQL 初始化顺序导致的问题,可以修改如下: ```java // DataAuthRuleDbLoadImpl.java 构造函数内增加健壮性处理 public DataAuthRuleDbLoadImpl() { try { // 查询 SYS_DATA_AUTH 是否为 if (!tableExists("SYS_DATA_AUTH")) { throw new IllegalStateException("Required table 'SYS_DATA_AUTH' does NOT exist!"); } } catch (SQLException e) { log.error("Error checking database tables", e); throw new RuntimeException(e); // 将低层异常包装后再次抛给上层 } } private boolean tableExists(String tableName) throws SQLException { Connection connection = dataSource.getConnection(); // 使用数据源获取链接 DatabaseMetaData metaData = connection.getMetaData(); ResultSet rs = metaData.getTables(null, null, tableName.toUpperCase(), null); return rs.next(); // 存在则 true,反之 false } ``` --- ### 总结 此次报错的根本在于缺少关键表格 `SYS_DATA_AUTH` 导致后续操作无法继续完成。因此,建议优先排查数据库状态并修复相关缺陷。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值