I am building a java application with Gradle and I want to transfer the final jar file in another folder. I want to copy the file on each build
and delete the file on each clean
.
Unfortunately, I can do only one of the tasks and not both. When I have the task copyJar
activated, it successfully copies the JAR. When I include the clean
task, the JAR is not copied and if there is a file there it is deleted. It is as if there is some task that calls clean
.
Any solutions?
plugins {
id 'java'
id 'base'
id 'com.github.johnrengelman.shadow' version '2.0.2'
}
dependencies {
compile project(":core")
compile project("fs-api-reader")
compile project(":common")
}
task copyJar(type: Copy) {
copy {
from "build/libs/${rootProject.name}.jar"
into "myApp-app"
}
}
clean {
file("myApp-app/${rootProject.name}.jar").delete()
}
copyJar.dependsOn(build)
allprojects {
apply plugin: 'java'
apply plugin: 'base'
repositories {
mavenCentral()
}
dependencies {
testCompile 'junit:junit:4.12'
compile 'org.slf4j:slf4j-api:1.7.12'
testCompile group: 'ch.qos.logback', name: 'logback-classic', version: '0.9.26'
}
sourceSets {
test {
java.srcDir 'src/test/java'
}
integration {
java.srcDir 'src/test/integration/java'
resources.srcDir 'src/test/resources'
compileClasspath += main.output + test.output
runtimeClasspath += main.output + test.output
}
}
configurations {
integrationCompile.extendsFrom testCompile
integrationRuntime.extendsFrom testRuntime
}
task integration(type: Test, description: 'Runs the integration tests.', group: 'Verification') {
testClassesDirs = sourceSets.integration.output.classesDirs
classpath = sourceSets.integration.runtimeClasspath
}
test {
reports.html.enabled = true
}
clean {
file('out').deleteDir()
}
}
clean {
file("myApp-app/${rootProject.name}.jar").delete()
}
This will delete the file on evaluation every time, which is not what you want. Change it to:
clean {
delete "myApp-app/${rootProject.name}.jar"
}
This configures the clean task and adds the JAR to be deleted on execution.
@nickb is right about the clean
task, but you also need to fix your copyJar
task. The copy { ... }
method is called during configuration phase, so everytime gradle is invoked. Simple remove the method and use the configuration methods of the Copy
task type:
task copyJar(type: Copy) {
from "build/libs/${rootProject.name}.jar"
into "myApp-app"
}
The same problem applies for the clean
task in the allprojects
closure. Simply replace file('out').deleteDir()
with delete 'out'
. Check out more information about the difference between configuration phase and execution phase in the documentation.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With