Gradle生成独立运行包时出现Can’t Expand ZIP的问题

8 9月

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载自夜明的孤行灯

本文链接地址: https://www.huangyunkun.com/2016/09/08/gradle-uber-jar-cant-expand-zip/

有时候我们需要打包一个可独立运行的jar文件并分发出去,特别是桌面图形化程序。

Gradle要打这种包是很方便的,网上有很多例子,比如以下这个

jar {
  manifest { 
    attributes "Main-Class": "$mainClassName"
  }  

  from {
    configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
  }
}

又或者这样

task fatJar(type: Jar) {
	manifest {
        attributes "Main-Class": "$mainClassName"
    }
    baseName = project.name + '-all'
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
    with jar
}

大部分情况都是可以直接这样解决的,但是我最近遇到一个问题,一直提示Can’t Expand file。

来回头看看Gradle中的这段配置是怎样工作的。configurations.compile.collect包含了编译的所有依赖,然后对于其中的所有依赖,如果是目录就取出文件继续处理,如果是文件就解压,解压以后的东西会合并到最后的jar文件中。

有时候configurations.compile.collect也会替换成configurations.runtime.collect,不过这个不是引起问题的原因。

如果真的是jar,那么应该是可以解压的,但是Gradle中的依赖并没有强制指定为jar,它可以是pom,text等等各种文件。

我这里遇到的问题是依赖中有一个pom文件,自然是不能解压的,那么处理办法就很简单的。如果这种文件很多,那么需要在zipTree前做一个检查,不过我现在的情况很简单,只有一个pom文件,那么直接filter就行了

task fatJar(type: Jar, dependsOn: jar) {
   from configurations.runtime.filter { !it.path.endsWith('.pom') }.asFileTree.files.collect {
      zipTree(it)
   }
}

 

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载自夜明的孤行灯

本文链接地址: https://www.huangyunkun.com/2016/09/08/gradle-uber-jar-cant-expand-zip/

发表评论

邮箱地址不会被公开。