zipTree unable to overwrite temporary read-only files

Thanks Peter, I will explain it better with a simple example.

Imagine that this is the layout of the project:

src/main/java/HelloWorld.java
lib/zipped_readonly_property_file.zip
build.gradle

where the file “lib/zipped_readonly_property_file.zip” is a zip/jar/whatever compressed archive including a readonly file (in the example, it contains simply a HelloWorld.properties file) and that at least one of the file inside the zip is a read only file.

This is the build.gradle:

apply plugin: "java"
  dependencies {
 runtime files("lib/zipped_readonly_property_file.zip")
}
  task fatJar(type: Jar) {
 from {
   configurations.runtime.filter {
   it.path.matches(".*")
  }.collect {
   zipTree(it)
  }
 }
 from sourceSets.main.output
 classifier = 'fatJar'
}

Now, if you run “gradle fatJar”, gradle will expand the zip file in a temporary folder, and then compress it into the fat jar. Fine, it works as expected. This is the command output:

:compileJava
:processResources UP-TO-DATE
:classes
:fatJar
  BUILD SUCCESSFUL

Now, for a second time, try to run “gradle fatJar”. This time the zip file will be expanded again OVER the previously extracted folder, but since the property file was read-only, gradle will fail complaining that:

:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:fatJar
  FAILURE: Build failed with an exception.
  * What went wrong:
Could not expand ZIP '/home/larzeni/.eclipseWorkspace/gradleReadOnlyTest/lib/zipped_readonly_property_file.zip'.
  * Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
  BUILD FAILED

And if you go through using --debug option, the problem cause can be traced to:

org.gradle.api.GradleException: Could not copy zip entry /home/larzeni/.eclipseWorkspace/gradleReadOnlyTest/lib/zipped_readonly_property_file.zip!HelloWorld.properties to '/home/larzeni/.eclipseWorkspace/gradleReadOnlyTest/build/tmp/expandedArchives/zipped_readonly_property_file.zip_67dpdot7v9plqhjmhvtlkg3gjd/HelloWorld.properties'

That is, gradle cannot overwrite a zip that includes a read-only file. Obviously if you run gradle clean , the tmp/zip-expanded directory will be removed and the build will work fine again.

Possible solutions coud be: A) do not re-expand a zipped file which was already expanded if it’s not changed or, B) delete the temporary dir that contains the expanded zip after the build.

I hope now the problem is more understandable.

If you want, I’ve put the files for the example at the following link: https://www.box.com/s/sb5obht20jhmgjg7c1t5

Thanks for your help!