【发布时间】:2019-10-31 11:00:15
【问题描述】:
我正在尝试在 docker 上运行我的 kafka 项目。如果我在本地运行此项目,它可以正常工作,但如果我在 docker 上运行,则会收到此错误消息
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/kafka/clients/producer/Producer
at com.kafka.App.main(App.java:14)
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 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more
我不确定,但似乎无法从 pom.xml 加载依赖项。
这是我的 Dockerfile
FROM maven:3.5-jdk-8 as maven
WORKDIR /app
COPY ./pom.xml ./pom.xml
RUN mvn dependency:go-offline -B
COPY ./src ./src
RUN mvn package && cp target/kafka-producer-*.jar app.jar
RUN apk add --no-cache bash
WORKDIR /app
COPY --from=maven /app/app.jar ./app.jar
CMD ["java", "-jar", "/app/app.jar"]
最后一件事 App:14 从 SimpleProducer 类创建新实例,错误行是
import com.kafka.Interfaces.IKafkaConstants;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer; ***HERE***
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.common.serialization.LongSerializer;
import org.apache.kafka.common.serialization.StringSerializer;
import java.util.Properties;
public class SimpleProducer {
【问题讨论】:
-
您应该将您的应用程序(及其所有依赖项)预先打包在一个 jar 中,并使用此 jar 构建您的容器...
-
是的,实际上我正在按照您所说的使用“mvn clean package”进行操作,然后我正在构建它“docker build . -t foobar”@Turing85
-
这并不意味着您的 JAR 包含所有声明的依赖项。你需要创建一个 uber jar
-
它适用于 uber jar。谢谢@cricket_007
标签: java docker apache-kafka dockerfile