槐序二十四 2024-04-07 21:59 采纳率: 0%
浏览 15
已结题

关于JEECGBOOT项目传统打包可能存在的问题之英雄帖!(语言-java)

遇到的问题:

今天在线上系统突然发现了一个bug,jeecg-boot项目在部门板块新增部门的时候,发现无法新增部门。以为是代码发版问题,就重发了一次版本,发现还是不行,本地却可以。然后以为是本地库与线上库数据不同步,然后连生产库,发现还是不行。
然后就一点点排查,最后就只能怀疑是传统打包方式的问题了。

可能的原因:

我看了一下部门新增规则,他是需要生成一个编码,用来给机构编码赋值。

类似如下:

img

代码如下:


@Slf4j
public class FillRuleUtil {

    /**
     * @param ruleCode ruleCode
     * @return
     */
    @SuppressWarnings("unchecked")
    public static Object executeRule(String ruleCode, JSONObject formData) {
        if (!StringUtils.isEmpty(ruleCode)) {
            try {
                // 获取 Service
                ServiceImpl impl = (ServiceImpl) SpringContextUtils.getBean("sysFillRuleServiceImpl");
                // 根据 ruleCode 查询出实体
                QueryWrapper queryWrapper = new QueryWrapper();
                queryWrapper.eq("rule_code", ruleCode);
                JSONObject entity = JSON.parseObject(JSON.toJSONString(impl.getOne(queryWrapper)));
                if (entity == null) {
                    log.warn("填值规则:" + ruleCode + " 不存在");
                    return null;
                }
                // 获取必要的参数
                String ruleClass = entity.getString("ruleClass");
                JSONObject params = entity.getJSONObject("ruleParams");
                if (params == null) {
                    params = new JSONObject();
                }
                if (formData == null) {
                    formData = new JSONObject();
                }
                // 通过反射执行配置的类里的方法
                IFillRuleHandler ruleHandler = (IFillRuleHandler) Class.forName(ruleClass).newInstance();
                return ruleHandler.execute(params, formData);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}

代码解释(个人理解):

这段代码中,是通过反射来执行特定的填值规则。
首先,它检查传入的ruleCode是否为空。如果不为空,代码尝试从Spring上下文中获取名为sysFillRuleServiceImpl的服务实例,并使用这个服务来查询与ruleCode相匹配的规则实体。
获取到的规则实体中包含了要执行的类名ruleClass和参数params。
最后,通过反射创建ruleClass指定的类的实例,并调用其execute方法,传入参数执行特定逻辑。
这是一个动态根据规则代码执行不同逻辑的示例。

他查询的表在sysFillRuleServiceImpl中有指向:sys_fill_rule

表内容如下:

img

说白了:就是通过反射来找到对应的类或者资源来执行特定的逻辑

很好,咱们接着说

开始尝试修改

我原本是通过传统打包方式,也就是将依赖放在/lib目录下的jar包,外面一个主干jar包,然后启动jar包,需要指向依赖的目录,这样。
目的就是方便上线嘛~传输的包小,速度快
然后我修改为Fat JAR打包方式,也就是将所有依赖都打成一个包。然后发版。

成功!?

总结:

传统打包方式可能在处理类路径上有所不同,导致反射时可能找不到正确的类或资源。而Fat JAR将所有必需的依赖和资源都打包在一个JAR中,这样就保证了运行时类路径的一致性,使得反射相关的代码能够正常工作。这可能是!为什么切换到Fat JAR打包方式后你的问题得到了解决的原因了

但是!

我还是不懂,是哪里的问题,特!发布英雄帖,集思广益。
上述如有描述不对,还请海涵。

  • 写回答

21条回答 默认 最新

  • Kwan的解忧杂货铺 Java领域优质创作者 2024-04-07 22:00
    关注
    获得0.45元问题酬金

    晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    问题分析:

    1. 项目在线上新增部门时出现无法新增部门的bug。
    2. 经过检查发现代码没有问题,本地可以正常新增部门。
    3. 怀疑是传统打包方式造成的问题。

    可能的原因分析:

    • 传统打包方式可能导致类路径不一致,影响了反射找到正确的类或资源。

    解决方案:

    1. 确认类路径是否一致:传统打包方式和Fat JAR打包方式的类路径不同,可能会影响反射调用的类或资源位置。需要确认类路径的一致性。
    2. 切换到Fat JAR打包方式:由于Fat JAR可以将所有依赖和资源都打包在一个JAR中,保证了运行时类路径的一致性,所以可以尝试切换到Fat JAR打包方式来解决问题。

    修改后的正确代码:

    // 无需修改代码,只需切换打包方式
    

    综上所述,根据问题描述和代码逻辑,最可能的问题是传统打包方式造成的类路径不一致,影响了反射调用。解决方案是切换到Fat JAR打包方式,确保类路径的一致性。希望以上解决方案对解决问题有所帮助。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 4月15日
  • 创建了问题 4月7日

悬赏问题

  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算
  • ¥15 powerbuilder中的datawindow数据整合到新的DataWindow
  • ¥20 有人知道这种图怎么画吗?
  • ¥15 pyqt6如何引用qrc文件加载里面的的资源
  • ¥15 安卓JNI项目使用lua上的问题
  • ¥20 RL+GNN解决人员排班问题时梯度消失
  • ¥60 要数控稳压电源测试数据
  • ¥15 能帮我写下这个编程吗
  • ¥15 ikuai客户端l2tp协议链接报终止15信号和无法将p.p.p6转换为我的l2tp线路