执行Maven Install时出现Kafka bootstrap.servers不可解析错误求助
执行maven install时触发如下错误:
Caused by: org.apache.kafka.common.config.ConfigException: No resolvable bootstrap urls given in bootstrap.servers at org.apache.kafka.clients.ClientUtils.parseAndValidateAddresses(ClientUtils.java:89) ~[kafka-clients-3.1.1.jar:na] at org.apache.kafka.clients.ClientUtils.parseAndValidateAddresses(ClientUtils.java:48) ~[kafka-clients-3.1.1.jar:na] at org.apache.kafka.clients.consumer.KafkaConsumer.<init>(KafkaConsumer.java:730) ~[kafka-clients-3.1.1.jar:na]
相关配置文件
docker-compose.yml
version: '2' services: zookeeper: image: confluentinc/cp-zookeeper:latest restart: always environment: ZOOKEEPER_CLIENT_PORT: 2181 ZOOKEEPER_TICK_TIME: 2000 ports: - 2181:2181 networks: - app-network kafka: image: confluentinc/cp-kafka:latest container_name: kafka restart: always depends_on: - zookeeper ports: - 9092:9092 environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 networks: - app-network mongodb: image: mongo:latest restart: always container_name: mongodb networks: - app-network ports: - 27017:27017 matching-engine-helper: image: matching-engine-helper:latest restart: always container_name: "matching-engine-helper" networks: - app-network ports: - 9192:9192 depends_on: - mongodb - zookeeper - kafka matching-engine-core: image: matching-engine-core:latest restart: always container_name: "matching-engine-core" networks: - app-network ports: - 9191:9191 depends_on: - matching-engine-helper - zookeeper - kafka - mongodb networks: app-network: driver: bridge
application.yml
spring: data: mongodb: database: matching-engine-mongodb host: mongodb port: 27017 kafka: bootstrap-servers: kafka:9092 server: port: 9192
本地运行正常,但Docker容器内执行构建Jar包失败,询问是否需要配置环境变量。
问题根源
错误本质是构建阶段(maven install)Spring Boot尝试初始化Kafka客户端,但此时docker-compose中的Kafka服务还未启动——maven install是编译构建环节,而Kafka容器是应用运行时才会启动的服务,构建阶段根本无法解析kafka:9092这个地址。如果是在独立Docker容器内执行构建,该容器甚至不在app-network网络中,更无法访问Kafka服务。
具体解决方案
跳过构建阶段的测试执行
如果maven install时触发了单元/集成测试,而这些测试会初始化Kafka客户端,直接跳过测试即可:mvn install -DskipTests或者在pom.xml中配置默认跳过测试,仅在需要时手动执行。
用环境变量动态配置Kafka地址
修改application.yml,给Kafka地址添加环境变量占位符,让构建阶段可以临时覆盖配置:spring: kafka: bootstrap-servers: ${KAFKA_BOOTSTRAP_SERVERS:kafka:9092}构建时设置临时环境变量,比如用一个格式合法但无需实际连接的地址:
KAFKA_BOOTSTRAP_SERVERS=localhost:9092 mvn install用Testcontainers处理集成测试
如果必须在构建阶段运行集成测试,使用Testcontainers自动启动临时Kafka容器,确保测试时能连接到可用的Kafka服务,避免配置解析错误。将构建容器加入app-network
如果是在Docker容器内执行构建,把该容器加入docker-compose定义的app-network,这样kafka:9092就能正常解析:docker run --network=app-network -v $(pwd):/app maven:latest mvn install -f /app/pom.xml
总结
不需要额外配置永久环境变量,但需要调整构建流程:要么跳过测试,要么用环境变量占位符规避构建时的Kafka连接,要么用测试容器处理测试场景。
内容的提问来源于stack exchange,提问作者Manzoor Ahmad

