Gradle生成独立运行包时出现Can’t 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)
   }
}

 

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注