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')
}
}
|