【问题标题】:Kafka Producer Class Not Found ExceptionKafka Producer Class Not Found 异常
【发布时间】:2018-08-22 05:09:21
【问题描述】:

我尝试使用 kafka 实现一个简单的生产者消费者示例,并通过以下属性实现:

Properties configProperties = new Properties();
    configProperties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"localhost:" + portNumber);
    configProperties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,"org.apache.kafka.common.serialization.ByteArraySerializer");
    configProperties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,"org.apache.kafka.common.serialization.StringSerializer");

    // Belirtilen property ayarlarına sahip kafka producer oluşturulur
    org.apache.kafka.clients.producer.Producer producer = new KafkaProducer(configProperties);

但是,当我在另一个作为数据可视化软件插件的项目中尝试完全相同的配置,并且其他一切都相同时,我收到了这个错误:

.... // Here there is some other stuff but I thing the important one is the below one
Caused by: java.lang.NoClassDefFoundError: org/apache/kafka/clients/producer/Producer
at App.MyControlPanel.<init>(MyControlPanel.java:130)
at App.CytoVisProject.<init>(CytoVisProject.java:29)
... 96 more
Caused by: java.lang.ClassNotFoundException: org.apache.kafka.clients.producer.Producer
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 98 more

在我说它有效的第一个中,我使用了“mvn clean compile assembly:single”,但在第二个中,我为整个项目创建了一个 jar 文件。因为可视化软件需要一个jar文件来安装插件。由于每件事都是一样的(至少我找不到任何区别,我使用了相同的代码)我猜问题出在构建项目的方式上。这里发生了什么? “mvn clean compile assembly:single”和在 IntelliJ 中构建 jar 文件有什么区别?为什么我收到此错误以及如何解决此问题?非常感谢您的帮助!


正如我在第一个答案的最后一条评论中所说,我有一个以清单和转换为目标的插件。这里:

<plugin>
            <groupId>com.springsource.bundlor</groupId>
            <artifactId>com.springsource.bundlor.maven</artifactId>
            <version>1.0.0.M2</version>
            <configuration>
                <outputManifest>C:\Users\USER\AppData\Local\Temp\archetype2tmp/META-INF/MANIFEST.MF</outputManifest>
                <failOnWarnings>false</failOnWarnings>
                <removeNullHeaders>true</removeNullHeaders>
                <manifestHeaders><![CDATA[Bundle-ManifestVersion: 2
Bundle-Name: CytoVisProject
Bundle-SymbolicName: CytoVisProject
Spring-DM-Version: ${pom.version}
]]></manifestHeaders>
            </configuration>
            <!-- generate the manifest automatically during packaging -->
            <executions>
                <execution>
                    <id>bundle-manifest</id>
                    <phase>package</phase>
                    <goals>
                        <goal>manifest</goal>
                        <goal>transform</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

如果我使用如下阴影插件:

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.1.0</version>
            <configuration>

            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

它不起作用,因为我需要在我的插件中使用清单和转换作为目标。如何将 kafka 类添加到 IntelliJ 创建的 jar 文件中以解决此问题(我不确定这是否可以解决)?

【问题讨论】:

  • 你是否在 JAR 中包含了依赖项?
  • @jrtapsell 我从项目结构下的库选项卡中添加了这个 jar 文件“kafka-clients-0.10.0.0.jar”。它存在于 pom.xml 中。够了吗?
  • 需要在classpath中(插件中常见classpath问题),如果类在JAR中就会被找到,否则插件需要手动添加依赖JAR。
  • @jrtapsell 是的,生产者和消费者类在 IntelliJ 创建的 jar 文件中。我不知道类路径的事情,我该如何解决?感谢您的回答。
  • 你需要在你的插件中提供kafka-clients-0.10.0.0.jar文件,此时它在编译时可用,所以没有编译错误,然后在运行时消失,因此你的错误

标签: java maven apache-kafka


【解决方案1】:

问题是什么

在编译时kafka-clients-0.10.0.0.jar 可用,因此代码编译成功,但在运行时它丢失,因此出现错误。

如何解决

你有两个选择:

  • 在您的 JAR 中包含 kafka JAR
  • 将 kafka JAR 添加到插件的类路径中

【讨论】:

  • 我将此jar文件添加到maven项目的资源文件中,现在当我为插件构建和创建jar文件时,kafka-clients jar出现在插件的jar文件中。但是我又遇到了同样的错误。
  • 您需要在 JAR 中包含类,而不是整个 JAR,this 应该会有所帮助
  • 我做了完全相同的步骤,但它没有再次起作用。有没有办法将 kafka jar 添加到类路径?
  • 您能否确认 Kafka 类已混合到您的 JAR 文件中,而不是留在自己的 JAR 文件中
  • 不,它们没有混合。 @jrtapsell
【解决方案2】:

我找到了一个更简单的解决方案。我变了

kafkaProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,"org.apache.kafka.common.serialization.StringSerializer");

到这里

kafkaProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);

然后我的代码运行,也作为预编译插件的一部分。

【讨论】:

    【解决方案3】:

    另外,请确保您没有对标有提供范围的 kafka-clients 的依赖项。

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 2018-12-09
    • 1970-01-01
    • 2013-03-01
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多