Keuin's

使用Gradle构建.jar插件时的依赖配置问题:build.gradle

最近在写一些fabric插件,如果插件中使用到了第三方的library(如数据库等),在build.gradledependencies节中增加implementation项后,可以通过编译,且在IDE中调试时也可以正常运行,但是将build得到的.jar文件放到实际的生产环境中却无法使用,会抛出NoClassDefFoundError异常,异常的后缀Error表明这不是一个代码错误,是一个配置上的错误。

这个错误发生的原因是:在调试环境下(IDE内),引用的第三方library是存在于debug classpath内的(参考这篇文章),而在运行时,由于被引用的第三方library没有被包含到生产环境中,所以会出现问题。常规java项目只需要将此library放到我们的classpath里,或者导出时使用shadow等方式将依赖一起打包到.jar文件中,得到所谓的fat jar。由于我们是要写fabric插件,让服务器管理员手动配置classpath显然是不方便的,所以采用第二种方法。

通过参考其他配置文件,我使用这样的解决方法:在dependencies节中增加对应的include项,值与implementation相同,这一项会指示Gradle将该库一起打包到输出的jar中。这样一来,我们执行gradlew build就可以生成一个像其他插件一样可以直接使用的.jar文件了。