Elasticsearch Java客户端运行报错:NoClassDefFoundError: JsonpMapper
问题原因
你碰到的NoClassDefFoundError是因为Maven默认package命令生成的JAR包不包含项目依赖的第三方类库。Eclipse运行时会自动把所有依赖的JAR加入类路径,所以能正常执行;但用java -cp直接运行自己的JAR时,JVM找不到Elasticsearch客户端相关的类(比如JsonpMapper)。
解决方案
方案1:构建包含所有依赖的Fat JAR(推荐)
用Maven Assembly插件打包,把项目代码和所有依赖合并到一个JAR里:
- 在
pom.xml的<build><plugins>节点中添加以下插件配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <!-- 指定你的主类全路径 --> <mainClass>es.App</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
- 执行打包命令:
mvn clean package
- 打包完成后,
target目录下会生成两个JAR:一个是普通JAR,另一个是带-jar-with-dependencies后缀的Fat JAR。运行这个Fat JAR:
java -jar target/你的项目名-1.0-SNAPSHOT-jar-with-dependencies.jar
方案2:手动指定依赖类路径
如果不想打包Fat JAR,可先把所有依赖复制到指定目录,再在运行时手动包含:
- 执行Maven命令复制所有依赖到
target/lib目录:
mvn dependency:copy-dependencies -DoutputDirectory=target/lib
- 运行项目时,把自己的JAR和lib目录下所有依赖加入类路径:
# Linux/Mac系统用冒号分隔 java -cp "target/你的项目名-1.0-SNAPSHOT.jar:target/lib/*" es.App # Windows系统用分号分隔 java -cp "target/你的项目名-1.0-SNAPSHOT.jar;target/lib/*" es.App
额外检查
确保pom.xml里已正确引入Elasticsearch Java客户端及必要依赖:
<dependencies> <dependency> <groupId>co.elastic.clients</groupId> <artifactId>elasticsearch-java</artifactId> <version>7.17.9</version> </dependency> <!-- 客户端依赖Jackson处理JSON --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.4.2</version> </dependency> <!-- 7.x版本客户端需要Jakarta JSON API --> <dependency> <groupId>jakarta.json</groupId> <artifactId>jakarta.json-api</artifactId> <version>2.0.1</version> </dependency> </dependencies>
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

