2017-05-03 9 views
0

내 Gradle 빌드에 두 개의 jar 파일을 생성하는 ShadowJar 및 Proguard 작업이 있습니다.다른 Gradle 작업의 출력 파일을 ziptree로 참조하는 방법은 무엇입니까?

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

shadowJar { 
    ... 
} 

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

내 문제는이 경우 릴리스 jar 파일이 그림자 항아리와 병 자체에 두 개의 파일로 난독 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는 파일 모음을 제공합니다. 그러면 두 가지 옵션이 나타납니다.

하나의 파일 만 포함하는 파일 수집을 제공한다고 가정 할 수 있습니다. 이 경우, 당신은 단순히 당신의 접근 방식을하고 getSingleFile 방법을 사용할 수 있습니다 :이 유형의 작업 만 만들 것이기 ​​때문에만큼 당신이 유형 Jar의 작업을 사용할 때

from zipTree(shadowJar.outputs.files.singleFile) 

을, 이것은 문제가 발생하지 않아야 하나의 jar 파일. 하지만 다른 작업 유형 (예 : 맞춤 작업)이 여러 개인 출력 파일을 사용하는 경우 getSingleFile 메서드가 실패합니다.

두 번째 방법은, 각 출력 파일을 반복 압축을 해제하고 from를 통해 계시 된 내용을 추가하는 것입니다

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

내가 아주 확실하지 않다 다음 작품,하지만 어쩌면 그 더욱 Gradle- 경우 스타일 솔루션 :

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

대단히 감사합니다. 이 더 나은 것 같아요,하지만 지금은 얻을 수 없습니다. 메서드 'zipTree() for foo/bar/myjar-2017.05.05-all.jar, build_5mt3ethz91ji36qb1vfayplhl $ _run_cl osure12 $ _closure31 @ 28108b8] org.gradle.api.tasks.bundling.Jar을 입력하십시오. – jabal

+0

그래서 zipTree는 shadow jar 출력 파일 이름을받는 것 같습니다. – jabal

+0

'zipTree' 메서드가 문자열과 클로저를 모두받는 것처럼 보이기 때문에 조금 혼란 스럽습니다. 어떤 예를 시도 했습니까? –