@@ -5,10 +5,12 @@ import org.gradle.api.DefaultTask
5
5
import org.gradle.api.GradleException
6
6
import org.gradle.api.file.ArchiveOperations
7
7
import org.gradle.api.file.ConfigurableFileCollection
8
+ import org.gradle.api.file.RegularFileProperty
8
9
import org.gradle.api.tasks.CacheableTask
9
10
import org.gradle.api.tasks.Classpath
10
- import org.gradle.api.tasks.Input
11
11
import org.gradle.api.tasks.InputFiles
12
+ import org.gradle.api.tasks.Internal
13
+ import org.gradle.api.tasks.OutputFile
12
14
import org.gradle.api.tasks.TaskAction
13
15
import org.gradle.api.tasks.TaskExecutionException
14
16
import org.gradle.api.tasks.util.PatternSet
@@ -25,11 +27,18 @@ abstract class DetectCollisionsTask : DefaultTask() {
25
27
@get:Classpath
26
28
abstract val configurations: ConfigurableFileCollection
27
29
28
- @get:Input
30
+ @get:Inject
31
+ abstract val archiveOperations: ArchiveOperations
32
+
33
+ @get:OutputFile
34
+ abstract val reportFile: RegularFileProperty
35
+
36
+ @get:Internal
29
37
val collisionFilter: PatternSet = PatternSet ()
30
38
31
- @get:Inject
32
- protected abstract val archiveOperations: ArchiveOperations
39
+ init {
40
+ reportFile.convention(project.layout.buildDirectory.file(" reports/classpath-collisions.txt" ))
41
+ }
33
42
34
43
fun collisionFilter (filterConfig : Action <PatternSet >) {
35
44
filterConfig.execute(collisionFilter)
@@ -38,31 +47,33 @@ abstract class DetectCollisionsTask : DefaultTask() {
38
47
@TaskAction
39
48
fun detectCollisions () {
40
49
val collisionDetector = CollisionDetector (findClasspathArtifacts())
41
-
42
50
val collisions = collisionDetector.detectCollisions()
43
51
52
+ val resolvedReportFile = reportFile.get().asFile
44
53
if (collisions.isNotEmpty()) {
45
- collisions.forEach { logCollisionMessage(it) }
54
+ val collisionMessages = collisions.map { toCollisionMessage(it) }
55
+ collisionMessages.forEach { logger.error(it) }
56
+ resolvedReportFile.writeText(collisionMessages.joinToString(" \n " ))
46
57
throw TaskExecutionException (this , GradleException (" Detected unexpected collisions!" ))
58
+ } else {
59
+ resolvedReportFile.writeText(" No collisions detected" )
47
60
}
48
61
}
49
62
50
- private fun logCollisionMessage (collision : ClasspathCollision ) {
63
+ private fun toCollisionMessage (collision : ClasspathCollision ): String {
51
64
val name = collision.classpathEntry
52
65
val collisionJars = collision.containingArtifacts
53
- .map { it.artifact }
54
- .sorted()
55
- .joinToString(" \n " )
56
- .prependIndent(" " )
57
-
58
- val message = " Collision detected! Entry $name present in following JARs:\n ${collisionJars} "
59
- logger.error(message)
66
+ .map { it.artifact }
67
+ .sorted()
68
+ .joinToString(" \n " )
69
+ .prependIndent(" " )
70
+ return " Collision detected! Entry $name present in following JARs:\n ${collisionJars} "
60
71
}
61
72
62
73
private fun findClasspathArtifacts (): List <ClasspathArtifact > {
63
74
return configurations.files
64
- .filter { it.name.endsWith(" .jar" ) }
65
- .map { toClassPathArtifact(it) }
75
+ .filter { it.name.endsWith(" .jar" ) }
76
+ .map { toClassPathArtifact(it) }
66
77
}
67
78
68
79
private fun toClassPathArtifact (file : File ): ClasspathArtifact {
@@ -72,4 +83,4 @@ abstract class DetectCollisionsTask : DefaultTask() {
72
83
}
73
84
74
85
75
- }
86
+ }
0 commit comments