记一次maven问题排查,修改属性无效的错误。

本文深入探讨了在使用Maven构建项目时遇到的版本冲突问题,特别是当父POM中的properties属性导致依赖版本不一致的情况。通过使用mvndependency:display-ancestors命令,作者详细介绍了如何排查并解决此类问题,强调了理解Maven结构的重要性。

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

起因:

在此模块中显式的声明了此依赖,并指定了版本。

但是在此处却变成了1.6.22

 

原因是父pom中的properties属性惹的祸。

使用命令:mvn dependency:display-ancestors可以查看当前项目的所有父pom,这样可以方便排查

spring boot虽然方便了开发,但是如果不清楚结构碰到问题也要找寻很久。这个问题两个人,半天时间没有找到。也是因为对于maven认识不深刻,虽然有意识到是版本号的问题,但是不知道从何下手。最后找到原因是因为,我想着既然不一样那么在common模块中将声明的版本注释掉,lombok应该还是可用的。果不其然,随后点击进入发现了这个父pom的存在。

### MyBatis PersistenceException 和 Java 编译错误的原因分析 #### 1. **关于 `PersistenceException` 的原因** 当遇到 `org.apache.ibatis.exceptions.PersistenceException` 错误时,通常是因为 MyBatis 在加载 XML 文件或执行 SQL 查询过程中出现了问题。具体到本案例中的两个主要场景: - 如果提示 `Could not find resource cn/library/mapper/UserMapper.xml` 或类似的路径找不到资源,则表明 MyBatis 配置文件未能正确定位到对应的 Mapper 文件[^1]。 - 可能原因是: - 路径配置不匹配:检查 `<mappers>` 中定义的 `resource` 属性是否指向实际存在的 XML 文件位置[^4]。 - 类路径未包含该文件:确保项目构建工具(如 Maven 或 Gradle)已将这些 XML 文件打包至目标目录。 对于第二个引用提到的情况,在动态条件查询中如果参数为空可能导致生成的 SQL 出现语法错误[^2]。例如: ```sql select * from t_customer where and jobs=? ``` 此情况可以通过调整 MyBatis 动态 SQL 来避免多余的 `AND` 关键字。可以改写为以下形式: ```xml <if test="jobs != null"> AND jobs=#{jobs} </if> ``` --- #### 2. **无效的源发行版和 Java 版本错误** Java 编译器报告 “无效的源发行版” 通常是由于 JDK 设置与项目的编译级别不符所致。以下是可能的原因及其解决方案: - **JDK 版本冲突**:确认当前使用的 JDK 是否支持指定的目标版本。例如,如果设置 `-source 8` 则需安装至少 JDK 8[^3]。 - **Maven/Gradle 构建工具配置不当**:在 POM 文件中应明确定义编译选项。例如: ```xml <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> </properties> ``` 或者在 Gradle 中通过以下方式设定: ```groovy java { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } ``` 此外还需验证 IDE 所选 JRE/JDK 是否一致于命令行环境下的 JDK 版本。 --- #### 3. **综合排查建议** 为了彻底解决问题,可按以下顺序逐一核查并修正: - 确认所有外部依赖项均已正确定位; - 修改 MyBatis 映射文件以消除潜在的 SQL 结构缺陷; - 更新开发环境中相关插件以及重新同步项目结构; - 测试最低限度功能运行正常后再逐步扩展复杂逻辑。 --- ### 示例代码片段 下面提供一段简单的测试方法用于验证基础映射关系是否有效: ```java public static void main(String[] args) throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); try (SqlSession session = sqlSessionFactory.openSession()) { CustomerMapper mapper = session.getMapper(CustomerMapper.class); List<Customer> customers = mapper.findAll(); System.out.println(customers); } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值