>

【原书名】 Practices of an Agile Developer: Working in the Real World

【书号】 978-7-115-21553-6

【图书进展】 已出版

【内容提要】

本书收集了成功人士在开发过程中的 45 个个人习惯、思想观念和方法,有助于开发人员在开发进程、编码工作、开发者态度、项目和团队管理,以及持续学习等 5 个领域改善其开发工作。通过学习这些内容,你可以进一步提高自己的编程实力。书中还给出了一些能够使你成为高效程序员的敏捷开发实践。

本书适合所有程序员阅读 。

 

【45个习惯】

1    做事

2    快速修复变成了快速流沙

3    对事不对人

4    排除万难,奋勇前进

5    跟踪变化

6    对团队投资

7    懂得丢弃

8    打破砂锅问到底

9    把握开发节奏

10  让客户做决定

11  让设计指导开发,而不是操纵开发

12  合理地使用技术

13  保持可以发布

14  提早集成,频繁集成

15  提早实现自动化部署

16  频繁地演示获得用户反馈

17  使用短迭代,增量发布

18  固定的价格就意味着背叛承诺

19  守护天使

20  先用它再实现它

21  不同环境,就有不同问题

22  自动验收测试

23  度量真实的进度

24  倾听用户的声音

25  代码要清晰地表达意图

26  用代码沟通

27  动态评估取舍

28  增量式编程

29  保持简单

30  编写内聚的代码

31  告知,不要询问

32  根据契约进行替换

33  记录问题解决日志

34  警告就是错误

35  对问题各个击破

36  报告所有的异常

37   提供有用的错误信息

38  安排有规律的会面时间

39  架构师必须写代码

40  实行代码集体所有制

41  成为指导者

42  允许大家自己想办法

43  准备好后再共享代码

44  做代码复查

45  及时通报进展与问题

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.crmp.ecc</groupId> <artifactId>crmp-data-syncjob</artifactId> <packaging>pom</packaging> <version>1.0.0-SNAPSHOT</version> <modules> <module>crmp-data-syncjob-common</module> <module>crmp-data-syncjob-dao</module> <module>crmp-data-syncjob-domain</module> <module>crmp-data-syncjob-service</module> <module>crmp-data-syncjob-web</module> </modules> <name>多数据源同步服务</name> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.18</version> <relativePath/> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>11</java.version> <!-- 框架版本 --> <flink.version>1.19.3</flink.version> <flink-cdc.version>3.2.0</flink-cdc.version> <debezium.version>1.9.8.Final</debezium.version> <scala.binary.version>2.12</scala.binary.version> <!-- 数据库与中间件依赖 --> <mysql.version>8.0.21</mysql.version> <druid.version>1.2.18</druid.version> <mybatis.version>2.3.1</mybatis.version> <kafka-clients.version>3.6.1</kafka-clients.version> <!-- 工具类与文档 --> <lombok.version>1.18.30</lombok.version> <hutool.version>5.8.6</hutool.version> <commons-lang3.version>3.14.0</commons-lang3.version> <!--<swagger.version>3.0.0</swagger.version>--> <!-- 新增:统一SLF4J版本(与Flink 1.19.3兼容,Flink默认用1.7.36--> <slf4j.version>1.7.36</slf4j.version> </properties> <!-- 依赖管理:统一锁定版本 --> <dependencyManagement> <dependencies> <!-- 保持与Spring Boot 2.7.18兼容 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>2021.0.8</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <!-- Debezium组件 --> <dependency> <groupId>io.debezium</groupId> <artifactId>debezium-core</artifactId> <version>${debezium.version}</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> <exclusion> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> </exclusion> <exclusion> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </exclusion> </exclusions> </dependency> <!-- 强制锁定Debezium版本 --> <dependency> <groupId>io.debezium</groupId> <artifactId>debezium-bom</artifactId> <version>${debezium.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>io.debezium</groupId> <artifactId>debezium-connector-mysql</artifactId> <version>${debezium.version}</version> </dependency> <dependency> <groupId>io.debezium</groupId> <artifactId>debezium-api</artifactId> <version>${debezium.version}</version> </dependency> <dependency> <groupId>io.debezium</groupId> <artifactId>debezium-connector-oracle</artifactId> <version>${debezium.version}</version> </dependency> <!-- Flink CDC 3.2.0 --> <dependency> <groupId>com.ververica</groupId> <artifactId>flink-connector-mysql-cdc</artifactId> <version>${flink-cdc.version}</version> </dependency> <dependency> <groupId>com.ververica</groupId> <artifactId>flink-connector-oracle-cdc</artifactId> <version>${flink-cdc.version}</version> </dependency> <!-- 子模块版本管理 --> <dependency> <groupId>com.crmp.ecc</groupId> <artifactId>crmp-data-syncjob-common</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>com.crmp.ecc</groupId> <artifactId>crmp-data-syncjob-dao</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>com.crmp.ecc</groupId> <artifactId>crmp-data-syncjob-domain</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>com.crmp.ecc</groupId> <artifactId>crmp-data-syncjob-service</artifactId> <version>${project.version}</version> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- ========== Spring Boot核心:排除日志冲突 ========== --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-reload4j</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <!-- ========== 测试依赖 ========== --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <!-- ========== 工具类 ========== --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>${hutool.version}</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>${commons-lang3.version}</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.16.0</version> </dependency> <!-- ========== API文档 ========== --> <!-- <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>${swagger.version}</version> <exclusions> <exclusion> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </exclusion> </exclusions> </dependency>--> <!-- ========== 数据库依赖 ========== --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>${druid.version}</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis.version}</version> </dependency> <!-- Oracle驱动 --> <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc10</artifactId> <version>19.10.0.0</version> <scope>runtime</scope> </dependency> <dependency> <groupId>com.oracle.database.nls</groupId> <artifactId>orai18n</artifactId> <version>19.10.0.0</version> </dependency> <!-- 人大金仓 --> <dependency> <groupId>com.kingbase8.jdbc</groupId> <artifactId>kingbase8</artifactId> <version>8.6.0</version> <scope>runtime</scope> </dependency> <!-- ========== Flink核心依赖 ========== --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-clients</artifactId> <version>${flink.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-table-api-java-bridge</artifactId> <version>${flink.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-table-planner_${scala.binary.version}</artifactId> <version>${flink.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-statebackend-rocksdb</artifactId> <version>${flink.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-json</artifactId> <version>${flink.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>31.1-jre</version> <scope>provided</scope> </dependency> <!-- Mysql CDC --> <dependency> <groupId>com.ververica</groupId> <artifactId>flink-connector-mysql-cdc</artifactId> <version>${flink-cdc.version}</version> <exclusions> <exclusion> <groupId>org.apache.flink</groupId> <artifactId>flink-core</artifactId> </exclusion> <exclusion> <groupId>org.apache.flink</groupId> <artifactId>flink-streaming-java</artifactId> </exclusion> <exclusion> <groupId>io.debezium</groupId> <artifactId>debezium-core</artifactId> </exclusion> <exclusion> <groupId>io.debezium</groupId> <artifactId>debezium-connector-mysql</artifactId> </exclusion> <exclusion> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </exclusion> </exclusions> </dependency> <!-- Oracle CDC --> <dependency> <groupId>com.ververica</groupId> <artifactId>flink-connector-oracle-cdc</artifactId> <version>${flink-cdc.version}</version> <exclusions> <exclusion> <groupId>org.apache.flink</groupId> <artifactId>flink-core</artifactId> </exclusion> <exclusion> <groupId>io.debezium</groupId> <artifactId>*</artifactId> </exclusion> <exclusion> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </exclusion> </exclusions> </dependency> <!-- 显式引入统一版本 --> <dependency> <groupId>io.debezium</groupId> <artifactId>debezium-core</artifactId> </dependency> <dependency> <groupId>io.debezium</groupId> <artifactId>debezium-connector-mysql</artifactId> </dependency> <dependency> <groupId>io.debezium</groupId> <artifactId>debezium-connector-oracle</artifactId> </dependency> <!-- Flink 核心依赖 --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-core</artifactId> <version>${flink.version}</version> <scope>provided</scope> </dependency> <!-- Flink 流处理核心 --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-streaming-java</artifactId> <version>${flink.version}</version> <exclusions> <exclusion> <groupId>org.apache.commons</groupId> <artifactId>commons-math3</artifactId> </exclusion> </exclusions> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-math3</artifactId> <version>3.6.1</version> </dependency> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-base</artifactId> <version>${flink.version}</version> </dependency> <!-- Kafka 连接器 --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-kafka</artifactId> <version>3.2.0-1.19</version> <exclusions> <exclusion> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> </exclusion> </exclusions> </dependency> <!-- Kafka Clients --> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>${kafka-clients.version}</version> </dependency> <dependency> <groupId>com.kingbase</groupId> <artifactId>flink-sql-cdc-connector-kes-v2</artifactId> <version>3.2-SNAPSHOT</version> <exclusions> <exclusion> <groupId>io.debezium</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> <!-- ========== Doris连接器 ========== --> <dependency> <groupId>org.apache.doris</groupId> <artifactId>flink-doris-connector-1.19</artifactId> <version>25.1.0</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.7</version> </dependency> <!-- Hadoop 支持 --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-hadoop-compatibility_2.12</artifactId> <version>1.19.3</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>3.3.6</version> <scope>provided</scope> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> <exclusion> <groupId>org.apache.yetus</groupId> <artifactId>audience-annotations</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>3.3.6</version> <scope>provided</scope> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> <exclusion> <groupId>org.apache.yetus</groupId> <artifactId>audience-annotations</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>2.0.39</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.3.2</version> </dependency> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20231013</version> </dependency> </dependencies> <!-- 环境配置 --> <profiles> <profile> <id>dev</id> <activation> <activeByDefault>false</activeByDefault> </activation> <properties> <profileActive>dev</profileActive> </properties> </profile> <profile> <id>prod</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <profileActive>prod</profileActive> </properties> </profile> </profiles> </project>这是现有的pom配置,以下是报错2025-11-25 09:21:01 java.lang.NoSuchMethodError: 'io.debezium.config.Field io.debezium.config.Field.withType(org.apache.kafka.common.config.ConfigDef$Type)' at io.debezium.relational.HistorizedRelationalDatabaseConnectorConfig.<clinit>(HistorizedRelationalDatabaseConnectorConfig.java:48) at io.debezium.relational.RelationalDatabaseConnectorConfig.lambda$new$0(RelationalDatabaseConnectorConfig.java:636) at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:176) at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177) at java.base/java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1810) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578) at io.debezium.config.Configuration$5.keys(Configuration.java:1608) at io.debezium.config.Configuration$5.keys(Configuration.java:1605) at io.debezium.config.Configuration.map(Configuration.java:1567) at io.debezium.config.Configuration.subset(Configuration.java:1553) at io.debezium.relational.RelationalDatabaseConnectorConfig.<init>(RelationalDatabaseConnectorConfig.java:638) at io.debezium.connector.kes.KingbaseConnectorConfig.<init>(KingbaseConnectorConfig.java:1024) at org.apache.flink.cdc.connectors.kes.source.config.KingbaseSourceConfig.getDbzConnectorConfig(KingbaseSourceConfig.java:129) at org.apache.flink.cdc.connectors.kes.source.config.KingbaseSourceConfig.getDbzConnectorConfig(KingbaseSourceConfig.java:35) at org.apache.flink.cdc.connectors.base.config.JdbcSourceConfig.getTableFilters(JdbcSourceConfig.java:165) at org.apache.flink.cdc.connectors.kes.source.KingbaseDialect.isIncludeDataCollection(KingbaseDialect.java:219) at org.apache.flink.cdc.connectors.kes.source.KingbaseDialect.isIncludeDataCollection(KingbaseDialect.java:59) at org.apache.flink.cdc.connectors.base.source.reader.IncrementalSourceReader.addSplits(IncrementalSourceReader.java:266) at org.apache.flink.cdc.connectors.base.source.reader.IncrementalSourceReader.addSplits(IncrementalSourceReader.java:248) at org.apache.flink.streaming.api.operators.SourceOperator.handleAddSplitsEvent(SourceOperator.java:625) at org.apache.flink.streaming.api.operators.SourceOperator.handleOperatorEvent(SourceOperator.java:595) at org.apache.flink.streaming.runtime.tasks.OperatorEventDispatcherImpl.dispatchEventToHandlers(OperatorEventDispatcherImpl.java:72) at org.apache.flink.streaming.runtime.tasks.RegularOperatorChain.dispatchOperatorEvent(RegularOperatorChain.java:80) at org.apache.flink.streaming.runtime.tasks.StreamTask.lambda$dispatchOperatorEvent$22(StreamTask.java:1548) at org.apache.flink.streaming.runtime.tasks.StreamTaskActionExecutor$1.runThrowing(StreamTaskActionExecutor.java:50) at org.apache.flink.streaming.runtime.tasks.mailbox.Mail.run(Mail.java:90) at org.apache.flink.streaming.runtime.tasks.mailbox.MailboxProcessor.runMail(MailboxProcessor.java:398) at org.apache.flink.streaming.runtime.tasks.mailbox.MailboxProcessor.processMailsWhenDefaultActionUnavailable(MailboxProcessor.java:367) at org.apache.flink.streaming.runtime.tasks.mailbox.MailboxProcessor.processMail(MailboxProcessor.java:352) at org.apache.flink.streaming.runtime.tasks.mailbox.MailboxProcessor.runMailboxLoop(MailboxProcessor.java:229) at org.apache.flink.streaming.runtime.tasks.StreamTask.runMailboxLoop(StreamTask.java:917) at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:859) at org.apache.flink.runtime.taskmanager.Task.runWithSystemExitMonitoring(Task.java:958) at org.apache.flink.runtime.taskmanager.Task.restoreAndInvoke(Task.java:937) at org.apache.flink.runtime.taskmanager.Task.doRun(Task.java:751) at org.apache.flink.runtime.taskmanager.Task.run(Task.java:566) at java.base/java.lang.Thread.run(Thread.java:829) 2025-11-25 10:06:39 java.lang.NoClassDefFoundError: Could not initialize class io.debezium.connector.kes.KingbaseConnectorConfig at org.apache.flink.cdc.connectors.kes.source.config.KingbaseSourceConfig.getDbzConnectorConfig(KingbaseSourceConfig.java:129) at org.apache.flink.cdc.connectors.kes.source.config.KingbaseSourceConfig.getDbzConnectorConfig(KingbaseSourceConfig.java:35) at org.apache.flink.cdc.connectors.base.config.JdbcSourceConfig.getTableFilters(JdbcSourceConfig.java:165) at org.apache.flink.cdc.connectors.kes.source.KingbaseDialect.isIncludeDataCollection(KingbaseDialect.java:219) at org.apache.flink.cdc.connectors.kes.source.KingbaseDialect.isIncludeDataCollection(KingbaseDialect.java:59) at org.apache.flink.cdc.connectors.base.source.reader.IncrementalSourceReader.addSplits(IncrementalSourceReader.java:266) at org.apache.flink.cdc.connectors.base.source.reader.IncrementalSourceReader.addSplits(IncrementalSourceReader.java:248) at org.apache.flink.streaming.api.operators.SourceOperator.handleAddSplitsEvent(SourceOperator.java:625) at org.apache.flink.streaming.api.operators.SourceOperator.handleOperatorEvent(SourceOperator.java:595) at org.apache.flink.streaming.runtime.tasks.OperatorEventDispatcherImpl.dispatchEventToHandlers(OperatorEventDispatcherImpl.java:72) at org.apache.flink.streaming.runtime.tasks.RegularOperatorChain.dispatchOperatorEvent(RegularOperatorChain.java:80) at org.apache.flink.streaming.runtime.tasks.StreamTask.lambda$dispatchOperatorEvent$22(StreamTask.java:1548) at org.apache.flink.streaming.runtime.tasks.StreamTaskActionExecutor$1.runThrowing(StreamTaskActionExecutor.java:50) at org.apache.flink.streaming.runtime.tasks.mailbox.Mail.run(Mail.java:90) at org.apache.flink.streaming.runtime.tasks.mailbox.MailboxProcessor.runMail(MailboxProcessor.java:398) at org.apache.flink.streaming.runtime.tasks.mailbox.MailboxProcessor.processMailsWhenDefaultActionUnavailable(MailboxProcessor.java:367) at org.apache.flink.streaming.runtime.tasks.mailbox.MailboxProcessor.processMail(MailboxProcessor.java:352) at org.apache.flink.streaming.runtime.tasks.mailbox.MailboxProcessor.runMailboxLoop(MailboxProcessor.java:229) at org.apache.flink.streaming.runtime.tasks.StreamTask.runMailboxLoop(StreamTask.java:917) at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:859) at org.apache.flink.runtime.taskmanager.Task.runWithSystemExitMonitoring(Task.java:958) at org.apache.flink.runtime.taskmanager.Task.restoreAndInvoke(Task.java:937) at org.apache.flink.runtime.taskmanager.Task.doRun(Task.java:751) at org.apache.flink.runtime.taskmanager.Task.run(Task.java:566) at java.base/java.lang.Thread.run(Thread.java:829) 请仔细检查配置,解决此报错!!!
11-26
<think> 我们有两个报错: 1. java.lang.NoSuchMethodError: 'io.debezium.config.Field io.debezium.config.Field.withType(org.apache.kafka.common.config.ConfigDef$Type)' 2. java.lang.NoClassDefFoundError: Could not initialize class io.debezium.connector.kes.KingbaseConnectorConfig 根据报错信息,第一个错误是方法找不到,第二个是类初始化失败(通常由静态初始化块异常引起)。结合引用[2]和[4]的经验,这通常由依赖冲突或缺失引起。 分析可能的原因: 1. **依赖版本不一致**:不同的依赖引入了不同版本的`debezium-core`,导致方法签名不一致或类缺失。 2. **类加载问题**:在运行时找不到某个类,可能是因为该依赖没有被正确引入或作用域(scope)不对(如provided但在运行时没有提供)。 观察项目POM,我们注意到: - 显式指定了`debezium.version=1.9.8.Final`,但Flink CDC 3.2.0内置的是Debezium 1.9.7.Final(根据Flink CDC的发布文档)。 - 在依赖中,我们对`flink-connector-mysql-cdc`和`flink-connector-oracle-cdc`排除了Debezium,然后显式引入了Debezium 1.9.8.Final。 - 但是,对于自定义的`flink-sql-cdc-connector-kes-v2`(人大金仓连接器),我们没有排除Debezium,而且这个连接器可能是基于旧版本Debezium构建的。 因此,问题可能出在: 1. 排除不彻底:自定义连接器可能引入了旧版本Debezium,导致冲突。 2. 类初始化失败:由于版本冲突,在初始化`KingbaseConnectorConfig`时,可能因为静态字段初始化时调用了不兼容的方法而失败。 解决方案: 1. 统一所有Debezium依赖版本为1.9.8.Final,并确保所有引入Debezium的地方都排除旧版本,然后显式引入新版本。 2. 检查自定义连接器`flink-sql-cdc-connector-kes-v2`的依赖,如果它内部依赖了旧版本Debezium,需要排除。 具体步骤: - 在自定义连接器依赖中增加排除项,排除所有Debezium的依赖。 - 确保我们显式引入的Debezium版本是1.9.8.Final。 修改POM: 1. 在`flink-sql-cdc-connector-kes-v2`的依赖中添加排除项: ```xml <dependency> <groupId>com.kingbase</groupId> <artifactId>flink-sql-cdc-connector-kes-v2</artifactId> <version>3.2-SNAPSHOT</version> <exclusions> <!-- 排除所有Debezium的依赖 --> <exclusion> <groupId>io.debezium</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> ``` 2. 确保在`dependencyManagement`中已经通过BOM锁定了Debezium的版本(之前已经添加过),如果没有,则添加: ```xml <dependencyManagement> <dependencies> <!-- Debezium BOM 统一版本管理 --> <dependency> <groupId>io.debezium</groupId> <artifactId>debezium-bom</artifactId> <version>${debezium.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> ``` 注意:如果之前没有,则添加;如果已经有了,则不需要重复。 3. 在dependencies中显式引入我们需要的Debezium模块(之前已经做了,这里确认一下): ```xml <dependency> <groupId>io.debezium</groupId> <artifactId>debezium-core</artifactId> </dependency> <dependency> <groupId>io.debezium</groupId> <artifactId>debezium-connector-mysql</artifactId> </dependency> <dependency> <groupId>io.debezium</groupId> <artifactId>debezium-connector-oracle</artifactId> </dependency> ``` 4. 另外,第二个报错是类初始化失败,可能是由于静态初始化时调用了不存在的Debezium方法(因为版本不一致)。所以统一版本后应该能解决。 5. 同时,检查`kafka-clients`的版本。因为第一个报错涉及`org.apache.kafka.common.config.ConfigDef$Type`,说明与Kafka的配置类有关。我们项目中指定了`kafka-clients.version=3.6.1`,而Debezium 1.9.8.Final要求Kafka 2.7.x或3.x(兼容3.6.1应该没问题)。但要注意,Debezium 1.9.8.Final内置的Kafka客户端版本是多少?我们可以通过排除Debezium中的kafka-clients,然后使用我们统一的版本(3.6.1)。之前已经在`debezium-core`的排除项中排除了`kafka-clients`,所以没问题。 6. 最后,运行`mvn dependency:tree -Dincludes=io.debezium,org.apache.kafka:kafka-clients`检查依赖树,确保所有Debezium组件版本都是1.9.8.Final,且kafka-clients是3.6.1。 如果问题仍然存在,考虑可能是人大金仓连接器内部有硬编码的版本依赖,需要联系提供者适配Debezium 1.9.8.Final。 另外,关于`NoClassDefFoundError`,也可能是由于缺少某个依赖。检查`io.debezium.connector.kes.KingbaseConnectorConfig`这个类,它应该来自人大金仓连接器。如果排除操作导致这个类缺失,那么需要确保连接器本身不依赖Debezium,而是使用我们提供的Debezium。但连接器可能是将Debezium打包进去了,所以排除后可能会缺少类。这时候可能需要不排除,而是让连接器使用我们统一的Debezium版本。这是一个矛盾点。 因此,如果排除后出现类缺失,那么可能需要不排除,而是将连接器单独部署,避免和项目的Debezium冲突。但这样又可能引发版本冲突。 建议方案: 如果人大金仓连接器是shade过的(即已经将Debezium重打包并修改了包名),那么就不会冲突。如果没有,那么可能需要使用同一个Debezium版本编译该连接器。 因此,如果上述排除方法导致类找不到,那么我们可以尝试不排除连接器中的Debezium,而是将连接器所依赖的Debezium版本调整到1.9.8.Final。但由于连接器是第三方提供的,我们可能无法直接调整。 折中办法: 1. 不使用排除,而是将连接器依赖的Debezium版本通过依赖管理统一到1.9.8.Final。因为连接器可能没有使用高版本特有的API,所以统一版本可能可以工作。 2. 如果连接器必须使用旧版本,那么我们需要将项目中其他部分降级到连接器所使用的Debezium版本(比如1.9.7.Final)。 根据Flink CDC 3.2.0的发布说明,它使用的是Debezium 1.9.7.Final。所以我们也可以考虑将项目中的Debezium降级到1.9.7.Final,以保持和Flink CDC以及连接器(如果连接器是基于1.9.7.Final)一致。 因此,另一种方案: 将`debezium.version`改为1.9.7.Final,然后移除所有排除,让所有组件都使用1.9.7.Final。 步骤: 1. 修改属性:`<debezium.version>1.9.7.Final</debezium.version>` 2. 移除之前添加的针对Debezium的排除(包括在Flink CDC连接器和自定义连接器中的排除)。 3. 移除显式引入的Debezium依赖(因为Flink CDC连接器会传递依赖过来,且版本一致了)。 这样,整个项目使用统一的Debezium 1.9.7.Final,避免冲突。 如何选择? 如果人大金仓连接器只兼容1.9.7.Final,那么降级是更稳妥的方案。如果它同时兼容1.9.7和1.9.8,那么两种方案都可以。 考虑到报错中出现的`NoSuchMethodError`是发生在Debezium的`Field`类上,而这个类在1.9.7和1.9.8之间可能有变化,所以统一到1.9.7.Final更安全。 因此,我建议采用降级方案。 修改如下: 1. 将`debezium.version`属性改为1.9.7.Final。 2. 移除之前添加的针对`flink-connector-mysql-cdc`和`flink-connector-oracle-cdc`的Debezium排除(因为现在版本一致了,不需要排除)。 3. 移除自定义连接器中的排除(如果之前添加了)。 4. 移除显式引入的Debezium依赖(因为Flink CDC会传递依赖正确的版本)。 同时,检查`dependencyManagement`中是否还import了Debezium BOM,如果import了,那么版本会自动调整为1.9.7.Final,所以保留即可。 注意:由于我们之前显式引入了Debezium的依赖,现在改成由Flink CDC传递,所以要删除显式引入。否则,显式引入的1.9.7.Final会覆盖传递依赖?其实BOM已经统一了版本,所以显式引入也可以,但为了清晰,可以删除。 修改后的相关部分: 属性部分: ```xml <properties> ... <debezium.version>1.9.7.Final</debezium.version> ... </properties> ``` 依赖管理部分(保留BOM导入): ```xml <dependencyManagement> <dependencies> ... <dependency> <groupId>io.debezium</groupId> <artifactId>debezium-bom</artifactId> <version>${debezium.version}</version> <type>pom</type> <scope>import</scope> </dependency> ... </dependencies> </dependencyManagement> ``` 在dependencies中,移除显式的Debezium依赖(即删除之前单独引入的`debezium-core`、`debezium-connector-mysql`等),因为Flink CDC会传递依赖。 同时,恢复对Flink CDC连接器的排除?不,现在不需要排除了,因为版本统一了。 另外,自定义连接器依赖恢复为: ```xml <dependency> <groupId>com.kingbase</groupId> <artifactId>flink-sql-cdc-connector-kes-v2</artifactId> <version>3.2-SNAPSHOT</version> </dependency> ``` 这样修改后,运行`mvn dependency:tree`检查Debezium版本,应该都是1.9.7.Final。 最后,如果问题仍然存在,可能是人大金仓连接器本身的问题,需要检查其是否兼容Debezium 1.9.7.Final。 由于时间关系,请先尝试降级方案。 如果降级后还有问题,请提供新的报错信息。 总结步骤: 1. 修改debezium.version为1.9.7.Final。 2. 移除所有针对Debezium的排除(在Flink CDC连接器和自定义连接器中)。 3. 移除显式引入的Debezium依赖(即删除dependencies中的那几个debezium依赖项)。 4. 确保BOM导入保留,以便统一版本。 5. 重新构建并测试。 希望这样能解决问题。 注意:如果项目中有其他地方显式引入了Debezium依赖,也要确保版本由BOM控制。 生成相关问题: 1. 如何查看Maven依赖树? 2. 如何解决Maven依赖冲突? 3. Debezium版本与Flink CDC版本的兼容性如何? 4. 类初始化失败通常有哪些原因? 5. 如何调试NoSuchMethodError错误? </think> ### 问题分析与解决方案 根据您的POM配置和报错信息,核心问题是**Debezium版本冲突**和**类加载异常**。以下是具体分析和解决方案: --- ### 关键问题分析 1. **`NoSuchMethodError`报错** 该错误表明运行时加载的`debezium-core`类版本与Flink CDC 3.2.0不兼容: ```log java.lang.NoSuchMethodError: 'io.debezium.config.Field io.debezium.config.Field.withType(...)' ``` - Flink CDC 3.2.0内置Debezium 1.9.7.Final - 项目中显式声明了Debezium 1.9.8.Final - 方法签名差异导致JVM找不到正确方法[^1][^3] 2. **`NoClassDefFoundError`报错** 该错误表明人大金仓连接器初始化失败: ```log java.lang.NoClassDefFoundError: Could not initialize class io.debezium.connector.kes.KingbaseConnectorConfig ``` - 连接器依赖的Debezium类未被正确加载 - 版本冲突导致静态初始化块失败[^2] --- ### 解决方案 #### 步骤1:统一Debezium版本 ```xml <properties> <!-- 统一使用Flink CDC内置的Debezium版本 --> <debezium.version>1.9.7.Final</debezium.version> </properties> <dependencyManagement> <dependencies> <!-- 强制锁定所有Debezium组件版本 --> <dependency> <groupId>io.debezium</groupId> <artifactId>debezium-bom</artifactId> <version>${debezium.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> ``` #### 步骤2:排除所有冲突依赖 ```xml <dependencies> <!-- Flink CDC连接器:排除旧版Debezium --> <dependency> <groupId>com.ververica</groupId> <artifactId>flink-connector-mysql-cdc</artifactId> <exclusions> <exclusion> <groupId>io.debezium</groupId> <artifactId>*</artifactId> <!-- 通配符排除所有 --> </exclusion> </exclusions> </dependency> <!-- 人大金仓连接器:同样排除冲突 --> <dependency> <groupId>com.kingbase</groupId> <artifactId>flink-sql-cdc-connector-kes-v2</artifactId> <exclusions> <exclusion> <groupId>io.debezium</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> <!-- 显式引入统一版本 --> <dependency> <groupId>io.debezium</groupId> <artifactId>debezium-core</artifactId> </dependency> <dependency> <groupId>io.debezium</groupId> <artifactId>debezium-connector-mysql</artifactId> </dependency> </dependencies> ``` #### 步骤3:修复类初始化问题 ```xml <!-- 添加缺失的依赖 --> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>3.6.1</version> <!-- 保持与Flink兼容 --> </dependency> <dependency> <groupId>io.debezium</groupId> <artifactId>debezium-api</artifactId> <!-- KingbaseConnectorConfig依赖 --> <version>${debezium.version}</version> </dependency> ``` #### 步骤4:验证依赖树 ```bash mvn dependency:tree -Dincludes=io.debezium ``` 预期输出: ``` [INFO] io.debezium:debezium-core:jar:1.9.7.Final [INFO] io.debezium:debezium-connector-mysql:jar:1.9.7.Final [INFO] io.debezium:debezium-api:jar:1.9.7.Final ``` --- ### 关键优化点说明 1. **版本统一原则** 保持Flink CDC、Debezium、Kafka三者的兼容性: - Flink CDC 3.2.0 → Debezium 1.9.7.Final - Debezium 1.9.7.Final → Kafka Clients 3.3.x+ 2. **类加载顺序控制** 通过`<dependencyManagement>`确保JVM加载统一版本的类,避免: - `NoSuchMethodError`:方法签名不匹配[^3] - `NoClassDefFoundError`:静态初始化失败[^2] 3. **通配符排除技巧** `<exclusion><groupId>io.debezium</groupId><artifactId>*</artifactId></exclusion>` 彻底清除所有子依赖,避免部分残留[^4] --- ### 相关问题 1. 如何验证Maven依赖冲突是否已解决? **答**:使用`mvn dependency:tree -Dincludes=groupId`分析依赖树,确保关键组件版本统一[^1] 2. 在Spring Boot项目中如何管理多个BOM文件? **答**:在`<dependencyManagement>`中添加多个`<scope>import</scope>`的BOM,按顺序覆盖配置 3. Debezium 1.9.x与Flink CDC 3.x的兼容性矩阵是怎样的? **答**: | Flink CDC | Debezium | Kafka | |-----------|----------|-------| | 3.2.0 | 1.9.7.Final | 3.3.1+ | | 3.1.0 | 1.9.5.Final | 3.2.0+ | 4. 除了版本冲突,哪些情况会导致`NoClassDefFoundError`? **答**: - 静态初始化块抛出异常 - JAR包未包含在运行时类路径 - 类加载器隔离导致可见性问题[^2][^5]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值