Gradle打包:如何在jar.from中排除文件?解决LICENSE.txt重复异常
解决Gradle打包时重复LICENSE.txt的冲突问题
这个问题我之前也碰到过——直接在jar任务里加全局exclude有时候不会生效,因为你是把整个依赖的zipTree直接导入,这时候需要在处理每个依赖的zipTree时就排除重复文件,而不是在任务层面做全局排除。
你可以修改collect里的逻辑,在创建zipTree的时候就通过exclude去掉LICENSE.txt:
jar { from configurations.embed.collect { dep -> if (dep.isDirectory()) { dep } else { zipTree(dep).exclude("LICENSE.txt") } } }
这样处理的话,每个依赖的zipTree在被加入到最终jar包之前,就已经移除了LICENSE.txt文件,自然不会出现重复条目冲突。
如果上面的方法还是有问题(比如某些依赖的LICENSE.txt在子目录下),你可以用通配符匹配所有路径下的LICENSE.txt:
jar { from configurations.embed.collect { dep -> dep.isDirectory() ? dep : zipTree(dep).exclude("**/LICENSE.txt") } }
另外,如果你不想完全排除LICENSE文件,而是想保留其中一份,也可以通过配置duplicatesStrategy让Gradle自动处理重复文件,比如保留第一个遇到的版本:
jar { duplicatesStrategy = DuplicatesStrategy.INCLUDE // 可选值还有EXCLUDE、RENAME from configurations.embed.collect { it.isDirectory() ? it : zipTree(it) } }
不过通常直接排除重复文件是最直接解决冲突的方式,推荐第一种方案。
内容的提问来源于stack exchange,提问作者user1779715
相关产品推荐
相关产品推荐

