无构建工具项目打包Executable Jar遇NoClassDefFoundError求助
解决未用构建工具的Java项目打包时依赖类缺失问题
方法一:用IntelliJ IDEA打包成包含所有依赖的Fat Jar
这是最省心的方式,直接通过IDE配置完成:
- 打开
File → Project Structure → Artifacts - 点击左上角的
+号,选择JAR → From modules with dependencies - 在弹出的窗口中,选中你的项目主类(Main Class),然后勾选下方的
Extract to the target JAR选项(这个选项会把依赖Jar里的类解压后合并到最终生成的Jar中) - 确认输出路径后点击
OK - 最后点击顶部菜单栏的
Build → Build Artifacts,选择对应的Artifact执行Build,生成的Jar就是包含所有依赖的可执行Jar
方法二:手动合并依赖类到项目Jar
如果不想用IDE的Artifact功能,可以手动操作:
- 先把自己项目编译后的class文件打包成基础Jar(比如命名为
my-project.jar) - 将
jjwt-api.jar、jjwt-impl.jar、jjwt-jackson.jar这三个依赖Jar分别解压,把里面的class文件全部复制到项目class文件的目录结构下(保持包路径一致) - 用jar命令重新打包,命令示例:
jar cvfm my-executable.jar manifest.xml -C 你的class文件目录 . - 注意
manifest.xml里必须指定主类,格式如下:Main-Class: com.yourpackage.YourMainClass
方法三:用jar命令批量合并依赖
和方法二类似,但用命令行批量处理:
- 创建一个临时目录(比如
temp),把项目编译后的所有class文件复制到这个目录里 - 依次执行命令解压每个依赖Jar到临时目录:
jar xf lib/jjwt-api.jar -C temp jar xf lib/jjwt-impl.jar -C temp jar xf lib/jjwt-jackson.jar -C temp - 最后用jar命令打包临时目录里的所有文件:
jar cvfm my-app.jar manifest.xml -C temp .
补充说明
之前你尝试的Class-Path配置没生效,是因为这个配置只是告诉JVM去哪里找外部依赖Jar,要求这些依赖Jar必须和你的可执行Jar放在同一目录(或者配置正确的相对/绝对路径)。如果想把所有依赖类都打包进一个Jar里,就必须用上面的方法将依赖类合并到最终Jar中。
内容的提问来源于stack exchange,提问作者ChrisVintage
相关产品推荐
相关产品推荐

