【问题标题】:Dependency errors when running Apache Beam with Kafka使用 Kafka 运行 Apache Beam 时出现依赖性错误
【发布时间】:2026-01-25 21:45:02
【问题描述】:

当我使用 Direct Runner 运行我的 Apache Beam 代码时,我收到以下错误:

Caused by: java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.arrayFormat(Ljava/lang/String;[Ljava/lang/Object;)Lorg/slf4j/helpers/FormattingTuple;
    at org.apache.kafka.common.utils.LogContext$LocationAwareKafkaLogger.writeLog (LogContext.java:428)
    at org.apache.kafka.common.utils.LogContext$LocationAwareKafkaLogger.info (LogContext.java:382)
    at org.apache.kafka.clients.consumer.KafkaConsumer.assign (KafkaConsumer.java:1123)
    at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)

按如下方式运行:

mvn package

java -cp target/myjar.jar \
    com.CLASSNAME \
    --runner=DirectRunner \
    ...

如下运行不行

mvn compile exec:java \
    -Dexec.mainClass="com.CLASSNAME" \
    -Dexec.args="..."

这似乎与 slf4j 依赖冲突有关。 我已经看了好几个小时了,似乎没有任何进展。

我尝试过的事情:

  • 更改库的版本
  • 将 slf4j-api 依赖置于顶部
  • 不包括依赖项
  • 改变范围
  • 使用 mvn dependency:tree 检查依赖关系,但一切正常
  • 更改 jdk 版本

我注意到相同版本之间存在以下冲突:

非常感谢任何其他想法或意见。

为了完整起见,pom 文件的清理版本:

<?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>...</groupId>
    <artifactId>...</artifactId>
    <version>...</version>

    <packaging>jar</packaging>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <beam.version>2.19.0</beam.version>
        <google.cloud.core.version>1.108.1</google.cloud.core.version>
        <maven-compiler-plugin.version>3.7.0</maven-compiler-plugin.version>
        <maven-surefire-plugin.version>2.21.0</maven-surefire-plugin.version>
        <maven-jar-plugin.version>3.0.2</maven-jar-plugin.version>
        <maven-shade-plugin.version>3.1.0</maven-shade-plugin.version>
        <maven-exec-plugin.version>1.6.0</maven-exec-plugin.version>
        <slf4j.version>1.7.30</slf4j.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
...
    <dependencies>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.beam</groupId>
            <artifactId>beam-sdks-java-core</artifactId>
            <version>${beam.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.beam</groupId>
            <artifactId>beam-sdks-java-extensions-google-cloud-platform-core</artifactId>
            <version>${beam.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.beam</groupId>
            <artifactId>beam-runners-google-cloud-dataflow-java</artifactId>
            <version>${beam.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.beam</groupId>
            <artifactId>beam-sdks-java-io-google-cloud-platform</artifactId>
            <version>${beam.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.beam</groupId>
            <artifactId>beam-sdks-java-io-kafka</artifactId>
            <version>${beam.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka-clients</artifactId>
            <version>2.4.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.avro</groupId>
            <artifactId>avro</artifactId>
            <version>1.9.2</version>
        </dependency>

        <dependency>
            <groupId>org.apache.beam</groupId>
            <artifactId>beam-runners-direct-java</artifactId>
            <version>${beam.version}</version>
        </dependency>
    </dependencies>

</project>

【问题讨论】:

    标签: maven google-cloud-dataflow apache-beam


    【解决方案1】:

    我已经设法解决了这个问题。显然这不是由依赖项本身引起的,而是由插件引起的。我在我的问题中省略了pom.xml,因为我没想到这部分会产生特定的影响。

    错误原因:

    <pluginManagement>
                <plugins>
                    <plugin>
                        <groupId>org.codehaus.mojo</groupId>
                        <artifactId>exec-maven-plugin</artifactId>
                        <version>${maven-exec-plugin.version}</version>
                        <configuration>
                            <!-- the following is needed for logging to pick up the log4j.properties file -->
                            <includePluginDependencies>true</includePluginDependencies>
                            <cleanupDaemonThreads>false</cleanupDaemonThreads>
                        </configuration>
                    </plugin>
                </plugins>
            </pluginManagement>
    

    我们必须删除 includePluginDependencies 子标签,现在它可以工作了:

    <pluginManagement>
                <plugins>
                    <plugin>
                        <groupId>org.codehaus.mojo</groupId>
                        <artifactId>exec-maven-plugin</artifactId>
                        <version>${maven-exec-plugin.version}</version>
                        <configuration>
                            <cleanupDaemonThreads>false</cleanupDaemonThreads>
                        </configuration>
                    </plugin>
                </plugins>
            </pluginManagement>
    

    请注意,该行显然是为了选择操作 log4j 属性文件(见注释),我们现在可能不得不解决这个问题。我们仍然需要研究这是否会带来任何问题。

    【讨论】:

      最近更新 更多