You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 17:37:01