File: ClasspathManifest.groovy

package info (click to toggle)
gradle 4.4.1-13
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 85,440 kB
  • sloc: java: 319,966; xml: 14,356; javascript: 4,838; cpp: 4,200; ansic: 1,025; sh: 300; makefile: 65; asm: 17; jsp: 17; objc: 10
file content (114 lines) | stat: -rw-r--r-- 3,868 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package org.gradle.build

import org.gradle.api.DefaultTask
import org.gradle.api.Project
import org.gradle.api.artifacts.ExternalDependency
import org.gradle.api.artifacts.FileCollectionDependency
import org.gradle.api.artifacts.ProjectDependency
import org.gradle.api.file.FileCollection
import org.gradle.api.tasks.CacheableTask
import org.gradle.api.tasks.Classpath
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.TaskAction
/*
 * Copyright 2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

@CacheableTask
class ClasspathManifest extends DefaultTask {

    @Classpath
    FileCollection input = project.configurations.runtimeClasspath

    @Input
    List<String> optionalProjects = []

    @Internal
    List<Project> additionalProjects = []

    @OutputFile
    File getManifestFile() {
        return new File(project.generatedResourcesDir, "${project.archivesBaseName}-classpath.properties")
    }

    @Input
    String getRuntime() {
        return input.fileCollection {
            (it instanceof ExternalDependency) || (it instanceof FileCollectionDependency)
        }.collect { ClasspathManifest.normalizeRuntime(it.name) }.toSorted().minus('').join(',')
    }

    @Input
    String getProjects() {
        return (input.allDependencies.withType(ProjectDependency).collect {
            it.dependencyProject.archivesBaseName
        } + additionalProjects*.archivesBaseName).toSorted().join(',')
    }

    Properties createProperties() {
        def properties = new Properties()
        properties.runtime = getRuntime()
        properties.projects = getProjects()
        if (!getOptionalProjects().empty) {
            properties.optional = getOptionalProjects().join(',')
        }
        return properties
    }

    @TaskAction
    def generate() {
        ReproduciblePropertiesWriter.store(createProperties(), manifestFile)
    }

    private static String normalizeRuntime(final def name) {
        if (name.startsWith('xml-apis-')) {
            return ''
        }
        if (name.startsWith('org.eclipse.sisu.inject-')) {
            return 'sisu-inject.jar'
        }
        if (name.startsWith('org.eclipse.sisu.plexus-')) {
            return 'sisu-plexus.jar'
        }
        if (name.startsWith('biz.aQute.bndlib-')) {
            return 'bndlib.jar'
        }
        if (name.startsWith('commons-collections-')) {
            return 'commons-collections3.jar'
        }
        if (name.startsWith('groovy-all-')) {
            return 'groovy-all.jar'
        }
        if (name.startsWith('junit-')) {
            return 'junit4.jar'
        }
        if (name.startsWith('javax.inject-')) {
            return 'atinject-jsr330-api.jar'
        }
        if (name.startsWith('geronimo-interceptor_3.0_spec-')) {
            return 'geronimo-interceptor-3.0-spec.jar'
        }
        if (name.startsWith('maven-') && name.endsWith('-3.x.jar')) {
            return name.replace('maven-', 'maven3-').replace('-3.x.jar', '.jar')
        }
        if (name.endsWith('-debian.jar')) {
            return name.replace('-debian.jar', '.jar')
        }
        // Regex operations are costly so they are the last to do.
        return name.replaceAll('-[\\d\\.]*x\\.jar\\z', '.jar')
    }
}