2015-06-04 12 views
8

Próbuję zbudować słoik, a następnie skopiować go do innego folderu.gradle - kopiowanie pliku po jego wygenerowaniu

task createJar(type: Jar) { 
    archiveName = "GradleJarProject.jar" 
    manifest { 
     attributes 'Implementation-Title': 'Gradle Jar File Example', 
      'Implementation-Version': version, 
      'Main-Class': 'me.test.Test' 
    } 
    baseName = project.name 
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } 
    with jar 

} 

task copyJarToBin { 
    copy { 
     from 'build/libs/GradleJarProject.jar' 
     into "d:/tmp" 
    } 
} 

task buildApp (dependsOn: [clean, createJar, copyJarToBin]) 

Ale nie mogę wymyślić jednego problemu. zadanie copyJarToBin spróbuj skopiować stary słoik. Jeśli usunę/skompiluję folder w projekcie i uruchomię zadanie buildApp(), zadanie createJar() wygeneruje plik .jar, ale funkcja copyJarToBin() nie znajdzie tego pliku .jar.

Czy możesz mi pomóc?
Dzięki.

Odpowiedz

34

Winowajcą jest zadanie copyJarToBin. kiedy robi

task copyJarToBin { 
    copy { 
     from 'build/libs/GradleJarProject.jar' 
     into "d:/tmp" 
    } 
} 

kopiowania słoik w czasie konfiguracji za pomocą metody copy. (zapoznaj się z instrukcją użytkownika gradle pod numerem https://docs.gradle.org/current/userguide/userguide_single.html#sec:build_phases, aby poznać cykl życia kompilacji). Chcesz uruchomić faktyczną operację kopiowania podczas fazy wykonywania (wykonanie zadania).

Jednym ze sposobów rozwiązania jest to, aby przenieść połączenie metody copy w bloku doLast:

task copyJarToBin { 
    doLast { 
     copy { 
      from 'build/libs/GradleJarProject.jar' 
      into "d:/tmp" 
     } 

    } 
} 

Problem z tego podejścia jest to, że nie będą korzystać z gradles bieżących funkcji kompilacji i skopiować że plik za każdym razem, gdy wykonasz zadanie, nawet jeśli plik się nie zmienił.

lepszego i bardziej idionmatic sposób pisania zadanie copyJarToBin to zmienić za realizację celu użyć typu Copy zadanie:

task copyJarToBin(type: Copy) { 
    from 'build/libs/GradleJarProject.jar' 
    into "d:/tmp" 
} 

Możemy nawet poprawić ten fragment, korzystając z funkcji autowiring Gradle użytkownika. Możesz zadeklarować wyjście jednego zadania jako wejście do innego. Więc zamiast pisać `build/libs/GradleJarProject.jar” można po prostu zrobić:

task copyJarToBin(type: Copy) { 
    from createJar // shortcut for createJar.outputs.files 
    into "d:/tmp" 
} 

Teraz nie trzeba się martwić o zamawianiu zadaniem jako Gradle wiedzieć, że zadanie createJar musi być wykonana przed zadaniem copyJarToBin można wykonać.

+0

Bardzo dziękuję za pomoc. – wazz

1

Prawdopodobnie trzeba upewnić się, że są prowadzone we właściwej kolejności,

task copyJarToBin(type:Copy,dependsOn:[createJar]) { 
    copy { 
    from "${buildDir}/GradleJarProject.jar" // needs to be gstring  
    into "d:/tmp" 
    } 
} 
+0

za pomocą zadania Kopiuj jest właściwym kierunkiem, ale musisz pozbyć się metody "kopiuj", aby uniknąć wykonania operacji kopiowania podczas fazy realizacji –

+0

@ Theresa Forster masz rację. Metoda copyJarToBin() została wywołana przed createJar(). Będę używał funkcji mustRunAfter. Dzięki. – wazz

7

myślę, że powyższa odpowiedź jest jakiś stary. Oto odpowiedź na pytanie: 3.3

jar { 
    baseName = 'my-app-name' 
    version = '0.0.1' 
} 

task copyJar(type: Copy) { 
    from jar // here it automatically reads jar file produced from jar task 
    into 'destination-folder' 
} 

build.dependsOn copyJar 
Powiązane problemy