Maven打包Jar含Class-Path仍无法解析依赖类问题
解决Maven打包后运行Jar抛出NoClassDefFoundError的问题
问题原因
你当前采用依赖与代码分离的打包方式:自身代码打包为donkey-1.0.jar,第三方依赖通过maven-dependency-plugin复制到target/lib目录,maven-jar-plugin在MANIFEST.MF中添加了Class-Path条目指向这些依赖。但运行时找不到org.neo4j.driver.AuthTokens类,大概率是以下原因:
- 运行命令的目录不是Jar所在的
target目录,导致JVM无法根据相对路径找到lib下的依赖 maven-dependency-plugin配置有误,未将依赖正确复制到target/libmaven-jar-plugin的classpathPrefix配置错误,导致Class-Path路径与实际依赖位置不匹配
解决方案
方案一:修复分离依赖的运行与配置
在正确目录下运行Jar
切换到Jar所在的target目录再执行命令:cd target java -jar donkey-1.0.jar检查并修正
maven-dependency-plugin配置
确保插件在package阶段将依赖复制到target/lib:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> <overWriteIfNewer>true</overWriteIfNewer> </configuration> </execution> </executions> </plugin>修正
maven-jar-plugin的Class-Path前缀
必须指定classpathPrefix为lib/,保证MANIFEST.MF中的依赖路径与target/lib对应:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>你的主类全限定名</mainClass> </manifest> </archive> </configuration> </plugin>
方案二:打包可执行Fat Jar(推荐)
分离依赖的方式容易出现路径问题,更稳妥的是用maven-shade-plugin将所有依赖打包到同一个Jar中:
添加shade插件配置
在pom.xml的<build><plugins>中加入:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>你的主类全限定名</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin>打包并运行
执行mvn clean install后,target目录会生成带-shaded后缀的Jar(或覆盖原Jar),直接运行即可:java -jar target/donkey-1.0-shaded.jar
额外检查点
确认pom.xml中已正确引入neo4j-java-driver依赖,且scope为compile(默认无需手动指定):
<dependency> <groupId>org.neo4j.driver</groupId> <artifactId>neo4j-java-driver</artifactId> <version>你的依赖版本号</version> </dependency>
内容的提问来源于stack exchange,提问作者omega royal
相关产品推荐
相关产品推荐

