Makefile中gson.jar类路径仅生效一次,多Java文件调用Gson报错求助
问题描述
我正在使用如下Makefile:
JFLAGS = -g -cp lib/gson.jar:. JAVA = java Default: logappend.jar logread.jar logappend.jar: LogAppend.class jar -cvmf MANIFEST_LA.MF logappend.jar l_append/LogAppend.class cat stub.sh logappend.jar > logappend && chmod +x logappend LogAppend.class: l_append/LogAppend.java $(JC) $(JFLAGS) l_append/LogAppend.java logread.jar: LogRead.class jar -cvmf MANIFEST_LR.MF logread.jar l_read/LogRead.class cat stub.sh logread.jar > logread && chmod +x logread LogRead.class: l_read/LogRead.java $(JC) $(JFLAGS) l_read/LogRead.java clean: rm -f l_append/LogAppend.class l_read/LogRead.class logappend.jar logappend logread.jar logread
我的MANIFEST_LA.MF文件内容如下:
Main-Class: l_append.LogAppend Class-Path: lib/gson.jar
我的stub.sh文件内容如下:
#!/bin/sh MYSELF=`which "$0" 2>/dev/null` [ $? -gt 0 -a -f "$0" ] && MYSELF="./$0" java=java if test -n "$JAVA_HOME"; then java="$JAVA_HOME/bin/java" fi exec "$java" $java_args -jar $MYSELF "$@" exit 1
我可以在LogAppend中正常调用Gson,但在LogRead中调用时却收到如下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: com/google/gson/Gson at l_read.LogRead.msg(LogRead.java:10) at l_read.LogRead.main(LogRead.java:6) Caused by: java.lang.ClassNotFoundException: com.google.gson.Gson at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) ... 2 more
我已经尝试了多种方法但都无效,有人能提供帮助或新的解决思路吗?提前感谢!
解决思路与方案
1. 补全MANIFEST_LR.MF配置
你只提供了LogAppend对应的Manifest文件,但logread.jar使用的是MANIFEST_LR.MF,这是核心问题所在。该文件大概率缺少Gson的类路径配置,或者主类声明错误。
创建/修改MANIFEST_LR.MF,内容如下:
Main-Class: l_read.LogRead Class-Path: lib/gson.jar
注意:Manifest文件的最后一行必须是空行,否则JVM无法识别最后一行的配置项。
2. 修复Makefile未定义的JC变量
你的Makefile中使用了$(JC)编译Java文件,但未声明该变量,添加JC = javac即可:
JFLAGS = -g -cp lib/gson.jar:. JAVA = java JC = javac # 新增该行定义Java编译器 Default: logappend.jar logread.jar # 其余内容保持不变
3. 优化stub.sh的变量初始化
当前脚本中$java_args未初始化,可能导致潜在的参数解析问题,显式初始化变量:
#!/bin/sh MYSELF=`which "$0" 2>/dev/null` [ $? -gt 0 -a -f "$0" ] && MYSELF="./$0" java=java java_args="" # 显式初始化空参数变量 if test -n "$JAVA_HOME"; then java="$JAVA_HOME/bin/java" fi exec "$java" $java_args -jar "$MYSELF" "$@" exit 1
4. 验证编译打包流程
- 执行
make clean && make完全清理旧文件后重新编译打包,避免残留文件干扰。 - 确认
lib/gson.jar存在于当前工作目录的lib子目录下,路径和文件名区分大小写。 - 检查
logread脚本的可执行权限,确保chmod +x logread命令生效。
5. 直接测试jar包运行
跳过stub脚本,用原生Java命令运行logread.jar,排查是否是脚本的问题:
java -jar logread.jar
如果该命令正常运行,说明stub脚本存在路径解析问题;如果同样报错,继续排查Manifest配置或编译过程。
内容的提问来源于stack exchange,提问作者24Doggi
相关产品推荐
相关产品推荐

