From edae65ae5293f7fd90af7b94301bf3be57c4031f Mon Sep 17 00:00:00 2001 From: Chris Beams Date: Tue, 9 Nov 2010 15:07:22 -0800 Subject: [PATCH] Eliminate gradle directory in favor of shared buildSrc .gradle scripts once in gradle/ dir now live in shared buildSrc/ dir. Some hard-coding of Spring Integration specifics still remain and will be removed shortly. --- build.gradle | 12 +- buildSrc | 2 +- docs/build.gradle | 2 +- gradle/checks.gradle | 90 ------- gradle/dist.gradle | 138 ---------- gradle/docbook.gradle | 315 ----------------------- gradle/maven-deployment.gradle | 271 ------------------- gradle/maven-root-pom.gradle | 62 ----- gradle/version.gradle | 83 ------ gradle/wrapper.gradle | 32 --- gradle/wrapper/gradle-wrapper.jar | Bin 12538 -> 0 bytes gradle/wrapper/gradle-wrapper.properties | 9 - gradlew | 11 +- gradlew.bat | 8 +- 14 files changed, 19 insertions(+), 1016 deletions(-) delete mode 100644 gradle/checks.gradle delete mode 100644 gradle/dist.gradle delete mode 100644 gradle/docbook.gradle delete mode 100644 gradle/maven-deployment.gradle delete mode 100644 gradle/maven-root-pom.gradle delete mode 100644 gradle/version.gradle delete mode 100644 gradle/wrapper.gradle delete mode 100644 gradle/wrapper/gradle-wrapper.jar delete mode 100644 gradle/wrapper/gradle-wrapper.properties diff --git a/build.gradle b/build.gradle index 4df5826631..eb42386217 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ // ----------------------------------------------------------------------------- // Configuration for the root project // ----------------------------------------------------------------------------- -apply from: "$rootDir/gradle/version.gradle" +apply from: "$rootDir/buildSrc/version.gradle" apply plugin: 'idea' // used for artifact names, building doc upload urls, etc. @@ -96,7 +96,7 @@ configure(javaprojects) { libsSrcDir = new File(libsDir, 'src') // add tasks for creating source jars and generating poms etc - apply from: "$rootDir/gradle/maven-deployment.gradle" + apply from: "$rootDir/buildSrc/maven-deployment.gradle" aspectjVersion = '1.6.8' cglibVersion = '2.2' @@ -412,13 +412,13 @@ project('spring-integration-xmpp') { apply plugin: 'base' // add tasks like 'distArchive' -apply from: "$rootDir/gradle/dist.gradle" +apply from: "$rootDir/buildSrc/dist.gradle" // add tasks like 'snapshotDependencyCheck' -apply from: "${rootDir}/gradle/checks.gradle" +apply from: "$rootDir/buildSrc/checks.gradle" // add 'generatePom' task to generate root pom with section -apply from: "$rootDir/gradle/maven-root-pom.gradle" +apply from: "$rootDir/buildSrc/maven-root-pom.gradle" // ----------------------------------------------------------------------------- // Import tasks related to releasing and managing the project @@ -427,4 +427,4 @@ apply from: "$rootDir/gradle/maven-root-pom.gradle" // @see gradle.properties for more information on roles // ----------------------------------------------------------------------------- // add management tasks like `wrapper` for generating the gradlew* scripts -apply from: "$rootDir/gradle/wrapper.gradle" +apply from: "$rootDir/buildSrc/wrapper.gradle" diff --git a/buildSrc b/buildSrc index 5949ed4de8..e02b8b97cf 160000 --- a/buildSrc +++ b/buildSrc @@ -1 +1 @@ -Subproject commit 5949ed4de8f7f2e7332faf1a36c5b66096bcf416 +Subproject commit e02b8b97cf6bd1e9ab6dbe2e1d7ed4848ded5d3d diff --git a/docs/build.gradle b/docs/build.gradle index b816d53880..6b761b33a2 100644 --- a/docs/build.gradle +++ b/docs/build.gradle @@ -15,7 +15,7 @@ */ apply plugin: 'base' -apply from: "$rootDir/gradle/docbook.gradle" +apply from: "$rootDir/buildSrc/docbook.gradle" description = "Spring Integration Documentation" diff --git a/gradle/checks.gradle b/gradle/checks.gradle deleted file mode 100644 index a06b4ec4a7..0000000000 --- a/gradle/checks.gradle +++ /dev/null @@ -1,90 +0,0 @@ - -/* - * Copyright 2002-2010 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. - */ - -/** - * Issue a snapshot dependency report across all Java projects. Detects not - * only direct snapshot dependencies, but transitive as well. - * - * @author Chris Beams - * @see snapshotDependencyCheck - */ -task snapshotDependencyReport { - description = 'Issues a snapshot dependency report across all Java projects' - - doFirst() { - def snapshotDependencies = new HashMap>() - - javaprojects.each { project -> - project.sourceSets.main.compileClasspath.allDependencies.each { dep -> - if (dep.version.endsWith('SNAPSHOT')) { - if (snapshotDependencies[project] == null) - snapshotDependencies[project] = new ArrayList() - snapshotDependencies[project].add(dep) - } - } - } - - project.hasSnapshotDependencies = snapshotDependencies.size() > 0 - - if (project.hasSnapshotDependencies) { - println "The following snapshot dependencies were found:" - snapshotDependencies.each { entry -> - println "${entry.key} depends on:" - entry.value.each { dep -> - println " ${dep}" - } - } - } - } -} - - -/** - * Abort the build if any Java projects have snapshot dependencies. It important - * that any non-snapshot release be checked for snapshot dependencies before - * final publication, as snapshot dependencies may change and thus make the - * release unstable and/or unreproducable. - * - * This task will be added to the build lifecycle automatically if the release - * is non-snapshot. - * - * -PignoreSnapshotDependencies will bypass aborting the build. A use case for - * this option would be if a transitive dependency out of your control is a - * snapshot release and you wish to proceed with releasing anyway. - * - * @author Chris Beams - * @see snapshotDependencyReport - */ -task snapshotDependencyCheck(dependsOn: snapshotDependencyReport) { - group = 'Verification' - description = 'Aborts the build if any Java project has snapshot dependencies.' - - // bind to build lifecycle if we're a non-snapshot release - if (version.releaseType != 'SNAPSHOT') { - check.dependsOn snapshotDependencyCheck - } - - onlyIf { - project.hasSnapshotDependencies && - !project.hasProperty('ignoreSnapshotDependencies') - } - doFirst { - throw new GradleException( - "aborting '${name}' task due to snapshot dependencies. " - + "supply -PignoreSnapshotDependencies to override") - } -} diff --git a/gradle/dist.gradle b/gradle/dist.gradle deleted file mode 100644 index abedc6e963..0000000000 --- a/gradle/dist.gradle +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright 2002-2010 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. - */ - -// ----------------------------------------------------------------------------- -// Task definitions related to releasing the project -// -// @author Chris Beams -// ----------------------------------------------------------------------------- - -// ensure that every project has been evaluated before this script -// this allows us to look up tasks below and dereference dynamically -// assigned properties like 'docsSpec' below -project.subprojects.each { project -> - evaluationDependsOn project.path -} - -task check { - group = 'Verification' -} - -task build(dependsOn: [check, assemble]) { - group = 'Build' -} - -/** - * Build the distribution zip file. - * - * @author Chris Beams - */ -task distArchive(type: Zip) { - group = 'Build' - - destinationDir = buildDir - archiveName = "${project.name}-${project.version}.zip" - checksumPath = "${destinationDir}/${archiveName}.sha1" - def zipRootDir = "${project.name}-${project.version}" - - description = "Builds the distribution zip file at ${project.relativePath(destinationDir)}/${archiveName}" - - // depend on all projects with an assemble task - dependsOn subprojects*.tasks*.matching { task -> task.name == 'assemble' } - - // we need the docsSpec to be defined before evaluating this task - project.evaluationDependsOn(':docs') - - // set up outputs for use by incremental build and by tasks like 'cleanDist' - // the archive zip file will be added automatically to outputs.files - // but we must add the sha1 checksum ourselves - outputs.files file(checksumPath) - - // configure the contents of the zip file. remember that this is a - // configuration phase event. no zip is being created yet. the Zip - // task we extend will do that for us during the execution phase. - into(zipRootDir) { - // add all jars from java subprojects - into('bin') { - from javaprojects.collect { project -> project.libsBinDir } - } - - // add all source jars from java subprojects - into('src') { - from javaprojects.collect { project -> project.libsSrcDir } - } - - into('') { - from('docs/src/info') - } - - into("docs/api") { - from("docs/build/api") - } - - into("docs/reference") { - from("docs/build/reference") - } - } - - // once the zip has been written, create a sha1 hash for it - // this will write out the file at ${checksumPath} - doLast { - ant.checksum(file: archivePath, algorithm: 'SHA1', fileext: '.sha1') - assert file(checksumPath).isFile(): "${checksumPath} was not created" - } -} - -/** - * Upload the distribution zip file. - * - * @author Luke Taylor - * @author Chris Beams - */ -task uploadArchives(overwrite: true, dependsOn: distArchive) { // base plugin adds one we need to overwrite - group = 'Buildmaster' - description = 'Uploads the distribution zip file.' - - configurations { antlibs } - dependencies { - antlibs "org.springframework.build:org.springframework.build.aws.ant:3.0.3.RELEASE", - "net.java.dev.jets3t:jets3t:0.6.1" - } - - def releaseType = version.releaseType.toString().toLowerCase() - - doLast() { - println "Uploading: ${distArchive.archivePath} to s3" - project.ant { - taskdef(resource: 'org/springframework/build/aws/ant/antlib.xml', - classpath: configurations.antlibs.asPath) - s3(accessKey: s3AccessKey, secretKey: s3SecretAccessKey) { - upload(bucketName: 'dist.springframework.org', file: distArchive.archivePath, - toFile: releaseType + "/${rootProject.abbreviation}/${distArchive.archiveName}", publicRead: 'true') { - metadata(name: 'project.name', value: 'Spring Integration') - metadata(name: 'release.type', value: releaseType) - metadata(name: 'bundle.version', value: version) - metadata(name: 'package.file.name', value: distArchive.archiveName) - } - upload(bucketName: 'dist.springframework.org', file: "${distArchive.archivePath}.sha1", - toFile: releaseType + "/${rootProject.abbreviation}/${distArchive.archiveName}.sha1", publicRead: 'true') - } - } - } -} - - - diff --git a/gradle/docbook.gradle b/gradle/docbook.gradle deleted file mode 100644 index 225e4033fe..0000000000 --- a/gradle/docbook.gradle +++ /dev/null @@ -1,315 +0,0 @@ -/* - * Copyright 2002-2010 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. - */ -import org.xml.sax.XMLReader; -import org.xml.sax.InputSource; -import org.apache.xml.resolver.CatalogManager; -import org.apache.xml.resolver.tools.CatalogResolver; - -import javax.xml.parsers.SAXParserFactory; -import javax.xml.transform.*; -import javax.xml.transform.sax.SAXSource; -import javax.xml.transform.sax.SAXResult; -import javax.xml.transform.stream.StreamResult; -import javax.xml.transform.stream.StreamSource; -import java.util.zip.*; - -import org.apache.fop.apps.*; - -import org.gradle.api.logging.LogLevel; - -import com.icl.saxon.TransformerFactoryImpl; -import ch.qos.logback.classic.Level; -import org.slf4j.LoggerFactory; - -buildscript { - repositories { - mavenCentral() - mavenRepo name: 'Shibboleth Repo', urls: 'http://shibboleth.internet2.edu/downloads/maven2' - } - dependencies { - def fopDeps = ['org.apache.xmlgraphics:fop:0.95-1@jar', - 'org.apache.xmlgraphics:xmlgraphics-commons:1.3', - 'org.apache.xmlgraphics:batik-bridge:1.7@jar', - 'org.apache.xmlgraphics:batik-util:1.7@jar', - 'org.apache.xmlgraphics:batik-css:1.7@jar', - 'org.apache.xmlgraphics:batik-dom:1.7', - 'org.apache.xmlgraphics:batik-svg-dom:1.7@jar', - 'org.apache.avalon.framework:avalon-framework-api:4.3.1'] - - classpath 'org.apache.xerces:resolver:2.9.1', - 'saxon:saxon:6.5.3', - 'org.apache.xerces:xercesImpl:2.9.1', - fopDeps, - 'net.sf.xslthl:xslthl:2.0.1', - 'net.sf.docbook:docbook-xsl:1.75.2:resources@zip' - } - -} - -/** - * Gradle Docbook plugin implementation. - *

- * Creates three tasks: docbookHtml, docbookHtmlSingle and docbookPdf. - * Each task takes a single File on which it operates. - * - * @author Luke Taylor - */ -// Add the plugin tasks to the project -task docbookHtml(type: DocbookHtml) { - setDescription('Generates chunked docbook html output.') - xdir = 'html' - classpath = buildscript.configurations.classpath -} - -task docbookHtmlSingle(type: Docbook) { - setDescription('Generates single page docbook html output.') - xdir = 'htmlsingle' - classpath = buildscript.configurations.classpath -} - -task docbookPdf(type: DocbookFoPdf) { - setDescription('Generates PDF docbook output.') - extension = 'fo' - xdir = 'pdf' - classpath = buildscript.configurations.classpath -} - -/** - */ -public class Docbook extends DefaultTask { - @Input - String extension = 'html'; - - @Input - boolean XIncludeAware = true; - - @Input - boolean highlightingEnabled = true; - - String admonGraphicsPath; - - @InputDirectory - File sourceDirectory = new File(project.getProjectDir(), "build/reference-work"); - - @Input - String sourceFileName; - - @InputFile - File stylesheet; - - @OutputDirectory - File docsDir = new File(project.getBuildDir(), "reference"); - - @InputFiles - Configuration classpath - - @TaskAction - public final void transform() { - // the docbook tasks issue spurious content to the console. redirect to INFO level - // so it doesn't show up in the default log level of LIFECYCLE unless the user has - // run gradle with '-d' or '-i' switches -- in that case show them everything - switch (project.gradle.startParameter.logLevel) { - case LogLevel.DEBUG: - case LogLevel.INFO: - break; - default: - logging.captureStandardOutput(LogLevel.INFO) - logging.captureStandardError(LogLevel.INFO) - } - - SAXParserFactory factory = new org.apache.xerces.jaxp.SAXParserFactoryImpl(); - factory.setXIncludeAware(XIncludeAware); - docsDir.mkdirs(); - - File srcFile = new File(sourceDirectory, sourceFileName); - String outputFilename = srcFile.getName().substring(0, srcFile.getName().length() - 4) + '.' + extension; - - File oDir = new File(getDocsDir(), xdir) - File outputFile = new File(oDir, outputFilename); - - Result result = new StreamResult(outputFile.getAbsolutePath()); - CatalogResolver resolver = new CatalogResolver(createCatalogManager()); - InputSource inputSource = new InputSource(srcFile.getAbsolutePath()); - - XMLReader reader = factory.newSAXParser().getXMLReader(); - reader.setEntityResolver(resolver); - TransformerFactory transformerFactory = new TransformerFactoryImpl(); - transformerFactory.setURIResolver(resolver); - URL url = stylesheet.toURL(); - Source source = new StreamSource(url.openStream(), url.toExternalForm()); - Transformer transformer = transformerFactory.newTransformer(source); - - if (highlightingEnabled) { - File highlightingDir = new File(getProject().getBuildDir(), "highlighting"); - if (!highlightingDir.exists()) { - highlightingDir.mkdirs(); - extractHighlightFiles(highlightingDir); - } - - transformer.setParameter("highlight.xslthl.config", new File(highlightingDir, "xslthl-config.xml").toURI().toURL()); - - if (admonGraphicsPath != null) { - transformer.setParameter("admon.graphics", "1"); - transformer.setParameter("admon.graphics.path", admonGraphicsPath); - } - } - - preTransform(transformer, srcFile, outputFile); - - transformer.transform(new SAXSource(reader, inputSource), result); - - postTransform(outputFile); - } - - private void extractHighlightFiles(File toDir) { - File docbookZip = classpath.files.find { file -> file.name.contains('docbook-xsl-')}; - - if (docbookZip == null) { - throw new GradleException("Docbook zip file not found"); - } - - ZipFile zipFile = new ZipFile(docbookZip); - - Enumeration e = zipFile.entries(); - while (e.hasMoreElements()) { - ZipEntry ze = (ZipEntry) e.nextElement(); - if (ze.getName().matches(".*/highlighting/.*\\.xml")) { - String filename = ze.getName().substring(ze.getName().lastIndexOf("/highlighting/") + 14); - copyFile(zipFile.getInputStream(ze), new File(toDir, filename)); - } - } - } - - private void copyFile(InputStream source, File destFile) { - destFile.createNewFile(); - FileOutputStream to = null; - try { - to = new FileOutputStream(destFile); - byte[] buffer = new byte[4096]; - int bytesRead; - - while ((bytesRead = source.read(buffer)) > 0) { - to.write(buffer, 0, bytesRead); - } - } finally { - if (source != null) { - source.close(); - } - if (to != null) { - to.close(); - } - } - } - - protected void preTransform(Transformer transformer, File sourceFile, File outputFile) { - } - - protected void postTransform(File outputFile) { - } - - private CatalogManager createCatalogManager() { - CatalogManager manager = new CatalogManager(); - manager.setIgnoreMissingProperties(true); - ClassLoader classLoader = this.getClass().getClassLoader(); - StringBuilder builder = new StringBuilder(); - String docbookCatalogName = "docbook/catalog.xml"; - URL docbookCatalog = classLoader.getResource(docbookCatalogName); - - if (docbookCatalog == null) { - throw new IllegalStateException("Docbook catalog " + docbookCatalogName + " could not be found in " + classLoader); - } - - builder.append(docbookCatalog.toExternalForm()); - - Enumeration enumeration = classLoader.getResources("/catalog.xml"); - while (enumeration.hasMoreElements()) { - builder.append(';'); - URL resource = (URL) enumeration.nextElement(); - builder.append(resource.toExternalForm()); - } - String catalogFiles = builder.toString(); - manager.setCatalogFiles(catalogFiles); - return manager; - } -} - -/** - */ -class DocbookHtml extends Docbook { - - @Override - protected void preTransform(Transformer transformer, File sourceFile, File outputFile) { - String rootFilename = outputFile.getName(); - rootFilename = rootFilename.substring(0, rootFilename.lastIndexOf('.')); - transformer.setParameter("root.filename", rootFilename); - transformer.setParameter("base.dir", outputFile.getParent() + File.separator); - } -} - -/** - */ -class DocbookFoPdf extends Docbook { - - /** - * From the FOP usage guide - */ - @Override - protected void postTransform(File foFile) { - FopFactory fopFactory = FopFactory.newInstance(); - - OutputStream out = null; - final File pdfFile = getPdfOutputFile(foFile); - logger.debug("Transforming 'fo' file " + foFile + " to PDF: " + pdfFile); - - try { - out = new BufferedOutputStream(new FileOutputStream(pdfFile)); - - Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out); - - TransformerFactory factory = TransformerFactory.newInstance(); - Transformer transformer = factory.newTransformer(); - - Source src = new StreamSource(foFile); - - Result res = new SAXResult(fop.getDefaultHandler()); - - switch (project.gradle.startParameter.logLevel) { - case LogLevel.DEBUG: - case LogLevel.INFO: - break; - default: - // only show verbose fop output if the user has specified 'gradle -d' or 'gradle -i' - LoggerFactory.getILoggerFactory().getLogger('org.apache.fop').level = Level.ERROR - } - - transformer.transform(src, res); - - } finally { - if (out != null) { - out.close(); - } - } - - if (!foFile.delete()) { - logger.warn("Failed to delete 'fo' file " + foFile); - } - } - - private File getPdfOutputFile(File foFile) { - String name = foFile.getAbsolutePath(); - return new File(name.substring(0, name.length() - 2) + "pdf"); - } -} diff --git a/gradle/maven-deployment.gradle b/gradle/maven-deployment.gradle deleted file mode 100644 index d588d0ba56..0000000000 --- a/gradle/maven-deployment.gradle +++ /dev/null @@ -1,271 +0,0 @@ -/* - * Copyright 2002-2010 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. - */ - -// ----------------------------------------------------------------------------- -// Tasks related to deploying Maven artifacts. -// -// @author Chris Beams -// ----------------------------------------------------------------------------- - -// check that upload-related properties are defined and fail early if not -// these properties ('s3AccessKey', etc) should be defined in -// 'gradle.properties' in $HOME/.gradle/gradle.properties -def requiredProps = version.releaseType == 'RELEASE' ? ['mavenSyncRepoDir'] : ['s3AccessKey', 's3SecretAccessKey'] -checkForProps(taskPath: project.path + ':uploadArchives', requiredProps: requiredProps) - -/** - * Builds a source jar artifact for all main java sources. - * - * @author Luke Taylor - */ -task sourceJar(type: Jar) { - description = 'Builds a source jar artifact suitable for maven deployment.' - classifier = 'sources' - from sourceSets.main.java -} -build.dependsOn sourceJar - -jar.destinationDir = project.libsBinDir -sourceJar.destinationDir = project.libsSrcDir - -// Add the source jar archive to the set of artifacts for this project. -// Note that the regular 'jar' archive is already added by default. -artifacts { - archives sourceJar -} - - -/** - * Deploy gradle-built artifacts to a remote maven repository. Overrides and - * further customizes the 'uploadArchives' task contributed by the 'maven' - * plugin. - * - * The repository that artifacts are deployed to is determined conditionally - * based on the release type of the project version. Snapshot builds will - * be deployed via s3 to the springframework maven snapshot repository; - * milestone builds will happen via s3 as well; release builds will be deployed - * to the local filesystem to be sync'd via sourceforge SVN and ultimately - * deployed to maven central. - * - * Gradle will generate Maven poms on-the-fly during the deployment process. - * This process is customized to add ASL license information, and for projects - * that have the erlangLicense property set to true, the Erlang License will be - * added to the pom as well. - * - * @author Chris Beams - * @see 'mavenSyncRepoDir' in gradle.properties - * @see `gradle install` for deploying artifacts to the local .m2 cache - * @see http://maven.apache.org/guides/mini/guide-central-repository-upload.html - */ -uploadArchives { - group = 'Buildmaster' - description = "Does a maven deploy of archives artifacts to " // url appended below - - def releaseRepositoryUrl = "file://${project.properties.mavenSyncRepoDir}" - def milestoneRepositoryUrl = 's3://maven.springframework.org/milestone' - def snapshotRepositoryUrl = 's3://maven.springframework.org/snapshot' - - // add a configuration with a classpath that includes our s3 maven deployer - configurations { deployerJars } - dependencies { - deployerJars "org.springframework.build.aws:org.springframework.build.aws.maven:3.0.0.RELEASE" - } - - def deployer = repositories.mavenDeployer { - switch (version.releaseType) { - case 'RELEASE': - repository(url: releaseRepositoryUrl) - description += releaseRepositoryUrl - break; - - case 'MILESTONE': - description += milestoneRepositoryUrl - s3credentials = [userName: project.properties.s3AccessKey, passphrase: project.properties.s3SecretAccessKey] - configuration = configurations.deployerJars - repository(url: milestoneRepositoryUrl) { - authentication(s3credentials) - } - snapshotRepository(url: snapshotRepositoryUrl) { - authentication(s3credentials) - } - break; - - case 'SNAPSHOT': - description += snapshotRepositoryUrl - s3credentials = [userName: project.properties.s3AccessKey, passphrase: project.properties.s3SecretAccessKey] - configuration = configurations.deployerJars - repository(url: milestoneRepositoryUrl) { - authentication(s3credentials) - } - snapshotRepository(url: snapshotRepositoryUrl) { - authentication(s3credentials) - } - break; - - default: - throw new GradleException("unknown ReleaseType") - } - } - - configurePom(deployer.pom) -} - - -/** - * Install gradle-built artifacts to the local m2 maven cache. - * Further customizes the 'install' task contributed by the 'maven' plugin. - */ -install { - group = 'Build' - description = "Does a maven install of archives artifacts to local m2 cache" - - configurePom(repositories.mavenInstaller.pom) -} - - -/** - * Generate a Maven pom.xml for use at build time. Dependency information will - * be based on Gradle metadata for the project, and other customizations such - * as licensing information and source compatibility settings are configured - * within. - * - * @author Chris Beams - * @see http://gradle.org/0.9-preview-3/docs/userguide/userguide_single.html#pomBuilder - */ -task generatePom { - group = 'Build' - description = 'Generates a Maven POM file suitable for use in building the project' - - generatedPomFileName = "pom.xml" - - // enable partial cleaning with `gradle cleanGeneratePom` - outputs.files(generatedPomFileName) - - doLast() { - // customize the pom creation process - p = pom { - project { - name = project.description - properties { - setProperty('project.build.sourceEncoding', 'UTF8') - } - build { - plugins { - plugin { - groupId = 'org.apache.maven.plugins' - artifactId = 'maven-compiler-plugin' - configuration { - source = '1.5' - target = '1.5' - } - } - plugin { - groupId = 'org.apache.maven.plugins' - artifactId = 'maven-surefire-plugin' - configuration { - includes { - include = '**/*Tests.java' - } - excludes { - exclude = '**/*Abstract*.java' - } - } - } - } - resources { - resource { - directory = 'src/main/java' - includes = ['**/*'] - excludes = ['**/*.java'] - } - resource { - directory = 'src/main/resources' - includes = ['**/*'] - } - } - testResources { - testResource { - directory = 'src/test/java' - includes = ['**/*'] - excludes = ['**/*.java'] - } - testResource { - directory = 'src/test/resources' - includes = ['**/*'] - } - } - } - } - } - - // customizing the artifact id is a special case that must be configured - // after the pom is fully configured, otherwise it'll be overwritten - p.whenConfigured { pom -> pom.artifactId = project.name } - - configurePom(p) - - // write the pom.xml file out to the filesystem - p.writeTo(generatedPomFileName) - } - - // ensure that pom generation happens every time resources are processed - // (which practically means any time a build happens). if the dependencies - // for the project have been updated (in $rootDir/build.gradle), the pom - // will have diffs in it and the developer will be reminded to check in - // the change during the next commit cycle. - //processResources.dependsOn generatePom -} - - -/** - * Read dynamic 'optional' and 'provided' properties from gradle dependencies - * and translate them to their maven POM equivalents. - */ -def configurePom(def pom) { - pom.whenConfigured { generatedPom -> - def optionalDeps = configurations.testRuntime.allDependencies.findAll { gradleDep -> - gradleDep.asDynamicObject.hasProperty('optional') && gradleDep.optional - } - def providedDeps = configurations.testRuntime.allDependencies.findAll { gradleDep -> - gradleDep.asDynamicObject.hasProperty('provided') && gradleDep.provided - } - generatedPom.dependencies.each { mavenDep -> - mavenDep.optional = optionalDeps.any { optionalDep -> - optionalDep.group == mavenDep.groupId && - optionalDep.name == mavenDep.artifactId && - optionalDep.version == mavenDep.version - } - boolean isProvided = providedDeps.any { providedDep -> - providedDep.group == mavenDep.groupId && - providedDep.name == mavenDep.artifactId && - providedDep.version == mavenDep.version - } - if (isProvided) { - mavenDep.scope = 'provided' - } - } - } - - pom.project { - licenses { - license { - name 'The Apache Software License, Version 2.0' - url 'http://www.apache.org/licenses/LICENSE-2.0.txt' - distribution 'repo' - } - } - } -} diff --git a/gradle/maven-root-pom.gradle b/gradle/maven-root-pom.gradle deleted file mode 100644 index d26f1402ec..0000000000 --- a/gradle/maven-root-pom.gradle +++ /dev/null @@ -1,62 +0,0 @@ - -/* - * Copyright 2002-2010 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. - */ - -/** - * Generate a root Maven pom.xml for use at build time. Contains nothing other - * than a 'modules' section aggregating child projects. This pom will never be - * installed locally or deployed remotely. Child projects will not explicitly - * declare this pom as their parent, given than nothing need be inherited from - * it. - * - * @author Chris Beams - * @see maven-deployment.gradle for per-project generatePom task - */ -task generatePom { - apply plugin: 'maven' - group = 'Build' - description = 'Generates a root Maven pom for convenience.' - - generatedPomFileName = "pom.xml" - - // enable partial cleaning with `gradle cleanGeneratePom` - outputs.files(generatedPomFileName) - - doLast() { - // customize the pom creation process - p = pom { - project { - name = project.description - packaging = 'pom' - modules = javaprojects.collect { project -> project.name } - } - } - - // customizing the artifact id is a special case that must be configured - // after the pom is fully configured, otherwise it'll be overwritten - p.whenConfigured { pom -> pom.artifactId = project.name } - - // write the pom.xml file out to the filesystem - p.writeTo(generatedPomFileName) - } - - // ensure that pom generation happens every time resources are processed - // (which practically means any time a build happens). if the dependencies - // for the project have been updated (in $rootDir/build.gradle), the pom - // will have diffs in it and the developer will be reminded to check in - // the change during the next commit cycle. - //processResources.dependsOn generatePom -} diff --git a/gradle/version.gradle b/gradle/version.gradle deleted file mode 100644 index 310cf2752d..0000000000 --- a/gradle/version.gradle +++ /dev/null @@ -1,83 +0,0 @@ -class Version { - /** - * Indicates whether a version is a release, milestone, or snapshot - */ - static final String RELEASE = 'RELEASE' - static final String MILESTONE = 'MILESTONE' - static final String SNAPSHOT = 'SNAPSHOT' - - String value - String releaseType - int majorVersion - int minorVersion - - /** - * @param dotted -quad version spec, e.g.: 1.0.0.RELEASE - */ - public Version(String value) { - this.value = value; - this.releaseType = releaseTypeFor(value); - this.majorVersion = Integer.parseInt(this.value.substring(0, this.value.indexOf('.'))); - String afterMajor = this.value.substring(this.value.indexOf('.') + 1); - this.minorVersion = Integer.parseInt(afterMajor.substring(0, afterMajor.indexOf('.'))); - } - - public int getMajorVersion() { - return this.majorVersion; - } - - public int getMinorVersion() { - return this.minorVersion - } - - /** - * @return 1.0.x style - */ - public String getWildcardValue() { - return majorVersion + '.' + minorVersion + '.x'; - } - - /** - * @return the version string returned by {@link getValue ( )} - */ - public String toString() { - return this.getValue(); - } - - /** - * @param dotted -quad version spec, e.g.: 1.0.0.RELEASE - */ - public static String releaseTypeFor(String version) { - if (version.endsWith("RELEASE")) return RELEASE; - if (version.endsWith("SNAPSHOT")) return SNAPSHOT; - if (version.matches(".*\\.M[0-9]+\$")) return MILESTONE; - if (version.matches(".*\\.RC[0-9]+\$")) return MILESTONE; - - throw new InvalidUserDataException("unknown version scheme: " + - "versions must end in (SNAPSHOT|M[0-9]+|RC[0-9]+|RELEASE), " + - "but got (" + version + ")"); - } -} - -project.createVersion = { value -> - new Version(value) -} - -def requiredPropSets = [] - -gradle.taskGraph.whenReady { graph -> - requiredPropSets.each { args -> - if (graph.hasTask(args.taskPath)) { - def missingProps = args.requiredProps.findAll { prop -> - !project.hasProperty(prop) - } - if (missingProps) { - throw new GradleException("For executing the ${args.taskPath} task you need to set all ${missingProps} properties") - } - } - } -} -project.checkForProps = { Map args -> - requiredPropSets.add args -} - diff --git a/gradle/wrapper.gradle b/gradle/wrapper.gradle deleted file mode 100644 index 36e7ac7d0f..0000000000 --- a/gradle/wrapper.gradle +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2002-2010 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. - */ - -/** - * Generate gradlew and gradlew.bat scripts and associated files. These - * convenience scripts allow users to operate the build without being forced to - * download and install gradle. - * - * @author Chris Beams - * @see http://gradle.org/0.9-preview-3/docs/userguide/userguide_single.html#gradle_wrapper - */ -task wrapper(type: Wrapper) { - group = 'Buildmaster' - description = "Generates gradlew and gradlew.bat bootstrap scripts" - gradleVersion = '0.9-preview-3' - // place jar file and properties into a - // subdirectory to avoid root dir clutter - jarPath = 'gradle/wrapper' -} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 4eb13be9e5c3355b057b87d44e59956b99e34b29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12538 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