解决Maven生成含MongoDB依赖的可执行JAR运行类找不到错误
解决Maven生成可执行Fat Jar(包含依赖)的问题
你遇到的问题很典型:用maven-jar-plugin生成的Jar只包含你自己项目的代码,所有第三方依赖(比如MongoDB驱动、AWS SDK等)都没有被打包进去,所以运行时JVM找不到这些依赖类,就会抛出NoClassDefFoundError/ClassNotFoundException。
下面分步骤教你在Eclipse中用Maven生成包含所有依赖的可执行Fat Jar:
一、修改你的pom.xml文件
推荐使用maven-shade-plugin(它比maven-assembly-plugin更灵活,能处理依赖冲突、重命名类等场景),替换或补充原有的build插件配置:
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.function.thumbnail</groupId> <artifactId>Thumbnail</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>Thumbnail</name> <url>http://maven.apache.org</url> <dependencies> <!-- 你的所有依赖保持不变 --> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>3.2.2</version> </dependency> <dependency> <groupId>com.googlecode.json-simple</groupId> <artifactId>json-simple</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>org.imgscalr</groupId> <artifactId>imgscalr-lib</artifactId> <version>4.2</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk</artifactId> <version>1.9.2</version> </dependency> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.9.9</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-io</artifactId> <version>1.3.2</version> </dependency> </dependencies> <build> <finalName>ThumbnailGenerator</finalName> <!-- 建议改成和项目相关的名称,原dateutils不太匹配 --> <plugins> <!-- 配置Shade插件,打包所有依赖到Fat Jar --> <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> <!-- 指定主类,让Jar可以直接执行 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.function.thumbnail.ThumbnailGenarationStandAloneFunctionality</mainClass> </transformer> <!-- 处理服务文件(比如JDBC驱动、MongoDB的SPI等),避免覆盖 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> </transformers> <!-- 可选:如果有依赖冲突,可以在这里排除或重命名类 --> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
二、在Eclipse中执行打包操作
- 右键你的Maven项目 → 选择Run As → Maven clean:先清理之前生成的旧Jar文件和编译产物。
- 再次右键项目 → Run As → Maven package:执行打包命令,Shade插件会自动把所有依赖打包到Fat Jar里。
- 打包完成后,Jar文件会生成在项目的
target目录下,名称就是你在<finalName>里指定的ThumbnailGenerator.jar。
三、验证运行
打开命令行,切换到target目录,执行:
java -jar ThumbnailGenerator.jar
这次应该能正常运行,不会再出现依赖类找不到的错误。
补充说明
如果你更习惯用maven-assembly-plugin,也可以用下面的配置替换Shade插件:
<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>com.function.thumbnail.ThumbnailGenarationStandAloneFunctionality</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
不过Shade插件在处理复杂依赖(比如有重复类、SPI服务文件的场景)时表现更稳定,所以优先推荐它。
内容的提问来源于stack exchange,提问作者newbie
相关产品推荐
相关产品推荐

