如何用Makefile引入Gson?运行时类找不到异常求助
解决运行LogAppend时的NoClassDefFoundError问题
问题背景
你的文件夹结构:
l_append --LogAppend.java --User.java l_read --LogRead.java makefile gson.jar
Makefile内容:
LIBRARY_PATHS = gson.jar CLASS_FILES = l_append/LogAppend.class l_append/User.class l_read/LogRead.class Default: $(CLASS_FILES) create_bin %.class: %.java $(JC) -cp .:$(LIBRARY_PATHS) $< create_bin: jar -cvmf MANIFEST_LA.MF logappend.jar l_append/LogAppend.class cat stub.sh logappend.jar > logappend && chmod +x logappend jar -cvmf MANIFEST_LR.MF logread.jar l_read/LogRead.class cat stub.sh logread.jar > logread && chmod +x logread clean: $(RM) l_read/*.class l_append/*.class log*
LogAppend.java中引入并使用了Gson:
import com.google.gson.Gson; // ... Gson gson = new Gson();
执行make后运行LogAppend,抛出异常:
Exception in thread "main" java.lang.NoClassDefFoundError: com/google/gson/Gson at l_append.LogAppend.writeToLog(LogAppend.java:165) at l_append.LogAppend.main(LogAppend.java:90) Caused by: java.lang.ClassNotFoundException: com.google.gson.Gson
解决建议
方案1:打包胖Jar(包含依赖)
当前打包只包含了自己的class文件,未引入gson.jar。修改Makefile的create_bin步骤,将gson.jar合并到最终的jar包中:
create_bin: # 打包LogAppend、User类和gson.jar到同一个jar jar -cvmf MANIFEST_LA.MF logappend.jar l_append/LogAppend.class l_append/User.class gson.jar cat stub.sh logappend.jar > logappend && chmod +x logappend jar -cvmf MANIFEST_LR.MF logread.jar l_read/LogRead.class cat stub.sh logread.jar > logread && chmod +x logread
方案2:通过MANIFEST指定类路径
在MANIFEST_LA.MF中添加Class-Path属性,指定gson.jar的位置(运行时需保证gson.jar与logappend在同一目录):
Main-Class: l_append.LogAppend Class-Path: gson.jar
Makefile的打包命令无需修改,JVM会根据MANIFEST中的配置自动加载依赖。
方案3:修改启动脚本指定类路径
调整stub.sh,在启动命令中明确包含gson.jar的类路径:
#!/bin/sh java -cp .:gson.jar l_append.LogAppend "$@"
合并后的logappend执行文件会自动使用该类路径启动程序。
内容的提问来源于stack exchange,提问作者24Doggi
相关产品推荐
相关产品推荐

