如何更新Gradle依赖drools-compiler中的指定.class文件并运行Java应用
KieServicesImpl类并运行Java应用的方案 嘿,我来帮你搞定这个问题!要替换Gradle依赖里的org.drools.compiler.kie.builder.impl.KieServicesImpl类并正常运行你的Java应用,你可以按下面两种方案来操作——临时快速修改或者长期规范修改都有:
方案一:临时替换JAR包中的类(快速验证用)
如果只是临时测试修改后的效果,不想折腾源码,这个方案最适合:
找到本地Gradle仓库里的
drools-compilerJAR包
Gradle会把下载的依赖存在本地仓库,路径一般是~/.gradle/caches/modules-2/files-2.1/org.drools/drools-compiler/7.0.0.Final/[一串哈希值]/drools-compiler-7.0.0.Final.jar。你也可以在IDE里找到这个依赖,右键选「Show in Explorer/Finder」直接打开所在文件夹,或者用命令./gradlew dependencies查看依赖的具体位置。解压JAR包到临时文件夹
用解压工具或者命令行把JAR包解压到一个临时目录,比如:unzip drools-compiler-7.0.0.Final.jar -d temp-drools-compiler替换目标类文件
在解压后的文件夹里找到路径org/drools/compiler/kie/builder/impl/,把你修改好并编译完成的KieServicesImpl.class文件替换掉原来的文件——一定要保证包路径、类名完全和原文件一致,不然运行时会找不到类。重新打包成JAR
回到临时文件夹的上级目录,用命令重新打包:jar cvf drools-compiler-7.0.0.Final-modified.jar -C temp-drools-compiler/ .在你的项目中使用修改后的JAR
把新打包的JAR放到项目的libs目录下,然后修改build.gradle的依赖配置:dependencies { // 先排除原来的drools-compiler依赖 implementation('org.drools:drools-compiler:7.0.0.Final') { exclude group: 'org.drools', module: 'drools-compiler' } // 引入本地修改后的JAR implementation files('libs/drools-compiler-7.0.0.Final-modified.jar') }(注:如果用的是旧版Gradle,把
implementation换成compile就行)
方案二:基于Drools源码修改构建(长期维护用)
如果你的修改需要长期保留或者团队协作使用,推荐直接修改Drools源码并构建自定义依赖:
获取对应版本的Drools源码
找到Drools官方仓库的7.0.0.Final版本源码,克隆到本地(可以通过标签切换到对应版本)。修改
KieServicesImpl类
在源码的drools-compiler模块里找到org.drools.compiler.kie.builder.impl.KieServicesImpl.java文件,完成你的修改。构建自定义的
drools-compilerJAR
进入Drools项目根目录,用Gradle命令构建该模块:./gradlew :drools-compiler:build构建完成后,修改后的JAR会生成在
drools-compiler/build/libs/目录下。引入自定义依赖到你的项目
有两种方式:- 把构建好的JAR放到项目
libs目录,用方案一的files方式引入; - 发布到本地Maven仓库,方便复用:
然后在你的项目./gradlew :drools-compiler:publishToMavenLocalbuild.gradle中引用:dependencies { // 排除原依赖(如果修改了版本号的话) implementation('org.drools:drools-compiler:7.0.0.Final') { exclude group: 'org.drools', module: 'drools-compiler' } // 引用本地发布的自定义依赖(如果改了版本号就用新的) implementation 'org.drools:drools-compiler:7.0.0.Final-custom' }
- 把构建好的JAR放到项目
重要注意事项
- 兼容性第一:修改后的
KieServicesImpl必须和原类的方法签名、字段定义完全兼容,不然你的应用运行时会出现NoSuchMethodError、IllegalAccessError这类异常。 - 团队协作建议:如果是多人开发的项目,方案二更合适,最好把修改后的源码维护在团队私有仓库,方便大家同步。
- 清理缓存:运行应用前,记得执行
./gradlew clean build清理旧的依赖缓存,确保用的是修改后的类。
内容的提问来源于stack exchange,提问作者Soniya Abaraham

