2017-05-03 5 views
0

私はGradleビルドに2つのjarファイルを生成するShadowJarとProguardタスクを持っています。他のGradleタスクの出力ファイルをziptreeとして参照する方法は?

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

shadowJar { 
    ... 
} 

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

私の問題は、この場合には、リリースのjarファイルは、jarファイル自体に2つのファイルとして影ジャーと難読化されたjarファイルが含まれていることです。私はzipTreeの入力としてこれらを作りたいと思います。

私の問題は、タスク参照をそのタスクの実際の出力のzipTreeに変換する方法がわかりません。

私の試みは、from zipTree(shadowJar.outputs.getFiles())に私を導くが、これはまだ失敗:

> 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. 

にはどうすれば適切に先行するタスクの出力jarファイルを参照することができますか? zipTree

答えて

1

のGradleのドキュメント:

は、指定されたZIPファイルの内容を含む新しいFileTreeを作成します。指定されたzipPathパスは、Project.file(java.lang.Object)ごとに評価されます。

そのため、zipTreeは、単一のファイルを扱うことができますが、outputs.filesは、ファイルのコレクションを提供します。これにより、2つのオプションが明らかになります。

1つのファイルしか含まれていないファイルコレクションを提供することができます。この場合は、単にあなたのアプローチを取るとgetSingleFile方法使用することができます。このタイプの任意のタスクのみを作成しますので、

from zipTree(shadowJar.outputs.files.singleFile) 

限り、あなたはタイプJarのタスクを使用すると、これは、何か問題が発生することはありませんが1つのjarファイル。しかし、複数の出力ファイル(カスタムタスクなど)を持つ他のタスクタイプを使用すると、getSingleFileメソッドが失敗します。

第2のアプローチは、それぞれの出力ファイルを反復それを解凍し、fromを通じて明らかにした内容を追加することです:

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

私はかなりわからない、次の作品、多分そのさらにGradle-場合スタイルソリューション:

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

ありがとう。これはより良いと思われますが、今私はget:メソッド 'zipTree()for the task':release 'の引数[foo/bar/myjar-2017.05.05-all.jar、build_5mt3ethz91ji36qb1vfayplhl $ _run_cl osure12 $ _closure31 @ 28108b8] org.gradle.api.tasks.bundling.Jarと入力します。 – jabal

+0

だから、zipTreeはシャドウジャーの出力ファイル名を受け取るようです。 – jabal

+0

'zipTree'メソッドが文字列とクロージャの両方を受け取っているように思えるので、ちょっと混乱します。どのような例を試しましたか? –

関連する問題