嗨,我正在学习如何使用Apache Kafka,当我尝试执行我的.jar文件时,我得到了这个错误:
错误:无法初始化主类Kafka.Main原因:java.lang.NoClassDefFoundError:org/apache/Kafka/clients/producer/Producer
我试图检查我的依赖项并更新它们,但我不明白为什么会发生这种情况。
这是我的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>org</groupId>
<artifactId>KafkaApp</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>3.4.0</version>
</dependency>
</dependencies>
<properties>
<java.version>17</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<build>
<plugins>
<plugin>
<!-- Build an executable JAR -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>kafka.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
2条答案
按热度按时间nhjlsmyf1#
您需要使用Shade Plugin而不是JAR插件创建一个可执行的fatJAR。只有这样,您的依赖类(比如
KafkaProducer
)才会包含在JAR文件中。1bqhqjot2#
另一个答案中提到的Maven Shade Plugin并不是唯一的方法。还有一种手动方法(虽然不推荐),以及在How to Create an Executable JAR with Maven中描述得很好的(更简单的)Apache Maven Assembly Plugin:
2.2. Apache Maven组装插件
Apache Maven Assembly Plugin允许用户将项目输出沿着依赖项、模块、站点文档和其他文件聚合到一个可运行的包中。
assembly插件中的主要目标是 single 目标,用于创建所有程序集(所有其他目标都已弃用,并将在未来版本中删除)。
让我们看看 * pom.xml * 中的配置:
与手动方法类似,我们需要提供有关主类的信息。不同之处在于Maven Assembly Plugin会自动将所有必需的依赖项复制到一个 jar 文件中。
在配置代码的 descriptorRefs 部分,我们提供了将添加到项目名称中的名称。
我们的示例中的输出将被命名为 core-java-jar-with-dependencies.jar。
*pros-jar文件中的依赖项,仅一个文件
*cons-打包工件的基本控制,例如,没有类重定位支持