allprojects { apply plugin: 'java' apply plugin: 'maven' apply plugin: 'eclipse' ext { shortVersion = '4.0.0' isSnapshot = true gitCommit = getGitCommit() javadocAllDir = new File(buildDir, 'javadoc') documentationDir = new File(projectDir, 'documentation') releasedocsDir = new File(buildDir, 'releasedocs') rootConfigDir = new File(rootDir, 'config') sonatypeCredentialsAvailable = project.hasProperty('sonatypeUsername') && project.hasProperty('sonatypePassword') isReleaseVersion = !isSnapshot signingRequired = isReleaseVersion sonatypeSnapshotUrl = 'https://oss.sonatype.org/content/repositories/snapshots' sonatypeStagingUrl = 'https://oss.sonatype.org/service/local/staging/deploy/maven2' buildDate = (new java.text.SimpleDateFormat("yyyy-MM-dd")).format(new Date()) oneLineDesc = 'An Open Source XMPP (Jabber) client library' } group = 'org.igniterealtime.smack' sourceCompatibility = 1.6 version = shortVersion if (isSnapshot) { version += '-SNAPSHOT' } ext.sharedManifest = manifest { attributes('Implementation-Version': version, 'Implementation-GitRevision': ext.gitCommit, 'Bundle-Version': version) } } task javadocAll(type: Javadoc) { source subprojects.collect {project -> project.sourceSets.main.allJava } destinationDir = javadocAllDir // Might need a classpath classpath = files(subprojects.collect {project -> project.sourceSets.main.compileClasspath}) } import org.apache.tools.ant.filters.ReplaceTokens task prepareReleasedocs(type: Copy) { from 'resources/releasedocs' into releasedocsDir filter(ReplaceTokens, tokens: [version: version, releasedate: buildDate]) } task distributionZip(type: Zip, dependsOn: [javadocAll, prepareReleasedocs]) { classifier buildDate into ('javadoc') { from(javadocAllDir) } into ('releasedocs') { from(releasedocsDir) } into ('releasedocs/documentation') { from(documentationDir) } } jar { // Root project should not create empty jar artifact enabled = false } description = """\ Smack ${version} ${oneLineDesc}.""" subprojects { apply plugin: 'osgi' apply plugin: 'signing' apply plugin: 'checkstyle' checkstyle { configFile = new File(rootConfigDir, 'checkstyle.xml') } repositories { mavenCentral() } tasks.withType(Jar) { baseName = 'smack' appendix project.name } task sourcesJar(type: Jar, dependsOn: classes) { appendix project.name classifier = 'sources' from sourceSets.main.allSource } task javadocJar(type: Jar, dependsOn: javadoc) { appendix project.name classifier = 'javadoc' from javadoc.destinationDir } artifacts { archives sourcesJar archives javadocJar } uploadArchives { repositories { mavenDeployer { if (signingRequired) { beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } } repository(url: project.sonatypeStagingUrl) { if (sonatypeCredentialsAvailable) { authentication(userName: sonatypeUsername, password: sonatypePassword) } } snapshotRepository(url: project.sonatypeSnapshotUrl) { if (sonatypeCredentialsAvailable) { authentication(userName: sonatypeUsername, password: sonatypePassword) } } pom.project { name 'Smack' packaging 'jar' inceptionYear '2003' url 'http://www.igniterealtime.org/projects/smack/' issueManagement { system 'JIRA' url 'http://issues.igniterealtime.org/browse/SMACK' } distributionManagement { snapshotRepository { id 'smack.snapshot' url project.sonatypeSnapshotUrl } } scm { url 'https://github.com/igniterealtime/Smack' connection 'scm:git:https://github.com/igniterealtime/Smack.git' developerConnection 'scm:git:https://github.com/igniterealtime/Smack.git' } licenses { license { name 'The Apache Software License, Version 2.0' url 'http://www.apache.org/licenses/LICENSE-2.0.txt' distribution 'repo' } } developers { developer { id 'flow' name 'Florian Schmaus' email 'flow@igniterealtime.org' } } } } } } rootProject.distributionZip { dependsOn build from(buildDir) { include "$libsDirName/**" } } signing { required { signingRequired } sign configurations.archives } } project(':core') { description = """\ Smack core components.""" configurations { compression dns } dependencies { compile 'xpp3:xpp3:1.1.4c' testCompile 'junit:junit:4.+' testCompile 'xmlunit:xmlunit:1.5' testCompile 'org.powermock:powermock-module-junit4:1.5.+' testCompile 'org.powermock:powermock-api-mockito:1.5.+' testCompile 'com.jamesmurty.utils:java-xmlbuilder:0.6+' } jar { manifest { attributes('Bundle-SymbolicName': project.group) from sharedManifest } } task compressionJar(type: Jar) { appendix += '-compression' dependsOn classes from sourceSets.main.output include('org/jivesoftware/smack/compression/**') } task dnsJar(type: Jar) { appendix += '-dns' dependsOn classes from sourceSets.main.output include('org/jivesoftware/smack/util/dns/**') include('org/jivesoftware/smack/util/DNSUtil.class') } artifacts { compression compressionJar dns dnsJar } task createVersionResource(type: CreateFileTask) { fileContent = version outputFile = new File(projectDir, 'src/main/resources/org.jivesoftware.smack/version') } compileJava.dependsOn(createVersionResource) } project(':compression-jzlib') { description = """\ Compression with jzlib Allow to compress the XMPP stream with help of jzlib.""" dependencies { compile project(path: ':core', configuration: 'compression') compile 'com.jcraft:jzlib:1.1.3' } } project(':resolver-dnsjava') { description = """\ DNS SRV with dnsjava Use dnsjava for DNS SRV lookups. For platforms that don't provide the javax.naming API (e.g. Android).""" dependencies { compile project(path: ':core', configuration: 'dns') compile 'dnsjava:dnsjava:2.1.1' } } project(':resolver-javax') { description = """\ DNS SRV with Java7 Use javax.naming for DNS SRV lookups. The javax.naming API is availabe in JavaSE since Java7.""" dependencies { compile project(path: ':core', configuration: 'dns') } } // Now the "real" Smack sub-projects // Note that test dependencies (junit, …) are interfered from the sourceSet.test of the core sub-project project(':extensions') { description = """\ Smack extensions. Classes and methods that implement support for the various XMPP XEPs (Multi-User Chat, PubSub, …) and other XMPP extensions.""" dependencies { compile project(':core') testCompile project(':core').sourceSets.test.runtimeClasspath } } project(':experimental') { description = """\ Smack experimental extensions. Classes and methods for XEPs that are in status 'experimental' or that should otherwise carefully considered for deployment. The API may change even between patch versions.""" dependencies { compile project(':core') compile project(':extensions') testCompile project(':core').sourceSets.test.runtimeClasspath } } project(':legacy') { description = """\ Smack legacy extensions. Usually XEPs in the state 'retracted', 'rejected', 'deprecated', 'obsolete' or in a long standing 'deferred' state.""" dependencies { compile project(':core') compile project(':extensions') testCompile project(':core').sourceSets.test.runtimeClasspath } } project(':debug') { description = """\ Smack GUI debugger. Inspect the exchanged XMPP stanzas.""" dependencies { compile project(':core') testCompile project(':core').sourceSets.test.runtimeClasspath } } project(':jingle') { description = """\ Smack Jingle API. Warning: This API is beta, outdated and currenlty unmaintained.""" dependencies { compile project(':core') compile project(':extensions') compile 'javax.media:jmf:2.1.1e' compile files('libs/jspeex-0.9.7-jfcom.jar', 'libs/jstun.jar', 'libs/Speex.jar') testCompile project(':core').sourceSets.test.runtimeClasspath } } project(':bosh') { description = """\ Smack BOSH API. This API is considered beta quality.""" dependencies { compile project(':core') compile 'org.igniterealtime.jbosh:jbosh:0.7.0' } } (subprojects - project(':core'))*.jar { manifest { attributes('Bundle-SymbolicName': project.group + '-' + appendix, 'Fragment-Host': project.group) from sharedManifest } } // This is not really beautifully, but it's the only way I found to add // the sub-projects description as description element to the POM subprojects*.uploadArchives { repositories { mavenDeployer { pom.project { description project.description } } } } import org.gradle.plugins.signing.Sign gradle.taskGraph.whenReady { taskGraph -> if (signingRequired && taskGraph.allTasks.any { it instanceof Sign }) { // Use Java 6's console to read from the console (no good for a CI environment) Console console = System.console() console.printf '\n\nWe have to sign some things in this build.\n\nPlease enter your signing details.\n\n' def password = console.readPassword('GnuPG Private Key Password: ') allprojects { ext.'signing.password' = password } console.printf '\nThanks.\n\n' } } class CreateFileTask extends DefaultTask { @Input String fileContent @OutputFile File outputFile @TaskAction def createFile() { outputFile.text = fileContent } } def getGitCommit() { def dotGit = new File("$projectDir/.git") if (!dotGit.isDirectory()) return 'non-git build' def cmd = 'git describe --tags --dirty=+' def proc = cmd.execute() def gitCommit = proc.text.trim() assert !gitCommit.isEmpty() gitCommit }