2017-05-03 3 views
0

J'ai une tâche ShadowJar et une Proguard qui produisent deux fichiers jar dans ma compilation Gradle.Comment référencer le fichier de sortie d'une autre tâche Gradle en tant que ziptree?

task obfuscate(type: ProguardTask) { 
    outjars .. 
} 

shadowJar { 
    ... 
} 

task release(type: Jar) { 
    from shadowJar 
    from obfuscate 
    classifier 'all' 
} 

Mon problème est que dans ce cas, le fichier jar de presse contient le pot d'ombre et les fichiers jar brouillées que deux fichiers dans le pot lui-même. Je voudrais les faire en tant qu'entrées zipTree.

Mon problème est que je ne sais pas comment transformer la référence de la tâche en un zipTree de la sortie réelle de cette tâche.

Mes tentatives me conduisent à from zipTree(shadowJar.outputs.getFiles()) mais cela échoue encore:

> Cannot convert the provided notation to a File or URI: task 'shadowJar' output files. 
    The following types/formats are supported: 
    - A String or CharSequence path, for example 'src/main/java' or '/usr/include'. 
    - A String or CharSequence URI, for example 'file:/usr/include'. 
    - A File instance. 
    - A URI or URL instance. 

Comment puis-je consulter le fichier jar de sortie des tâches précédentes correctement?

Répondre

1

Gradle docs sur zipTree:

crée une nouvelle FileTree qui contient le contenu du fichier ZIP donné. Le chemin zipPath donné est évalué selon Project.file (java.lang.Object).

cet effet, zipTree ne peut traiter que des fichiers individuels, mais outputs.files fournit une collection de fichiers. Cela révèle deux options:

Vous pouvez assumer la tâche de fournir une collection de fichiers contenant un seul fichier. Dans ce cas, vous pouvez simplement prendre votre approche et utiliser la méthode getSingleFile:

from zipTree(shadowJar.outputs.files.singleFile) 

Tant que vous utilisez une tâche de type Jar, cela ne devrait pas poser de problème, car toute tâche de ce type ne créer un fichier jar. Mais si vous utilisez d'autres types de tâche, qui peuvent avoir plusieurs fichiers de sortie (par exemple, des tâches personnalisées), la méthode getSingleFile échouera.

La deuxième approche consiste à itérer sur chaque fichier de sortie, décompressez-le et ajoutez le contenu révélé via from:

shadowJar.outputs.files.each { outFile -> 
    from zipTree(outFile) 
} 

Je ne suis pas tout à fait sûr si les travaux suivants, mais peut-être son un plus Gradle- solution de style:

from shadowJar.outputs.files.collect{ zipTree(it) } 
+0

Merci beaucoup. Cela semble être mieux, mais maintenant je ne peux pas trouver la méthode zipTree() pour les arguments [foo/bar/myjar-2017.05.05-all.jar, build_5mt3ethz91ji36qb1vfayplhl $ _run_cl osure12 $ _closure31 @ 28108b8] sur la tâche ': libération' de tapez org.gradle.api.tasks.bundling.Jar. – jabal

+0

Donc, zipTree semble recevoir le nom de fichier de sortie ombre jar – jabal

+0

Je suis un peu confus, car il semble que la méthode 'zipTree' reçoit à la fois une chaîne et une fermeture. Quel exemple avez-vous essayé? –