Gradle插件外部依赖管理及fat/uber-jar打包异常问题求助
问题1:Fat Jar方案修复
你遇到两个场景的错误核心是3个配置问题:
zip64 = true是Jar任务的全局配置,不能放在from闭包内部,放在内部会打断Gradle对打包资源的解析逻辑,导致资源漏打或者顺序异常- 打Fat Jar时未排除依赖包中META-INF目录下的签名文件、清单文件,这些文件会导致Gradle类加载器校验失败,即使类存在也无法加载
- 打包资源顺序错误导致自定义插件的注册配置被依赖包中的同名文件覆盖
修复后的Jar任务配置如下:
jar { // zip64配置移到from闭包外,属于Jar任务顶层配置 zip64 = true from { // 先加入依赖项资源 configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } // 后加入插件自身源码输出,同名资源优先用自身的,保证插件注册配置不被覆盖 from sourceSets.main.output // 排除所有会干扰类加载的元信息文件 exclude 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/MANIFEST.MF', 'META-INF/LICENSE', 'META-INF/NOTICE' baseName = 'myCustomPlugin' version = '1.0' destinationDir = new File(project.libDir) }
问题2:非Fat Jar方案的消费方配置
如果不打Fat Jar,你需要先把插件自身Jar、installlib、tools的Jar都放到flatDir指定的lib目录下,然后在消费方的buildscript依赖中一次性声明所有相关依赖即可,Gradle的构建脚本类加载器会自动加载所有classpath下的Jar资源,示例配置如下:
buildscript { repositories { flatDir name: 'libs', dirs: System.env.CODESOURCE + '/lib/' } dependencies { // 按实际Jar文件名调整版本号,flatDir下坐标格式为`:制品名:版本号` classpath ':myCustomPlugin:1.0' classpath ':installlib:1.0' classpath ':tools:1.0' // 如果还有其他第三方依赖,也一并在此声明 } }
内容的提问来源于stack exchange,提问作者palkarrohan
相关产品推荐
相关产品推荐

