beam-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "ASF GitHub Bot (JIRA)" <j...@apache.org>
Subject [jira] [Work logged] (BEAM-3255) Update release process to use Gradle
Date Mon, 09 Apr 2018 14:57:00 GMT

     [ https://issues.apache.org/jira/browse/BEAM-3255?focusedWorklogId=88965&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-88965 ]

ASF GitHub Bot logged work on BEAM-3255:
----------------------------------------

                Author: ASF GitHub Bot
            Created on: 09/Apr/18 14:56
            Start Date: 09/Apr/18 14:56
    Worklog Time Spent: 10m 
      Work Description: lukecwik closed pull request #5054: [BEAM-3255] Updates to support the release process via Gradle
URL: https://github.com/apache/beam/pull/5054
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/.test-infra/jenkins/job_beam_PostCommit_Java_JDKVersionsTest.groovy b/.test-infra/jenkins/job_beam_PostCommit_Java_JDKVersionsTest.groovy
deleted file mode 100644
index a2f6aaf5052..00000000000
--- a/.test-infra/jenkins/job_beam_PostCommit_Java_JDKVersionsTest.groovy
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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 common_job_properties
-
-// This job runs the Java postcommit tests cross multiple JDK versions.
-matrixJob('beam_PostCommit_Java_JDK_Versions_Test') {
-  description('Runs postcommit tests on the Java SDK in multiple Jdk versions.')
-
-  // Set common parameters.
-  common_job_properties.setTopLevelMainJobProperties(delegate)
-
-  // Set JDK versions.
-  axes {
-    label('label', 'beam')
-    jdk('OpenJDK 8 (on Ubuntu only)')
-  }
-
-  // Sets that this is a PostCommit job.
-  common_job_properties.setPostCommit(
-      delegate,
-      '0 */6 * * *',
-      false,
-      '',  // TODO: Remove last two args once test is stable again.
-      false)
-
-  // Allows triggering this build against pull requests.
-  common_job_properties.enablePhraseTriggeringFromPullRequest(
-      delegate,
-      'Java JDK Version Test',
-      'Run Java JDK Version Test')
-
-  // Maven build for this job.
-  steps {
-    maven {
-      // Set maven parameters.
-      common_job_properties.setMavenConfig(delegate)
-
-      // Maven build project.
-      // Skip beam-sdks-python since this test is only apply to Java.
-      // TODO[BEAM-2322,BEAM-2323,BEAM-2324]: Re-enable beam-runners-apex once the build is passed.
-      goals('-B -e -P dataflow-runner clean install -pl \'!org.apache.beam:beam-sdks-python,!org.apache.beam:beam-runners-apex\' -DskipITs=false -DintegrationTestPipelineOptions=\'[ "--project=apache-beam-testing", "--tempRoot=gs://temp-storage-for-end-to-end-tests", "--runner=TestDataflowRunner" ]\'')
-    }
-  }
-}
diff --git a/.test-infra/jenkins/job_beam_PostCommit_Java_ValidatesRunner_Apex.groovy b/.test-infra/jenkins/job_beam_PostCommit_Java_ValidatesRunner_Apex.groovy
index f1c7e18c066..7b298c739fd 100644
--- a/.test-infra/jenkins/job_beam_PostCommit_Java_ValidatesRunner_Apex.groovy
+++ b/.test-infra/jenkins/job_beam_PostCommit_Java_ValidatesRunner_Apex.groovy
@@ -54,7 +54,7 @@ job('beam_PostCommit_Java_ValidatesRunner_Apex_Gradle') {
   steps {
     gradle {
       rootBuildScriptDir(common_job_properties.checkoutDir)
-      tasks(':runners:apex:validatesRunner')
+      tasks(':beam-runners-apex:validatesRunner')
       for (String gradle_switch : gradle_switches) {
         switches(gradle_switch)
       }
diff --git a/.test-infra/jenkins/job_beam_PostCommit_Java_ValidatesRunner_Dataflow.groovy b/.test-infra/jenkins/job_beam_PostCommit_Java_ValidatesRunner_Dataflow.groovy
index 5159f8afae2..ee4def2f9ca 100644
--- a/.test-infra/jenkins/job_beam_PostCommit_Java_ValidatesRunner_Dataflow.groovy
+++ b/.test-infra/jenkins/job_beam_PostCommit_Java_ValidatesRunner_Dataflow.groovy
@@ -55,7 +55,7 @@ job('beam_PostCommit_Java_ValidatesRunner_Dataflow_Gradle') {
   steps {
     gradle {
       rootBuildScriptDir(common_job_properties.checkoutDir)
-      tasks(':runners:google-cloud-dataflow-java:validatesRunner')
+      tasks(':beam-runners-google-cloud-dataflow-java:validatesRunner')
       for (String gradle_switch : gradle_switches) {
         switches(gradle_switch)
       }
diff --git a/.test-infra/jenkins/job_beam_PostCommit_Java_ValidatesRunner_Flink.groovy b/.test-infra/jenkins/job_beam_PostCommit_Java_ValidatesRunner_Flink.groovy
index 6daed0bf95b..f06c9d91a84 100644
--- a/.test-infra/jenkins/job_beam_PostCommit_Java_ValidatesRunner_Flink.groovy
+++ b/.test-infra/jenkins/job_beam_PostCommit_Java_ValidatesRunner_Flink.groovy
@@ -52,7 +52,7 @@ job('beam_PostCommit_Java_ValidatesRunner_Flink_Gradle') {
   steps {
     gradle {
       rootBuildScriptDir(common_job_properties.checkoutDir)
-      tasks(':runners:flink:validatesRunner')
+      tasks(':beam-runners-flink_2.11:validatesRunner')
       for (String gradle_switch : gradle_switches) {
         switches(gradle_switch)
       }
diff --git a/.test-infra/jenkins/job_beam_PostCommit_Java_ValidatesRunner_Gearpump.groovy b/.test-infra/jenkins/job_beam_PostCommit_Java_ValidatesRunner_Gearpump.groovy
index ef6b34ccdf8..df8d3e464f0 100644
--- a/.test-infra/jenkins/job_beam_PostCommit_Java_ValidatesRunner_Gearpump.groovy
+++ b/.test-infra/jenkins/job_beam_PostCommit_Java_ValidatesRunner_Gearpump.groovy
@@ -59,7 +59,7 @@ job('beam_PostCommit_Java_ValidatesRunner_Gearpump_Gradle') {
   steps {
     gradle {
       rootBuildScriptDir(common_job_properties.checkoutDir)
-      tasks(':runners:gearpump:validatesRunner')
+      tasks(':beam-runners-gearpump:validatesRunner')
       for (String gradle_switch : gradle_switches) {
         switches(gradle_switch)
       }
diff --git a/.test-infra/jenkins/job_beam_PostCommit_Java_ValidatesRunner_Spark.groovy b/.test-infra/jenkins/job_beam_PostCommit_Java_ValidatesRunner_Spark.groovy
index 7824e91e8d2..9ae940c0b8a 100644
--- a/.test-infra/jenkins/job_beam_PostCommit_Java_ValidatesRunner_Spark.groovy
+++ b/.test-infra/jenkins/job_beam_PostCommit_Java_ValidatesRunner_Spark.groovy
@@ -54,7 +54,7 @@ job('beam_PostCommit_Java_ValidatesRunner_Spark_Gradle') {
   steps {
     gradle {
       rootBuildScriptDir(common_job_properties.checkoutDir)
-      tasks(':runners:spark:validatesRunner')
+      tasks(':beam-runners-spark:validatesRunner')
       for (String gradle_switch : gradle_switches) {
         switches(gradle_switch)
       }
diff --git a/.test-infra/jenkins/job_beam_PreCommit_Python_GradleBuild.groovy b/.test-infra/jenkins/job_beam_PreCommit_Python_GradleBuild.groovy
index 255277d471a..762b5484844 100644
--- a/.test-infra/jenkins/job_beam_PreCommit_Python_GradleBuild.groovy
+++ b/.test-infra/jenkins/job_beam_PreCommit_Python_GradleBuild.groovy
@@ -49,7 +49,7 @@ job('beam_PreCommit_Python_GradleBuild') {
 
   def gradle_command_line = './gradlew ' + gradle_switches.join(' ') + ' :pythonPreCommit'
   // Sets that this is a PreCommit job.
-  common_job_properties.setPreCommit(delegate, gradle_command_line, 'Run Python Gradle PreCommit')
+  common_job_properties.setPreCommit(delegate, gradle_command_line, 'Run Python PreCommit')
   steps {
     gradle {
       rootBuildScriptDir(common_job_properties.checkoutDir)
diff --git a/build.gradle b/build.gradle
index 7b8c60c169e..d4ebafe30e7 100644
--- a/build.gradle
+++ b/build.gradle
@@ -115,20 +115,20 @@ check.dependsOn rat
 // for the test definitions.
 task javaPreCommit() {
   dependsOn ":rat"
-  dependsOn ":sdks:java:core:buildNeeded"
-  dependsOn ":sdks:java:core:buildDependents"
-  dependsOn ":sdks:java:maven-archetypes:examples:generateAndBuildArchetypeTest"
-  dependsOn ":sdks:java:maven-archetypes:starter:generateAndBuildArchetypeTest"
-  dependsOn ":examples:java:preCommit"
+  dependsOn ":beam-sdks-java-core:buildNeeded"
+  dependsOn ":beam-sdks-java-core:buildDependents"
+  dependsOn ":beam-sdks-java-maven-archetypes-examples:generateAndBuildArchetypeTest"
+  dependsOn ":beam-sdks-java-maven-archetypes-starter:generateAndBuildArchetypeTest"
+  dependsOn ":beam-examples-java:preCommit"
 }
 
 task goPreCommit() {
   dependsOn ":rat"
-  dependsOn ":sdks:go:test"
+  dependsOn ":beam-sdks-go:test"
 }
 
 task pythonPreCommit() {
   dependsOn ":rat"
-  dependsOn ":sdks:python:check"
+  dependsOn ":beam-sdks-python:check"
 }
 
diff --git a/build_rules.gradle b/build_rules.gradle
index aad4fd13fe5..3bb927536e2 100644
--- a/build_rules.gradle
+++ b/build_rules.gradle
@@ -34,11 +34,19 @@ println "Applying build_rules.gradle to $project.name"
 /*************************************************************************************************/
 // Apply common properties/repositories and tasks to all projects.
 
-// Gradle determines project uniqueness based upon the project group and its name.
-// We use the project.path as the group name to make this mapping unique since
-// we have a few projects with the same name.
-group = project.path
-version = "2.5.0-SNAPSHOT"
+// Create a function which returns true iff we are performing a release.
+def isRelease() {
+  return project.hasProperty('release')
+}
+
+group = 'org.apache.beam'
+
+// Automatically use the official release version if we are performing a release
+// otherwise append '-SNAPSHOT'
+version = '2.5.0'
+if (!isRelease()) {
+  version += '-SNAPSHOT'
+}
 
 // Define the default set of repositories for all builds.
 repositories {
@@ -267,10 +275,10 @@ ext.library = [
 // Returns a string representing the relocated path to be used with the shadow plugin when
 // given a suffix such as "com.google.common".
 ext.getJavaRelocatedPath = { String suffix ->
-  return "org.apache.beam"
-    + (project.path + ":" + project.name).replace(":", ".").replace("-", "_")
-    + ".repackaged."
-    + suffix;
+  return ("org.apache.beam.repackaged."
+          + project.name.replace("-", "_")
+          + "."
+          + suffix)
 }
 
 // A class defining the set of configurable properties accepted by applyJavaNature
@@ -278,7 +286,6 @@ class JavaNatureConfiguration {
   double javaVersion = 1.8        // Controls the JDK source language and target compatibility
   boolean enableFindbugs = true   // Controls whether the findbugs plugin is enabled and configured
   boolean enableShadow = true     // Controls whether the shadow plugin is enabled and configured
-  String artifactId = null        // Sets the maven publication artifact id
 }
 
 // Configures a project with a default set of plugins that should apply to all Java projects.
@@ -330,18 +337,8 @@ ext.applyJavaNature = {
   println "applyJavaNature with " + (it ? "$it" : "default configuration") + " for project $project.name"
   // Use the implicit it parameter of the closure to handle zero argument or one argument map calls.
   JavaNatureConfiguration configuration = it ? it as JavaNatureConfiguration : new JavaNatureConfiguration()
-  apply plugin: "maven-publish"
   apply plugin: "java"
 
-  publishing {
-    repositories {
-      maven {
-        url project.properties["distMgmtSnapshotsUrl"] ?: "https://repository.apache.org/content/repositories/snapshots"
-      }
-    }
-  }
-
-
   // Configure the Java compiler source language and target compatibility levels. Also ensure that
   // we configure the Java compiler to use UTF-8.
   sourceCompatibility = configuration.javaVersion
@@ -478,65 +475,264 @@ ext.applyJavaNature = {
       }
       testCompile.extendsFrom shadowTest
     }
-
     // Ensure that shaded classes are part of the artifact set.
     artifacts.archives shadowJar
 
-    if (configuration.artifactId) {
-      task sourcesJar(type: Jar) {
-        from sourceSets.main.allSource
-        classifier = 'sources'
+    // TODO: Figure out how to create ShadowJar task for ShadowTestJar here
+    // that is extendable within each sub-project with any additional includes.
+    // This could mirror the "shadowJar" configuration block.
+    // Optionally, we could also copy the shading configuration from the main
+    // source set and apply it here.
+    //
+    // Shading the test jar has a lot less need but can still be beneficial for
+    // resolving class conflicts for tests during test execution or exposing
+    // test libraries for users.
+  }
+
+  task sourcesJar(type: Jar) {
+    from sourceSets.main.allSource
+    classifier = 'sources'
+  }
+  artifacts.archives sourcesJar
+
+  task testSourcesJar(type: Jar) {
+    from sourceSets.test.allSource
+    classifier = 'test-sources'
+  }
+  artifacts.archives testSourcesJar
+
+  task javadocJar(type: Jar, dependsOn: javadoc) {
+    classifier = 'javadoc'
+    from javadoc.destinationDir
+  }
+  artifacts.archives javadocJar
+
+  if (isRelease() || project.hasProperty('publishing')) {
+    apply plugin: "maven-publish"
+
+    // Only sign artifacts if we are performing a release
+    if (isRelease()) {
+      apply plugin: "signing"
+      signing {
+        useGpgCmd()
+        // Drop the unshaded jar because we don't want to publish it.
+        // Otherwise the unshaded one is the only one published since they
+        // both have no classifier and the names conflict.
+        def unshaded = configurations.archives.getArtifacts().matching({
+          artifact -> artifact.classifier == "" })
+        configurations.archives.getArtifacts().removeAll(unshaded)
+        sign configurations.archives
       }
-      task testSourcesJar(type: Jar) {
-        from sourceSets.test.allSource
-        classifier = 'test-sources'
+
+      model {
+        tasks.generatePomFileForMavenJavaPublication {
+          destination = file("$buildDir/generated-pom.xml")
+        }
+        tasks.publishMavenJavaPublicationToMavenLocal {
+          dependsOn project.tasks.signArchives
+        }
+        tasks.publishMavenJavaPublicationToMavenRepository {
+          dependsOn project.tasks.signArchives
+        }
       }
-      task javadocJar(type: Jar, dependsOn: javadoc) {
-        classifier = 'javadoc'
-        from javadoc.destinationDir
+    }
+
+    uploadArchives {
+      repositories {
+        mavenDeployer {
+          beforeDeployment { MavenDeployment deployment -> isRelease() && signing.signPom(deployment) }
+        }
       }
+    }
 
-      // If a publication artifact id is supplied, publish the shadow jar.
-      publishing {
-        publications {
-          mavenJava(MavenPublication) {
-            artifact(shadowJar) {
-              groupId "org.apache.beam"
-              artifactId configuration.artifactId
-              // Strip the "shaded" classifier.
-              classifier null
-              // Set readable name to project description.
-              pom.withXml {
-                asNode().appendNode('name', description)
+    publishing {
+      repositories {
+        maven {
+          url(project.properties['distMgmtSnapshotsUrl'] ?: isRelease()
+                  ? 'https://repository.apache.org/service/local/staging/deploy/maven2'
+                  : 'https://repository.apache.org/content/repositories/snapshots')
+
+          // We attempt to find and load credentials from ~/.m2/settings.xml file that a user
+          // has configured with the Apache release and snapshot staging credentials.
+          // <settings>
+          //   <servers>
+          //     <server>
+          //       <id>apache.releases.https</id>
+          //       <username>USER_TOKEN</username>
+          //       <password>PASS_TOKEN</password>
+          //     </server>
+          //     <server>
+          //       <id>apache.snapshots.https</id>
+          //       <username>USER_TOKEN</username>
+          //       <password>PASS_TOKEN</password>
+          //     </server>
+          //   </servers>
+          // </settings>
+          def settingsXml = new File(System.getProperty('user.home'), '.m2/settings.xml')
+          if (settingsXml.exists()) {
+            def serverId = (isRelease() ? 'apache.releases.https' : 'apache.snapshots.https')
+            def m2SettingCreds = new XmlSlurper().parse(settingsXml).servers.server.find { server -> serverId.equals(server.id.text()) }
+            if (m2SettingCreds) {
+              credentials {
+                username m2SettingCreds.username.text()
+                password m2SettingCreds.password.text()
               }
             }
-            // TODO: Use the shadow test jar here instead of the test jar.
-            artifact packageTests {
-              classifier "tests"
+          }
+        }
+      }
+
+      publications {
+        mavenJava(MavenPublication) {
+          artifact shadowJar {
+            // Strip the "shaded" classifier.
+            classifier null
+          }
+          // TODO: Use the shadow test jar here instead of the test jar.
+          artifact packageTests {
+            classifier "tests"
+          }
+          artifact sourcesJar {
+            classifier "sources"
+          }
+          artifact testSourcesJar {
+            classifier "test-sources"
+          }
+          artifact javadocJar {
+            classifier "javadoc"
+          }
+
+          pom.withXml {
+            def root = asNode()
+            root.appendNode('name', project.description)
+            if (project.hasProperty("summary")) {
+                root.appendNode('description', project.summary)
             }
-            artifact sourcesJar {
-              classifier "sources"
+            root.appendNode('url', POM_URL)
+            root.appendNode('inceptionYear', POM_INCEPTION_YEAR)
+
+            def licenseNode = root.appendNode('licenses').appendNode('license')
+            licenseNode.appendNode('name', POM_LICENSE_NAME)
+            licenseNode.appendNode('url', POM_LICENSE_URL)
+            licenseNode.appendNode('distribution', POM_LICENSE_DIST)
+
+            def scmNode = root.appendNode('scm')
+            scmNode.appendNode('connection', POM_SCM_CONNECTION)
+            scmNode.appendNode('developerConnection', POM_SCM_DEV_CONNECTION)
+            scmNode.appendNode('url', POM_SCM_URL)
+
+            def issueMgmtNode = root.appendNode('issueManagement')
+            issueMgmtNode.appendNode('system', POM_ISSUE_MGMT_SYSTEM)
+            issueMgmtNode.appendNode('url', POM_ISSUE_MGMT_URL)
+
+            def mailingListsNode = root.appendNode('mailingLists')
+            def devListNode = mailingListsNode.appendNode('mailingList')
+            devListNode.appendNode('name', POM_DEV_LIST_NAME)
+            devListNode.appendNode('subscribe', POM_DEV_LIST_SUB)
+            devListNode.appendNode('unsubscribe', POM_DEV_LIST_UNSUB)
+            devListNode.appendNode('post', POM_DEV_LIST_POST)
+            devListNode.appendNode('archive', POM_DEV_LIST_ARCHIVE)
+            def userListNode = mailingListsNode.appendNode('mailingList')
+            userListNode.appendNode('name', POM_USER_LIST_NAME)
+            userListNode.appendNode('subscribe', POM_USER_LIST_SUB)
+            userListNode.appendNode('unsubscribe', POM_USER_LIST_UNSUB)
+            userListNode.appendNode('post', POM_USER_LIST_POST)
+            userListNode.appendNode('archive', POM_USER_LIST_ARCHIVE)
+            def commitListNode = mailingListsNode.appendNode('mailingList')
+            commitListNode.appendNode('name', POM_COMMIT_LIST_NAME)
+            commitListNode.appendNode('subscribe', POM_COMMIT_LIST_SUB)
+            commitListNode.appendNode('unsubscribe', POM_COMMIT_LIST_UNSUB)
+            commitListNode.appendNode('post', POM_COMMIT_LIST_POST)
+            commitListNode.appendNode('archive', POM_COMMIT_LIST_ARCHIVE)
+
+            def developerNode = root.appendNode('developers').appendNode('developer')
+            developerNode.appendNode('name', POM_DEVELOPER_NAME)
+            developerNode.appendNode('email', POM_DEVELOPER_EMAIL)
+            developerNode.appendNode('url', POM_DEVELOPER_URL)
+            developerNode.appendNode('organization', POM_DEVELOPER_ORG)
+            developerNode.appendNode('organizationUrl', POM_DEVELOPER_ORG_URL)
+
+            // Iterate over the dependencies that would exist post shading,
+            // adding a <dependency> node for each
+            def dependenciesNode = root.appendNode('dependencies')
+            configurations.shadow.allDependencies.each {
+              def dependencyNode = dependenciesNode.appendNode('dependency')
+              dependencyNode.appendNode('groupId', it.group)
+              dependencyNode.appendNode('artifactId', it.name)
+              dependencyNode.appendNode('version', it.version)
+
+              // TODO: Should we use the runtime scope which forces all our
+              // consumers to declare what they consume?
+              dependencyNode.appendNode('scope', 'compile')
+
+              // Start with any exclusions that were added via configuration exclude rules.
+              // Then add all the exclusions that are specific to the dependency (if any
+              // were declared). Finally build the node that represents all exclusions.
+              def exclusions = []
+              exclusions += configurations.shadow.excludeRules
+              if (it.hasProperty('excludeRules')) {
+                exclusions += it.excludeRules
+              }
+              if (!exclusions.empty) {
+                def exclusionsNode = dependencyNode.appendNode('exclusions')
+                for (ExcludeRule exclude : exclusions) {
+                  def exclusionNode = exclusionsNode.appendNode('exclusion')
+                  exclusionNode.appendNode('groupId', exclude.group)
+                  exclusionNode.appendNode('artifactId', exclude.module)
+                }
+              }
             }
-            artifact testSourcesJar {
-              classifier "test-sources"
+
+            // NB: This must come after asNode() logic, as it seems asNode()
+            // removes XML comments.
+            // TODO: Load this from file?
+            def elem = asElement()
+            def hdr = elem.getOwnerDocument().createComment(
+                    '''
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You 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.
+''')
+            elem.insertBefore(hdr, elem.getFirstChild())
+
+            // create the sign pom artifact
+            def pomFile = file("${project.buildDir}/generated-pom.xml")
+            writeTo(pomFile)
+            if (isRelease()) {
+              def pomAscFile = signing.sign(pomFile).signatureFiles[0]
+              artifact(pomAscFile) {
+                classifier = null
+                extension = 'pom.asc'
+              }
             }
-            artifact javadocJar {
-              classifier "javadoc"
+          }
+
+          // create the signed artifacts
+          if (isRelease()) {
+            project.tasks.signArchives.signatureFiles.each {
+              artifact(it) {
+                def matcher = it.file =~ /-(tests|sources|test-sources|javadoc)\.jar\.asc$/
+                if (matcher.find()) {
+                  classifier = matcher.group(1)
+                } else {
+                  classifier = null
+                }
+                extension = 'jar.asc'
+              }
             }
           }
         }
       }
     }
-
-    // TODO: Figure out how to create ShadowJar task for ShadowTestJar here
-    // that is extendable within each sub-project with any additional includes.
-    // This could mirror the "shadowJar" configuration block.
-    // Optionally, we could also copy the shading configuration from the main
-    // source set and apply it here.
-    //
-    // Shading the test jar has a lot less need but can still be beneficial for
-    // resolving class conflicts for tests during test execution or exposing
-    // test libraries for users.
   }
 
   // Ban these dependencies from all configurations
diff --git a/examples/java/build.gradle b/examples/java/build.gradle
index cf1dccccced..d9f25fb2e67 100644
--- a/examples/java/build.gradle
+++ b/examples/java/build.gradle
@@ -19,9 +19,12 @@
 import groovy.json.JsonOutput
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-examples-java")
+applyJavaNature()
 
 description = "Apache Beam :: Examples :: Java"
+ext.summary = """Apache Beam SDK provides a simple, Java-based
+interface for processing virtually any size data. This
+artifact includes all Apache Beam Java SDK examples."""
 
 /*
  * We need to rely on manually specifying these evaluationDependsOn to ensure that
@@ -30,7 +33,7 @@ description = "Apache Beam :: Examples :: Java"
  * TODO: Swap to generating test artifacts which we can then rely on instead of
  * the test outputs directly.
  */
-evaluationDependsOn(":sdks:java:io:google-cloud-platform")
+evaluationDependsOn(":beam-sdks-java-io-google-cloud-platform")
 
 /** Define the list of runners which execute a precommit test. */
 // https://issues.apache.org/jira/browse/BEAM-3583
@@ -47,9 +50,9 @@ configurations.sparkRunnerPreCommit {
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
-  shadow project(path: ":sdks:java:extensions:google-cloud-platform-core", configuration: "shadow")
-  shadow project(path: ":sdks:java:io:google-cloud-platform", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-extensions-google-cloud-platform-core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-io-google-cloud-platform", configuration: "shadow")
   shadow library.java.google_api_client
   shadow library.java.google_api_services_bigquery
   shadow library.java.findbugs_jsr305
@@ -63,9 +66,9 @@ dependencies {
   shadow library.java.datastore_v1_protos
   shadow library.java.joda_time
   shadow library.java.slf4j_api
-  shadow project(path: ":runners:direct-java", configuration: "shadow")
+  shadow project(path: ":beam-runners-direct-java", configuration: "shadow")
   shadow library.java.slf4j_jdk14
-  shadowTest project(":sdks:java:io:google-cloud-platform").sourceSets.test.output
+  shadowTest project(":beam-sdks-java-io-google-cloud-platform").sourceSets.test.output
   shadowTest library.java.hamcrest_core
   shadowTest library.java.junit
   shadowTest library.java.mockito_core
@@ -73,17 +76,17 @@ dependencies {
   // Add dependencies for the PreCommit configurations
   // For each runner a project level dependency on the examples project.
   for (String runner : preCommitRunners) {
-    delegate.add(runner + "PreCommit", project(path: ":examples:java", configuration: "shadow"))
-    delegate.add(runner + "PreCommit", project(path: ":examples:java", configuration: "shadowTest"))
+    delegate.add(runner + "PreCommit", project(path: ":beam-examples-java", configuration: "shadow"))
+    delegate.add(runner + "PreCommit", project(path: ":beam-examples-java", configuration: "shadowTest"))
   }
   // https://issues.apache.org/jira/browse/BEAM-3583
-  // apexRunnerPreCommit project(path: ":runners:apex", configuration: "shadow")
-  dataflowRunnerPreCommit project(path: ":runners:google-cloud-dataflow-java", configuration: "shadow")
-  dataflowStreamingRunnerPreCommit project(path: ":runners:google-cloud-dataflow-java", configuration: "shadow")
-  directRunnerPreCommit project(path: ":runners:direct-java", configuration: "shadow")
-  flinkRunnerPreCommit project(path: ":runners:flink", configuration: "shadow")
-  sparkRunnerPreCommit project(path: ":runners:spark", configuration: "shadow")
-  sparkRunnerPreCommit project(path: ":sdks:java:io:hadoop-file-system", configuration: "shadow")
+  // apexRunnerPreCommit project(path: ":beam-runners-apex", configuration: "shadow")
+  dataflowRunnerPreCommit project(path: ":beam-runners-google-cloud-dataflow-java", configuration: "shadow")
+  dataflowStreamingRunnerPreCommit project(path: ":beam-runners-google-cloud-dataflow-java", configuration: "shadow")
+  directRunnerPreCommit project(path: ":beam-runners-direct-java", configuration: "shadow")
+  flinkRunnerPreCommit project(path: ":beam-runners-flink_2.11", configuration: "shadow")
+  sparkRunnerPreCommit project(path: ":beam-runners-spark", configuration: "shadow")
+  sparkRunnerPreCommit project(path: ":beam-sdks-java-io-hadoop-file-system", configuration: "shadow")
   sparkRunnerPreCommit library.java.spark_streaming
   sparkRunnerPreCommit library.java.spark_core
 }
diff --git a/gradle.properties b/gradle.properties
index a89dc72f7cb..62adf39d89c 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -18,3 +18,37 @@
 org.gradle.parallel=true
 org.gradle.configureondemand=true
 offlineRepositoryRoot=offline-repository
+signing.gnupg.executable=gpg
+signing.gnupg.useLegacyGpg=true
+
+POM_URL=http://beam.apache.org
+POM_INCEPTION_YEAR=2016
+POM_LICENSE_NAME=Apache License, Version 2.0
+POM_LICENSE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
+POM_LICENSE_DIST=repo
+POM_SCM_CONNECTION=scm:git:https://gitbox.apache.org/repos/asf/beam.git
+POM_SCM_DEV_CONNECTION=scm:git:https://gitbox.apache.org/repos/asf/beam.git
+POM_SCM_URL=https://gitbox.apache.org/repos/asf?p=beam.git;a=summary
+POM_ISSUE_MGMT_SYSTEM=jira
+POM_ISSUE_MGMT_URL=https://issues.apache.org/jira/browse/BEAM
+POM_DEV_LIST_NAME=Beam Dev
+POM_DEV_LIST_SUB=dev-subscribe@beam.apache.org
+POM_DEV_LIST_UNSUB=dev-unsubscribe@beam.apache.org
+POM_DEV_LIST_POST=dev@beam.apache.org
+POM_DEV_LIST_ARCHIVE=http://www.mail-archive.com/dev%beam.apache.org
+POM_USER_LIST_NAME=Beam User
+POM_USER_LIST_SUB=user-subscribe@beam.apache.org
+POM_USER_LIST_UNSUB=unsubscribe>user-unsubscribe@beam.apache.org
+POM_USER_LIST_POST=user@beam.apache.org
+POM_USER_LIST_ARCHIVE=http://www.mail-archive.com/user%beam.apache.org
+POM_COMMIT_LIST_NAME=Beam Commits
+POM_COMMIT_LIST_SUB=commits-subscribe@beam.apache.org
+POM_COMMIT_LIST_UNSUB=commits-unsubscribe@beam.apache.org
+POM_COMMIT_LIST_POST=commits@beam.apache.org
+POM_COMMIT_LIST_ARCHIVE=http://www.mail-archive.com/commits%beam.apache.org
+POM_DEVELOPER_NAME=The Apache Beam Team
+POM_DEVELOPER_EMAIL=dev@beam.apache.org
+POM_DEVELOPER_URL=http://beam.apache.org
+POM_DEVELOPER_ORG=Apache Software Foundation
+POM_DEVELOPER_ORG_URL=http://www.apache.org
+
diff --git a/model/fn-execution/build.gradle b/model/fn-execution/build.gradle
index 79c47b4712b..1b4fd224ad8 100644
--- a/model/fn-execution/build.gradle
+++ b/model/fn-execution/build.gradle
@@ -17,14 +17,15 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-model-fn-execution", enableFindbugs: false)
+applyJavaNature(enableFindbugs: false)
 applyGrpcNature()
 
 description = "Apache Beam :: Model :: Fn Execution"
+ext.summary = "Portable definitions for execution user-defined functions."
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":model:pipeline", configuration: "shadow")
+  shadow project(path: ":beam-model-pipeline", configuration: "shadow")
   shadow library.java.protobuf_java
   shadow library.java.grpc_core
   shadow library.java.grpc_protobuf
diff --git a/model/job-management/build.gradle b/model/job-management/build.gradle
index 96a71d96d6a..1be9d6e4ddd 100644
--- a/model/job-management/build.gradle
+++ b/model/job-management/build.gradle
@@ -17,14 +17,15 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-model-job-management", enableFindbugs: false)
+applyJavaNature(enableFindbugs: false)
 applyGrpcNature()
 
 description = "Apache Beam :: Model :: Job Management"
+ext.summary = "Portable definitions for submitting pipelines."
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":model:pipeline", configuration: "shadow")
+  shadow project(path: ":beam-model-pipeline", configuration: "shadow")
   shadow library.java.protobuf_java
   shadow library.java.grpc_core
   shadow library.java.grpc_protobuf
diff --git a/model/pipeline/build.gradle b/model/pipeline/build.gradle
index b0cff40bffa..275a59c79d1 100644
--- a/model/pipeline/build.gradle
+++ b/model/pipeline/build.gradle
@@ -17,10 +17,11 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-model-pipeline", enableFindbugs: false)
+applyJavaNature(enableFindbugs: false)
 applyGrpcNature()
 
 description = "Apache Beam :: Model :: Pipeline"
+ext.summary = "Portable definitions for building pipelines"
 
 dependencies {
   shadow library.java.protobuf_java
diff --git a/release/build.gradle b/release/build.gradle
index 95b3170f583..ebde4cf74da 100644
--- a/release/build.gradle
+++ b/release/build.gradle
@@ -28,9 +28,9 @@ dependencies {
 }
 
 task runQuickstartsJava {
-  dependsOn ":runners:direct-java:runQuickstartJavaDirect"
-  dependsOn ":runners:google-cloud-dataflow-java:runQuickstartJavaDataflow"
-  dependsOn ":runners:apex:runQuickstartJavaApex"
-  dependsOn ":runners:spark:runQuickstartJavaSpark"
-  dependsOn ":runners:flink:runQuickstartJavaFlinkLocal"
+  dependsOn ":beam-runners-direct-java:runQuickstartJavaDirect"
+  dependsOn ":beam-runners-google-cloud-dataflow-java:runQuickstartJavaDataflow"
+  dependsOn ":beam-runners-apex:runQuickstartJavaApex"
+  dependsOn ":beam-runners-spark:runQuickstartJavaSpark"
+  dependsOn ":beam-runners-flink_2.11:runQuickstartJavaFlinkLocal"
 }
diff --git a/runners/apex/build.gradle b/runners/apex/build.gradle
index 1ddb855b585..077a577ef53 100644
--- a/runners/apex/build.gradle
+++ b/runners/apex/build.gradle
@@ -19,7 +19,7 @@
 import groovy.json.JsonOutput
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-runners-apex")
+applyJavaNature()
 
 description = "Apache Beam :: Runners :: Apex"
 
@@ -30,33 +30,33 @@ description = "Apache Beam :: Runners :: Apex"
  * TODO: Swap to generating test artifacts which we can then rely on instead of
  * the test outputs directly.
  */
-evaluationDependsOn(":model:fn-execution")
-evaluationDependsOn(":runners:core-java")
-evaluationDependsOn(":sdks:java:core")
+evaluationDependsOn(":beam-model-fn-execution")
+evaluationDependsOn(":beam-runners-core-java")
+evaluationDependsOn(":beam-sdks-java-core")
 
 configurations {
   validatesRunner
 }
 
 dependencies {
-  shadow project(path: ":model:pipeline", configuration: "shadow")
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
-  shadow project(path: ":runners:core-construction-java", configuration: "shadow")
-  shadow project(path: ":runners:core-java", configuration: "shadow")
+  shadow project(path: ":beam-model-pipeline", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
+  shadow project(path: ":beam-runners-core-construction-java", configuration: "shadow")
+  shadow project(path: ":beam-runners-core-java", configuration: "shadow")
   shadow library.java.apex_common
   shadow library.java.malhar_library
   shadow library.java.apex_engine
   shadow library.java.commons_lang3
   shadow library.java.findbugs_jsr305
   shadow library.java.apex_engine
-  shadowTest project(path: ":sdks:java:core", configuration: "shadowTest")
+  shadowTest project(path: ":beam-sdks-java-core", configuration: "shadowTest")
   // ApexStateInternalsTest extends abstract StateInternalsTest
-  shadowTest project(":runners:core-java").sourceSets.test.output
+  shadowTest project(":beam-runners-core-java").sourceSets.test.output
   shadowTest library.java.hamcrest_core
   shadowTest library.java.junit
   shadowTest library.java.mockito_core
   shadowTest library.java.jackson_dataformat_yaml
-  validatesRunner project(path: ":sdks:java:core", configuration: "shadowTest")
+  validatesRunner project(path: ":beam-sdks-java-core", configuration: "shadowTest")
   validatesRunner project(path: project.path, configuration: "shadow")
 }
 
@@ -89,7 +89,7 @@ task validatesRunnerBatch(type: Test) {
   ])
 
   classpath = configurations.validatesRunner
-  testClassesDirs = files(project(":sdks:java:core").sourceSets.test.output.classesDirs)
+  testClassesDirs = files(project(":beam-sdks-java-core").sourceSets.test.output.classesDirs)
   useJUnit {
     includeCategories 'org.apache.beam.sdk.testing.ValidatesRunner'
     excludeCategories 'org.apache.beam.sdk.testing.FlattenWithHeterogeneousCoders'
@@ -108,5 +108,5 @@ task validatesRunner {
   dependsOn validatesRunnerBatch
 }
 
-// Generates :runners:apex:runQuickstartJavaApex
+// Generates :beam-runners-apex:runQuickstartJavaApex
 createJavaQuickstartValidationTask(name: 'Apex')
diff --git a/runners/core-construction-java/build.gradle b/runners/core-construction-java/build.gradle
index d09f9082aff..40e2599ee0b 100644
--- a/runners/core-construction-java/build.gradle
+++ b/runners/core-construction-java/build.gradle
@@ -17,9 +17,12 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-runners-core-construction-java")
+applyJavaNature()
 
 description = "Apache Beam :: Runners :: Core Construction Java"
+ext.summary = """Beam Runners Core provides utilities to aid runner authors interact with a Pipeline
+prior to execution."""
+
 
 // Exclude tests that need a runner
 test {
@@ -32,9 +35,9 @@ test {
 dependencies {
   compile library.java.guava
   compileOnly library.java.findbugs_annotations
-  shadow project(path: ":model:pipeline", configuration: "shadow")
-  shadow project(path: ":model:job-management", configuration: "shadow")
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
+  shadow project(path: ":beam-model-pipeline", configuration: "shadow")
+  shadow project(path: ":beam-model-job-management", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
   shadow library.java.jackson_annotations
   shadow library.java.jackson_databind
   shadow library.java.jackson_core
diff --git a/runners/core-java/build.gradle b/runners/core-java/build.gradle
index 05e27915380..129618ee271 100644
--- a/runners/core-java/build.gradle
+++ b/runners/core-java/build.gradle
@@ -17,9 +17,10 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-runners-core-java")
+applyJavaNature()
 
 description = "Apache Beam :: Runners :: Core Java"
+ext.summary = "Beam Runners Core provides utilities to aid runner authors."
 
 // Exclude tests that need a runner
 test {
@@ -32,16 +33,16 @@ test {
 dependencies {
   compile library.java.guava
   compileOnly library.java.findbugs_annotations
-  shadow project(path: ":model:pipeline", configuration: "shadow")
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
-  shadow project(path: ":model:fn-execution", configuration: "shadow")
-  shadow project(path: ":runners:core-construction-java", configuration: "shadow")
+  shadow project(path: ":beam-model-pipeline", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
+  shadow project(path: ":beam-model-fn-execution", configuration: "shadow")
+  shadow project(path: ":beam-runners-core-construction-java", configuration: "shadow")
   shadow library.java.findbugs_jsr305
   shadow library.java.grpc_core
   shadow library.java.grpc_stub
   shadow library.java.joda_time
   shadow library.java.slf4j_api
-  shadowTest project(path: ":sdks:java:core", configuration: "shadowTest")
+  shadowTest project(path: ":beam-sdks-java-core", configuration: "shadowTest")
   shadowTest library.java.hamcrest_core
   shadowTest library.java.mockito_core
   shadowTest library.java.junit
diff --git a/runners/direct-java/build.gradle b/runners/direct-java/build.gradle
index a7143eda283..5779dffbb7b 100644
--- a/runners/direct-java/build.gradle
+++ b/runners/direct-java/build.gradle
@@ -19,7 +19,7 @@
 import groovy.json.JsonOutput
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-runners-direct-java")
+applyJavaNature()
 
 description = "Apache Beam :: Runners :: Direct Java"
 
@@ -28,10 +28,10 @@ description = "Apache Beam :: Runners :: Direct Java"
  * the following projects are evaluated before we evaluate this project. This is because
  * we are attempting to reference the "sourceSets.test.output" directly.
  */
-evaluationDependsOn(":model:fn-execution")
-evaluationDependsOn(":runners:core-construction-java")
-evaluationDependsOn(":runners:core-java")
-evaluationDependsOn(":sdks:java:core")
+evaluationDependsOn(":beam-model-fn-execution")
+evaluationDependsOn(":beam-runners-core-construction-java")
+evaluationDependsOn(":beam-runners-core-java")
+evaluationDependsOn(":beam-sdks-java-core")
 
 configurations {
   needsRunner
@@ -39,18 +39,18 @@ configurations {
 
 dependencies {
   compile library.java.guava
-  compile project(path: ":model:pipeline", configuration: "shadow")
-  compile project(path: ":runners:core-construction-java", configuration: "shadow")
-  compile project(path: ":runners:core-java", configuration: "shadow")
-  compile project(path: ":runners:local-java", configuration: "shadow")
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
+  compile project(path: ":beam-model-pipeline", configuration: "shadow")
+  compile project(path: ":beam-runners-core-construction-java", configuration: "shadow")
+  compile project(path: ":beam-runners-core-java", configuration: "shadow")
+  compile project(path: ":beam-runners-local-java-core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
   shadow library.java.joda_time
   shadow library.java.findbugs_jsr305
   shadow library.java.slf4j_api
   shadow library.java.hamcrest_core
   shadow library.java.junit
-  shadowTest project(path: ":sdks:java:core", configuration: "shadowTest")
-  shadowTest project(path: ":runners:core-java", configuration: "shadowTest")
+  shadowTest project(path: ":beam-sdks-java-core", configuration: "shadowTest")
+  shadowTest project(path: ":beam-runners-core-java", configuration: "shadowTest")
   shadowTest library.java.guava_testlib
   shadowTest library.java.slf4j_jdk14
   shadowTest library.java.mockito_core
@@ -58,9 +58,9 @@ dependencies {
   shadowTest library.java.woodstox_core_asl
   shadowTest library.java.google_cloud_dataflow_java_proto_library_all
   shadowTest library.java.jackson_dataformat_yaml
-  needsRunner project(path: ":runners:core-construction-java", configuration: "shadowTest")
-  needsRunner project(path: ":runners:core-java", configuration: "shadowTest")
-  needsRunner project(path: ":sdks:java:core", configuration: "shadowTest")
+  needsRunner project(path: ":beam-runners-core-construction-java", configuration: "shadowTest")
+  needsRunner project(path: ":beam-runners-core-java", configuration: "shadowTest")
+  needsRunner project(path: ":beam-sdks-java-core", configuration: "shadowTest")
   needsRunner project(path: project.path, configuration: "shadow")
   needsRunner project(path: project.path, configuration: "shadowTest")
 }
@@ -75,9 +75,9 @@ task needsRunnerTests(type: Test) {
   classpath = configurations.needsRunner
   // NOTE: We only add to the test class dirs to ensure that the direct runner
   // tests (i.e., those from this subproject) get scanned.
-  testClassesDirs += files(project(":runners:core-construction-java").sourceSets.test.output.classesDirs)
-  testClassesDirs += files(project(":runners:core-java").sourceSets.test.output.classesDirs)
-  testClassesDirs += files(project(":sdks:java:core").sourceSets.test.output.classesDirs)
+  testClassesDirs += files(project(":beam-runners-core-construction-java").sourceSets.test.output.classesDirs)
+  testClassesDirs += files(project(":beam-runners-core-java").sourceSets.test.output.classesDirs)
+  testClassesDirs += files(project(":beam-sdks-java-core").sourceSets.test.output.classesDirs)
   useJUnit {
     includeCategories "org.apache.beam.sdk.testing.NeedsRunner"
     excludeCategories "org.apache.beam.sdk.testing.LargeKeys\$Above100MB"
@@ -88,10 +88,10 @@ shadowJar {
   dependencies {
     include(dependency(library.java.protobuf_java))
     include(dependency(library.java.protobuf_java_util))
-    include(project(path: ":model:pipeline", configuration: "shadow"))
-    include(project(path: ":runners:core-construction-java", configuration: "shadow"))
-    include(project(path: ":runners:core-java", configuration: "shadow"))
-    include(project(path: ":runners:local-java", configuration: "shadow"))
+    include(project(path: ":beam-model-pipeline", configuration: "shadow"))
+    include(project(path: ":beam-runners-core-construction-java", configuration: "shadow"))
+    include(project(path: ":beam-runners-core-java", configuration: "shadow"))
+    include(project(path: ":beam-runners-local-java-core", configuration: "shadow"))
   }
   relocate "org.apache.beam.runners.core", getJavaRelocatedPath("runners.core")
   relocate "org.apache.beam.model", getJavaRelocatedPath("model")
@@ -109,10 +109,10 @@ task shadowTestJar(type: com.github.jengelman.gradle.plugins.shadow.tasks.Shadow
     include(dependency(library.java.guava))
     include(dependency(library.java.protobuf_java))
     include(dependency(library.java.protobuf_java_util))
-    include(project(path: ":model:pipeline", configuration: "shadow"))
-    include(project(path: ":runners:core-construction-java", configuration: "shadow"))
-    include(project(path: ":runners:core-java", configuration: "shadow"))
-    include(project(path: ":runners:local-java", configuration: "shadow"))
+    include(project(path: ":beam-model-pipeline", configuration: "shadow"))
+    include(project(path: ":beam-runners-core-construction-java", configuration: "shadow"))
+    include(project(path: ":beam-runners-core-java", configuration: "shadow"))
+    include(project(path: ":beam-runners-local-java-core", configuration: "shadow"))
   }
   relocate("com.google.common", getJavaRelocatedPath("com.google.common")) {
     // com.google.common is too generic, need to exclude guava-testlib
@@ -131,5 +131,5 @@ artifacts {
   shadowTest shadowTestJar
 }
 
-// Generates :runners:direct-java:runQuickstartJavaDirect
+// Generates :beam-runners-direct-java:runQuickstartJavaDirect
 createJavaQuickstartValidationTask(name: 'Direct')
diff --git a/runners/flink/build.gradle b/runners/flink/build.gradle
index 3df88913153..4cf9d1e1c32 100644
--- a/runners/flink/build.gradle
+++ b/runners/flink/build.gradle
@@ -19,7 +19,7 @@
 import groovy.json.JsonOutput
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-runners-flink_2.11")
+applyJavaNature()
 
 description = "Apache Beam :: Runners :: Flink"
 
@@ -30,9 +30,9 @@ description = "Apache Beam :: Runners :: Flink"
  * TODO: Swap to generating test artifacts which we can then rely on instead of
  * the test outputs directly.
  */
-evaluationDependsOn(":model:fn-execution")
-evaluationDependsOn(":runners:core-java")
-evaluationDependsOn(":sdks:java:core")
+evaluationDependsOn(":beam-model-fn-execution")
+evaluationDependsOn(":beam-runners-core-java")
+evaluationDependsOn(":beam-sdks-java-core")
 
 test {
   systemProperty "log4j.configuration", "log4j-test.properties"
@@ -50,9 +50,9 @@ def flink_version = "1.4.0"
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
-  shadow project(path: ":runners:core-java", configuration: "shadow")
-  shadow project(path: ":runners:core-construction-java", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
+  shadow project(path: ":beam-runners-core-java", configuration: "shadow")
+  shadow project(path: ":beam-runners-core-construction-java", configuration: "shadow")
   shadow library.java.jackson_annotations
   shadow library.java.findbugs_jsr305
   shadow library.java.slf4j_api
@@ -64,21 +64,21 @@ dependencies {
   shadow "org.apache.flink:flink-java:$flink_version"
   shadow "org.apache.flink:flink-runtime_2.11:$flink_version"
   shadow "org.apache.flink:flink-streaming-java_2.11:$flink_version"
-  shadowTest project(path: ":sdks:java:core", configuration: "shadowTest")
+  shadowTest project(path: ":beam-sdks-java-core", configuration: "shadowTest")
   // FlinkStateInternalsTest extends abstract StateInternalsTest
-  shadowTest project(":runners:core-java").sourceSets.test.output
+  shadowTest project(":beam-runners-core-java").sourceSets.test.output
   shadowTest library.java.commons_lang3
   shadowTest library.java.hamcrest_core
   shadowTest library.java.junit
   shadowTest library.java.mockito_core
   shadowTest library.java.google_api_services_bigquery
-  shadowTest project(path: ":sdks:java:io:google-cloud-platform", configuration: "shadow")
+  shadowTest project(path: ":beam-sdks-java-io-google-cloud-platform", configuration: "shadow")
   shadowTest library.java.jackson_dataformat_yaml
   shadowTest "org.apache.flink:flink-core:$flink_version:tests"
   shadowTest "org.apache.flink:flink-runtime_2.11:$flink_version:tests"
   shadowTest "org.apache.flink:flink-streaming-java_2.11:$flink_version:tests"
   shadowTest "org.apache.flink:flink-test-utils_2.11:$flink_version"
-  validatesRunner project(path: ":sdks:java:core", configuration: "shadowTest")
+  validatesRunner project(path: ":beam-sdks-java-core", configuration: "shadowTest")
   validatesRunner project(path: project.path, configuration: "shadow")
 }
 
@@ -96,7 +96,7 @@ def createValidatesRunnerTask(Map m) {
     def pipelineOptions = JsonOutput.toJson(["--runner=TestFlinkRunner", "--streaming=${config.streaming}"])
     systemProperty "beamTestPipelineOptions", pipelineOptions
     classpath = configurations.validatesRunner
-    testClassesDirs = files(project(":sdks:java:core").sourceSets.test.output.classesDirs)
+    testClassesDirs = files(project(":beam-sdks-java-core").sourceSets.test.output.classesDirs)
     maxParallelForks 4
     if (config.streaming) {
       useJUnit {
@@ -129,5 +129,5 @@ task validatesRunner {
   dependsOn validatesRunnerStreaming
 }
 
-// Generates :runners:flink:runQuickstartJavaFlinkLocal
+// Generates :beam-runners-flink_2.11:runQuickstartJavaFlinkLocal
 createJavaQuickstartValidationTask(name: 'FlinkLocal')
diff --git a/runners/gcp/gcemd/build.gradle b/runners/gcp/gcemd/build.gradle
index 69338090697..9635a284f96 100644
--- a/runners/gcp/gcemd/build.gradle
+++ b/runners/gcp/gcemd/build.gradle
@@ -25,14 +25,14 @@ description = "Apache Beam :: Runners :: Google Cloud Platform :: GCE metadata p
 // Figure out why the golang plugin does not add a build dependency between projects.
 // Without the line below, we get spurious errors about not being able to resolve
 // "./github.com/apache/beam/sdks/go"
-resolveBuildDependencies.dependsOn ":sdks:go:build"
+resolveBuildDependencies.dependsOn ":beam-sdks-go:build"
 
 dependencies {
   golang {
     // TODO(herohde): use "./" prefix to prevent gogradle use base github path, for now.
     // TODO(herohde): get the pkg subdirectory only, if possible. We spend mins pulling cmd/beamctl deps.
-    build name: './github.com/apache/beam/sdks/go', dir: project(':sdks:go').projectDir
-    test name: './github.com/apache/beam/sdks/go', dir: project(':sdks:go').projectDir
+    build name: './github.com/apache/beam/sdks/go', dir: project(':beam-sdks-go').projectDir
+    test name: './github.com/apache/beam/sdks/go', dir: project(':beam-sdks-go').projectDir
   }
 }
 
diff --git a/runners/gcp/gcsproxy/build.gradle b/runners/gcp/gcsproxy/build.gradle
index 92337737c15..e022a84d9a3 100644
--- a/runners/gcp/gcsproxy/build.gradle
+++ b/runners/gcp/gcsproxy/build.gradle
@@ -25,14 +25,14 @@ description = "Apache Beam :: Runners :: Google Cloud Platform :: GCS artifact p
 // Figure out why the golang plugin does not add a build dependency between projects.
 // Without the line below, we get spurious errors about not being able to resolve
 // "./github.com/apache/beam/sdks/go"
-resolveBuildDependencies.dependsOn ":sdks:go:build"
+resolveBuildDependencies.dependsOn ":beam-sdks-go:build"
 
 dependencies {
   golang {
     // TODO(herohde): use "./" prefix to prevent gogradle use base github path, for now.
     // TODO(herohde): get the pkg subdirectory only, if possible. We spend mins pulling cmd/beamctl deps.
-    build name: './github.com/apache/beam/sdks/go', dir: project(':sdks:go').projectDir
-    test name: './github.com/apache/beam/sdks/go', dir: project(':sdks:go').projectDir
+    build name: './github.com/apache/beam/sdks/go', dir: project(':beam-sdks-go').projectDir
+    test name: './github.com/apache/beam/sdks/go', dir: project(':beam-sdks-go').projectDir
   }
 }
 
diff --git a/runners/gearpump/build.gradle b/runners/gearpump/build.gradle
index b9181c0c9a7..626e9bf846e 100644
--- a/runners/gearpump/build.gradle
+++ b/runners/gearpump/build.gradle
@@ -19,11 +19,11 @@
 import groovy.json.JsonOutput
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-runners-gearpump")
+applyJavaNature()
 
 description = "Apache Beam :: Runners :: Gearpump"
 
-evaluationDependsOn(":sdks:java:core")
+evaluationDependsOn(":beam-sdks-java-core")
 
 def gearpump_version = "0.8.4"
 
@@ -35,21 +35,21 @@ dependencies {
   compile library.java.guava
   compileOnly "com.typesafe:config:1.3.0"
   compileOnly "org.scala-lang:scala-library:2.11.8"
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
-  shadow project(path: ":runners:core-java", configuration: "shadow")
-  shadow project(path: ":runners:core-construction-java", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
+  shadow project(path: ":beam-runners-core-java", configuration: "shadow")
+  shadow project(path: ":beam-runners-core-construction-java", configuration: "shadow")
   shadow "org.apache.gearpump:gearpump-core_2.11:$gearpump_version"
   shadow "org.apache.gearpump:gearpump-streaming_2.11:$gearpump_version"
   shadow library.java.joda_time
   shadow library.java.jackson_annotations
   shadow library.java.findbugs_jsr305
-  shadowTest project(path: ":sdks:java:core", configuration: "shadowTest")
+  shadowTest project(path: ":beam-sdks-java-core", configuration: "shadowTest")
   shadowTest library.java.junit
   shadowTest library.java.hamcrest_core
   shadowTest library.java.jackson_databind
   shadowTest library.java.jackson_dataformat_yaml
   shadowTest library.java.mockito_core
-  validatesRunner project(path: ":sdks:java:core", configuration: "shadowTest")
+  validatesRunner project(path: ":beam-sdks-java-core", configuration: "shadowTest")
   validatesRunner project(path: project.path, configuration: "shadow")
 }
 
@@ -61,7 +61,7 @@ task validatesRunnerStreaming(type: Test) {
   ])
 
   classpath = configurations.validatesRunner
-  testClassesDirs = files(project(":sdks:java:core").sourceSets.test.output.classesDirs)
+  testClassesDirs = files(project(":beam-sdks-java-core").sourceSets.test.output.classesDirs)
   useJUnit {
     includeCategories 'org.apache.beam.sdk.testing.ValidatesRunner'
     excludeCategories 'org.apache.beam.sdk.testing.FlattenWithHeterogeneousCoders'
diff --git a/runners/google-cloud-dataflow-java/build.gradle b/runners/google-cloud-dataflow-java/build.gradle
index 0c12e5aba9c..555a61b1e63 100644
--- a/runners/google-cloud-dataflow-java/build.gradle
+++ b/runners/google-cloud-dataflow-java/build.gradle
@@ -19,8 +19,7 @@
 import groovy.json.JsonOutput
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(enableFindbugs: false /* BEAM-925 */,
-    artifactId: "beam-runners-google-cloud-dataflow-java")
+applyJavaNature(enableFindbugs: false /* BEAM-925 */)
 
 description = "Apache Beam :: Runners :: Google Cloud Dataflow"
 
@@ -31,10 +30,10 @@ description = "Apache Beam :: Runners :: Google Cloud Dataflow"
  * TODO: Swap to generating test artifacts which we can then rely on instead of
  * the test outputs directly.
  */
-evaluationDependsOn(":sdks:java:io:google-cloud-platform")
-evaluationDependsOn(":sdks:java:extensions:google-cloud-platform-core")
-evaluationDependsOn(":model:fn-execution")
-evaluationDependsOn(":sdks:java:core")
+evaluationDependsOn(":beam-sdks-java-io-google-cloud-platform")
+evaluationDependsOn(":beam-sdks-java-extensions-google-cloud-platform-core")
+evaluationDependsOn(":beam-model-fn-execution")
+evaluationDependsOn(":beam-sdks-java-core")
 
 processResources {
   filter org.apache.tools.ant.filters.ReplaceTokens, tokens: [
@@ -56,11 +55,11 @@ configurations {
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":model:pipeline", configuration: "shadow")
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
-  shadow project(path: ":sdks:java:extensions:google-cloud-platform-core", configuration: "shadow")
-  shadow project(path: ":sdks:java:io:google-cloud-platform", configuration: "shadow")
-  shadow project(path: ":runners:core-construction-java", configuration: "shadow")
+  shadow project(path: ":beam-model-pipeline", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-extensions-google-cloud-platform-core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-io-google-cloud-platform", configuration: "shadow")
+  shadow project(path: ":beam-runners-core-construction-java", configuration: "shadow")
   shadow library.java.google_api_client
   shadow library.java.google_http_client
   shadow library.java.google_http_client_jackson2
@@ -79,16 +78,16 @@ dependencies {
   shadow library.java.slf4j_api
   shadowTest library.java.hamcrest_core
   shadowTest library.java.junit
-  shadowTest project(":sdks:java:io:google-cloud-platform").sourceSets.test.output
-  shadowTest project(path: ":sdks:java:core", configuration: "shadowTest")
-  shadowTest project(":sdks:java:extensions:google-cloud-platform-core").sourceSets.test.output
+  shadowTest project(":beam-sdks-java-io-google-cloud-platform").sourceSets.test.output
+  shadowTest project(path: ":beam-sdks-java-core", configuration: "shadowTest")
+  shadowTest project(":beam-sdks-java-extensions-google-cloud-platform-core").sourceSets.test.output
   shadowTest library.java.guava_testlib
   shadowTest library.java.slf4j_jdk14
   shadowTest library.java.mockito_core
   shadowTest library.java.google_cloud_dataflow_java_proto_library_all
   shadowTest library.java.datastore_v1_protos
   shadowTest library.java.jackson_dataformat_yaml
-  validatesRunner project(path: ":sdks:java:core", configuration: "shadowTest")
+  validatesRunner project(path: ":beam-sdks-java-core", configuration: "shadowTest")
   validatesRunner project(path: project.path, configuration: "shadow")
 }
 
@@ -108,7 +107,7 @@ task validatesRunnerTest(type: Test) {
 
   maxParallelForks 4
   classpath = configurations.validatesRunner
-  testClassesDirs = files(project(":sdks:java:core").sourceSets.test.output.classesDirs)
+  testClassesDirs = files(project(":beam-sdks-java-core").sourceSets.test.output.classesDirs)
   useJUnit {
     includeCategories 'org.apache.beam.sdk.testing.ValidatesRunner'
     excludeCategories 'org.apache.beam.sdk.testing.LargeKeys$Above10MB'
@@ -131,7 +130,7 @@ task validatesRunner {
   dependsOn validatesRunnerTest
 }
 
-// Generates :runners:google-cloud-dataflow-java:runQuickstartJavaDataflow
+// Generates :beam-runners-google-cloud-dataflow-java:runQuickstartJavaDataflow
 def gcpProject = project.findProperty('gcpProject') ?: 'apache-beam-testing'
 def gcsBucket = project.findProperty('gcsBucket') ?: 'temp-storage-for-release-validation-tests/quickstart'
 createJavaQuickstartValidationTask(name: 'Dataflow', gcpProject: gcpProject, gcsBucket: gcsBucket)
diff --git a/runners/java-fn-execution/build.gradle b/runners/java-fn-execution/build.gradle
index ac8bece711f..9f07ce5e77d 100644
--- a/runners/java-fn-execution/build.gradle
+++ b/runners/java-fn-execution/build.gradle
@@ -16,7 +16,7 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-runners-java-fn-execution")
+applyJavaNature()
 
 description = "Apache Beam :: Runners :: Java Fn Execution"
 
@@ -27,21 +27,21 @@ description = "Apache Beam :: Runners :: Java Fn Execution"
  * TODO: Swap to generating test artifacts which we can then rely on instead of
  * the test outputs directly.
  */
-evaluationDependsOn(":sdks:java:fn-execution")
+evaluationDependsOn(":beam-sdks-java-fn-execution")
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":model:pipeline", configuration: "shadow")
-  shadow project(path: ":model:fn-execution", configuration: "shadow")
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
-  shadow project(path: ":sdks:java:fn-execution", configuration: "shadow")
-  shadow project(path: ":runners:core-construction-java", configuration: "shadow")
+  shadow project(path: ":beam-model-pipeline", configuration: "shadow")
+  shadow project(path: ":beam-model-fn-execution", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-fn-execution", configuration: "shadow")
+  shadow project(path: ":beam-runners-core-construction-java", configuration: "shadow")
   shadow library.java.grpc_core
   shadow library.java.grpc_stub
   shadow library.java.grpc_netty
   shadow library.java.slf4j_api
-  testCompile project(":sdks:java:harness")
-  testCompile project(path: ":runners:core-construction-java", configuration: "shadow")
+  testCompile project(":beam-sdks-java-harness")
+  testCompile project(path: ":beam-runners-core-construction-java", configuration: "shadow")
   testCompile library.java.junit
   testCompile library.java.hamcrest_core
   testCompile library.java.hamcrest_library
diff --git a/runners/local-artifact-service-java/build.gradle b/runners/local-artifact-service-java/build.gradle
index dda4137a2e9..d4761bd5e85 100644
--- a/runners/local-artifact-service-java/build.gradle
+++ b/runners/local-artifact-service-java/build.gradle
@@ -17,21 +17,25 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-local-artifact-service-java")
+applyJavaNature()
 
 description = "Apache Beam :: Runners :: Java Local Artifact Service"
+ext.summary = """The Beam Artifact Service exposes APIs to stage and retrieve
+artifacts in a manner independent of the underlying storage system, for use
+by the Beam portability framework. The local implementation uses the local
+File System as the underlying storage system."""
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":model:job-management", configuration: "shadow")
-  shadow project(path: ":model:pipeline", configuration: "shadow")
-  shadow project(path: ":runners:java-fn-execution", configuration: "shadow")
+  shadow project(path: ":beam-model-job-management", configuration: "shadow")
+  shadow project(path: ":beam-model-pipeline", configuration: "shadow")
+  shadow project(path: ":beam-runners-java-fn-execution", configuration: "shadow")
   shadow library.java.findbugs_jsr305
   shadow library.java.grpc_core
   shadow library.java.grpc_stub
   shadow library.java.protobuf_java
   shadow library.java.slf4j_api
-  testCompile project(path: ":runners:core-construction-java")
+  testCompile project(path: ":beam-runners-core-construction-java")
   testCompile library.java.hamcrest_core
   testCompile library.java.hamcrest_library
   testCompile library.java.mockito_core
diff --git a/runners/local-java/build.gradle b/runners/local-java/build.gradle
index bef0d574ee6..cea6fa0e23b 100644
--- a/runners/local-java/build.gradle
+++ b/runners/local-java/build.gradle
@@ -17,7 +17,7 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-runners-local-java-core")
+applyJavaNature()
 
 description = "Apache Beam :: Runners :: Local Java Core"
 
@@ -28,7 +28,7 @@ dependencies {
    * but should not be used within this library to execute any UDFs.
    * TODO: Add an APISurfaceTest to force this to be the case, if possible.
   */
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
   shadow library.java.joda_time
   shadow library.java.findbugs_jsr305
   shadowTest library.java.hamcrest_core
diff --git a/runners/reference/java/build.gradle b/runners/reference/java/build.gradle
index 96ee67b5cb8..94109baf5de 100644
--- a/runners/reference/java/build.gradle
+++ b/runners/reference/java/build.gradle
@@ -17,13 +17,16 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-runners-reference-java")
+applyJavaNature()
 
 description = "Apache Beam :: Runners :: Reference :: Java"
+ext.summary = """A Java implementation of the Beam Model which utilizes the portability
+framework to execute user-definied functions."""
+
 
 dependencies {
-  shadow project(path: ":model:pipeline", configuration: "shadow")
-  shadow project(path: ":runners:core-construction-java", configuration: "shadow")
+  shadow project(path: ":beam-model-pipeline", configuration: "shadow")
+  shadow project(path: ":beam-runners-core-construction-java", configuration: "shadow")
   shadow library.java.slf4j_api
   testCompile library.java.junit
   testCompile library.java.hamcrest_core
diff --git a/runners/reference/job-server/build.gradle b/runners/reference/job-server/build.gradle
index 30f8f847893..614682626f6 100644
--- a/runners/reference/job-server/build.gradle
+++ b/runners/reference/job-server/build.gradle
@@ -17,22 +17,22 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-runners-reference-job-orchestrator")
+applyJavaNature()
 
 description = "Apache Beam :: Runners :: Reference :: Job Orchestrator"
 
 dependencies {
   shadow library.java.grpc_netty
-  shadow project(path: ":model:job-management", configuration: "shadow")
-  shadow project(path: ":runners:java-fn-execution", configuration: "shadow")
-  shadow project(path: ":runners:reference:java", configuration: "shadow")
-  shadow project(path: ":runners:local-artifact-service-java", configuration: "shadow")
+  shadow project(path: ":beam-model-job-management", configuration: "shadow")
+  shadow project(path: ":beam-runners-java-fn-execution", configuration: "shadow")
+  shadow project(path: ":beam-runners-reference-java", configuration: "shadow")
+  shadow project(path: ":beam-local-artifact-service-java", configuration: "shadow")
   shadow library.java.grpc_core
   shadow library.java.grpc_stub
   shadow library.java.slf4j_api
   shadow library.java.args4j
   testCompile library.java.junit
-  shadowTest project(path: ":runners:core-construction-java", configuration: "shadow")
+  shadowTest project(path: ":beam-runners-core-construction-java", configuration: "shadow")
   shadowTest library.java.hamcrest_core
   shadowTest library.java.slf4j_jdk14
 }
diff --git a/runners/spark/build.gradle b/runners/spark/build.gradle
index 2a573de6c52..cc103908d28 100644
--- a/runners/spark/build.gradle
+++ b/runners/spark/build.gradle
@@ -19,7 +19,7 @@
 import groovy.json.JsonOutput
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-runners-spark")
+applyJavaNature()
 
 description = "Apache Beam :: Runners :: Spark"
 
@@ -30,9 +30,9 @@ description = "Apache Beam :: Runners :: Spark"
  * TODO: Swap to generating test artifacts which we can then rely on instead of
  * the test outputs directly.
  */
-evaluationDependsOn(":model:fn-execution")
-evaluationDependsOn(":runners:core-java")
-evaluationDependsOn(":sdks:java:core")
+evaluationDependsOn(":beam-model-fn-execution")
+evaluationDependsOn(":beam-runners-core-java")
+evaluationDependsOn(":beam-sdks-java-core")
 
 configurations {
   validatesRunner
@@ -56,10 +56,10 @@ test {
 }
 
 dependencies {
-  shadow project(path: ":model:pipeline", configuration: "shadow")
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
-  shadow project(path: ":runners:core-construction-java", configuration: "shadow")
-  shadow project(path: ":runners:core-java", configuration: "shadow")
+  shadow project(path: ":beam-model-pipeline", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
+  shadow project(path: ":beam-runners-core-construction-java", configuration: "shadow")
+  shadow project(path: ":beam-runners-core-java", configuration: "shadow")
   shadow library.java.findbugs_jsr305
   shadow library.java.guava
   shadow library.java.jackson_annotations
@@ -79,17 +79,17 @@ dependencies {
   provided "org.apache.zookeeper:zookeeper:3.4.6"
   provided "org.scala-lang:scala-library:2.11.8"
   provided "com.esotericsoftware.kryo:kryo:2.21"
-  shadowTest project(path: ":sdks:java:io:kafka", configuration: "shadow")
-  shadowTest project(path: ":sdks:java:core", configuration: "shadowTest")
+  shadowTest project(path: ":beam-sdks-java-io-kafka", configuration: "shadow")
+  shadowTest project(path: ":beam-sdks-java-core", configuration: "shadowTest")
   // SparkStateInternalsTest extends abstract StateInternalsTest
-  shadowTest project(":runners:core-java").sourceSets.test.output
+  shadowTest project(":beam-runners-core-java").sourceSets.test.output
   shadowTest library.java.avro
   shadowTest library.java.kafka_clients
   shadowTest library.java.junit
   shadowTest library.java.mockito_core
   shadowTest library.java.jackson_dataformat_yaml
-  shadowTest library.java.kafka_2_11
-  validatesRunner project(path: ":sdks:java:core", configuration: "shadowTest")
+  shadowTest "org.apache.kafka:kafka_2.11:0.11.0.1"
+  validatesRunner project(path: ":beam-sdks-java-core", configuration: "shadowTest")
   validatesRunner project(path: project.path, configuration: "shadowTest")
   validatesRunner project(path: project.path, configuration: "shadow")
   validatesRunner project(path: project.path, configuration: "provided")
@@ -119,7 +119,7 @@ task validatesRunnerBatch(type: Test) {
   systemProperty "spark.ui.showConsoleProgress", "false"
 
   classpath = configurations.validatesRunner
-  testClassesDirs = files(project(":sdks:java:core").sourceSets.test.output.classesDirs) + files(project.sourceSets.test.output.classesDirs)
+  testClassesDirs = files(project(":beam-sdks-java-core").sourceSets.test.output.classesDirs) + files(project.sourceSets.test.output.classesDirs)
   forkEvery 1
   useJUnit {
     includeCategories 'org.apache.beam.sdk.testing.ValidatesRunner'
@@ -154,5 +154,5 @@ task validatesRunner {
   dependsOn validatesRunnerStreaming
 }
 
-// Generates :runners:spark:runQuickstartJavaSpark
+// Generates :beam-runners-spark:runQuickstartJavaSpark
 createJavaQuickstartValidationTask(name: 'Spark')
diff --git a/sdks/go/container/build.gradle b/sdks/go/container/build.gradle
index 2b00dff64a4..fe15109bac2 100644
--- a/sdks/go/container/build.gradle
+++ b/sdks/go/container/build.gradle
@@ -25,14 +25,14 @@ description = "Apache Beam :: SDKs :: Go :: Container"
 // Figure out why the golang plugin does not add a build dependency between projects.
 // Without the line below, we get spurious errors about not being able to resolve
 // "./github.com/apache/beam/sdks/go"
-resolveBuildDependencies.dependsOn ":sdks:go:build"
+resolveBuildDependencies.dependsOn ":beam-sdks-go:build"
 
 dependencies {
   golang {
     // TODO(herohde): use "./" prefix to prevent gogradle use base github path, for now.
     // TODO(herohde): get the pkg subdirectory only, if possible. We spend mins pulling cmd/beamctl deps.
-    build name: './github.com/apache/beam/sdks/go', dir: project(':sdks:go').projectDir
-    test name: './github.com/apache/beam/sdks/go', dir: project(':sdks:go').projectDir
+    build name: './github.com/apache/beam/sdks/go', dir: project(':beam-sdks-go').projectDir
+    test name: './github.com/apache/beam/sdks/go', dir: project(':beam-sdks-go').projectDir
   }
 }
 
diff --git a/sdks/go/examples/build.gradle b/sdks/go/examples/build.gradle
index 9ae82fedd3e..58bfa90f6dc 100644
--- a/sdks/go/examples/build.gradle
+++ b/sdks/go/examples/build.gradle
@@ -30,14 +30,14 @@ def getLocalPlatform = {
 // Figure out why the golang plugin does not add a build dependency between projects.
 // Without the line below, we get spurious errors about not being able to resolve
 // "./github.com/apache/beam/sdks/go"
-resolveBuildDependencies.dependsOn ":sdks:go:build"
+resolveBuildDependencies.dependsOn ":beam-sdks-go:build"
 
 dependencies {
   golang {
     // TODO(herohde): use "./" prefix to prevent gogradle use base github path, for now.
     // TODO(herohde): get the pkg subdirectory only, if possible. We spend mins pulling cmd/beamctl deps.
-    build name: './github.com/apache/beam/sdks/go', dir: project(':sdks:go').projectDir
-    test name: './github.com/apache/beam/sdks/go', dir: project(':sdks:go').projectDir
+    build name: './github.com/apache/beam/sdks/go', dir: project(':beam-sdks-go').projectDir
+    test name: './github.com/apache/beam/sdks/go', dir: project(':beam-sdks-go').projectDir
   }
 }
 
diff --git a/sdks/java/build-tools/build.gradle b/sdks/java/build-tools/build.gradle
index 6a32e82eaa2..77d413be9c3 100644
--- a/sdks/java/build-tools/build.gradle
+++ b/sdks/java/build-tools/build.gradle
@@ -17,6 +17,6 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-build-tools")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: Build Tools"
diff --git a/sdks/java/container/build.gradle b/sdks/java/container/build.gradle
index aba24a8d72c..8dd600ac20a 100644
--- a/sdks/java/container/build.gradle
+++ b/sdks/java/container/build.gradle
@@ -25,7 +25,7 @@ description = "Apache Beam :: SDKs :: Java :: Container"
 // Figure out why the golang plugin does not add a build dependency between projects.
 // Without the line below, we get spurious errors about not being able to resolve
 // "./github.com/apache/beam/sdks/go"
-resolveBuildDependencies.dependsOn ":sdks:go:build"
+resolveBuildDependencies.dependsOn ":beam-sdks-go:build"
 
 configurations {
   dockerDependency
@@ -35,12 +35,12 @@ dependencies {
   golang {
     // TODO(herohde): use "./" prefix to prevent gogradle use base github path, for now.
     // TODO(herohde): get the pkg subdirectory only, if possible. We spend mins pulling cmd/beamctl deps.
-    build name: './github.com/apache/beam/sdks/go', dir: project(':sdks:go').projectDir
-    test name: './github.com/apache/beam/sdks/go', dir: project(':sdks:go').projectDir
+    build name: './github.com/apache/beam/sdks/go', dir: project(':beam-sdks-go').projectDir
+    test name: './github.com/apache/beam/sdks/go', dir: project(':beam-sdks-go').projectDir
   }
   dockerDependency library.java.slf4j_api
   dockerDependency library.java.slf4j_jdk14
-  dockerDependency project(path: ":sdks:java:harness", configuration: "shadow")
+  dockerDependency project(path: ":beam-sdks-java-harness", configuration: "shadow")
 }
 
 task copyDockerfileDependencies(type: Copy) {
diff --git a/sdks/java/core/build.gradle b/sdks/java/core/build.gradle
index a3fbc0a02be..3ac9c233f92 100644
--- a/sdks/java/core/build.gradle
+++ b/sdks/java/core/build.gradle
@@ -17,10 +17,13 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-core")
+applyJavaNature()
 applyAvroNature()
 
 description = "Apache Beam :: SDKs :: Java :: Core"
+ext.summary = """Beam SDK Java All provides a simple, Java-based
+interface for processing virtually any size data. This
+artifact includes entire Apache Beam Java SDK."""
 
 /*
  * We need to rely on manually specifying these evaluationDependsOn to ensure that
@@ -29,7 +32,7 @@ description = "Apache Beam :: SDKs :: Java :: Core"
  * TODO: Swap to generating test artifacts which we can then rely on instead of
  * the test outputs directly.
  */
-evaluationDependsOn(":model:fn-execution")
+evaluationDependsOn(":beam-model-fn-execution")
 
 processResources {
   filter org.apache.tools.ant.filters.ReplaceTokens, tokens: [
@@ -70,7 +73,7 @@ dependencies {
   shadowTest library.java.slf4j_jdk14
   shadowTest library.java.mockito_core
   shadowTest "com.esotericsoftware.kryo:kryo:2.21"
-  shadowTest project(path: ":model:fn-execution", configuration: "shadow")
+  shadowTest project(path: ":beam-model-fn-execution", configuration: "shadow")
 }
 
 // Shade dependencies.
diff --git a/sdks/java/extensions/google-cloud-platform-core/build.gradle b/sdks/java/extensions/google-cloud-platform-core/build.gradle
index 0ad906e9ce8..a0925c0bb9a 100644
--- a/sdks/java/extensions/google-cloud-platform-core/build.gradle
+++ b/sdks/java/extensions/google-cloud-platform-core/build.gradle
@@ -17,9 +17,11 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-extensions-google-cloud-platform-core")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: Extensions :: Google Cloud Platform Core"
+ext.summary = """Common components used to support multiple
+Google Cloud Platform specific maven modules."""
 
 // Exclude tests that need a runner
 test {
@@ -31,7 +33,7 @@ test {
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
   shadow library.java.google_http_client_jackson2
   shadow library.java.google_auth_library_oauth2_http
   shadow library.java.google_api_client
@@ -48,7 +50,7 @@ dependencies {
   shadow library.java.jackson_databind
   shadow library.java.hamcrest_core
   shadow library.java.junit
-  testCompile project(path: ":sdks:java:core", configuration: "shadowTest")
+  testCompile project(path: ":beam-sdks-java-core", configuration: "shadowTest")
   testCompile library.java.guava_testlib
   testCompile library.java.mockito_core
   testCompile library.java.slf4j_jdk14
diff --git a/sdks/java/extensions/jackson/build.gradle b/sdks/java/extensions/jackson/build.gradle
index d53421bbe3b..fa1847ca9f5 100644
--- a/sdks/java/extensions/jackson/build.gradle
+++ b/sdks/java/extensions/jackson/build.gradle
@@ -17,15 +17,16 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-extensions-json-jackson")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: Extensions :: Jackson"
+ext.summary = "Jackson extension provides PTransforms for deserializing and generating JSON strings."
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
   shadow library.java.jackson_databind
-  testCompile project(path: ":runners:direct-java", configuration: "shadow")
+  testCompile project(path: ":beam-runners-direct-java", configuration: "shadow")
   testCompile library.java.hamcrest_core
   testCompile library.java.junit
 }
diff --git a/sdks/java/extensions/join-library/build.gradle b/sdks/java/extensions/join-library/build.gradle
index 7d0efecd8c1..c2327028420 100644
--- a/sdks/java/extensions/join-library/build.gradle
+++ b/sdks/java/extensions/join-library/build.gradle
@@ -17,14 +17,14 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-extensions-join-library")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: Extensions :: Join library"
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
-  testCompile project(path: ":runners:direct-java", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
+  testCompile project(path: ":beam-runners-direct-java", configuration: "shadow")
   testCompile library.java.hamcrest_core
   testCompile library.java.junit
 }
diff --git a/sdks/java/extensions/protobuf/build.gradle b/sdks/java/extensions/protobuf/build.gradle
index cfe2693f89c..2bba1a4097b 100644
--- a/sdks/java/extensions/protobuf/build.gradle
+++ b/sdks/java/extensions/protobuf/build.gradle
@@ -17,16 +17,17 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-extensions-protobuf")
+applyJavaNature()
 applyGrpcNature()
 
 description = "Apache Beam :: SDKs :: Java :: Extensions :: Protobuf"
+ext.summary = "Add support to Apache Beam for Google Protobuf."
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
   shadow library.java.protobuf_java
-  testCompile project(path: ":sdks:java:core", configuration: "shadowTest")
+  testCompile project(path: ":beam-sdks-java-core", configuration: "shadowTest")
   testCompile library.java.hamcrest_core
   testCompile library.java.mockito_core
   testCompile library.java.junit
diff --git a/sdks/java/extensions/sketching/build.gradle b/sdks/java/extensions/sketching/build.gradle
index ad100b7569c..1ddc2269ab5 100644
--- a/sdks/java/extensions/sketching/build.gradle
+++ b/sdks/java/extensions/sketching/build.gradle
@@ -17,7 +17,7 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-extensions-sketching")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: Extensions :: Sketching"
 
@@ -26,14 +26,14 @@ def tdigest_version = "3.2"
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
   shadow "com.clearspring.analytics:stream:$streamlib_version"
   shadow "com.tdunning:t-digest:$tdigest_version"
   shadow library.java.slf4j_api
   shadowTest library.java.avro
   shadowTest library.java.commons_lang3
-  shadowTest project(path: ":sdks:java:core", configuration: "shadowTest")
-  shadowTest project(path: ":runners:direct-java", configuration: "shadow")
+  shadowTest project(path: ":beam-sdks-java-core", configuration: "shadowTest")
+  shadowTest project(path: ":beam-runners-direct-java", configuration: "shadow")
   shadowTest library.java.hamcrest_core
   shadowTest library.java.junit
 }
diff --git a/sdks/java/extensions/sorter/build.gradle b/sdks/java/extensions/sorter/build.gradle
index c0d829b43a6..f38acfed291 100644
--- a/sdks/java/extensions/sorter/build.gradle
+++ b/sdks/java/extensions/sorter/build.gradle
@@ -17,16 +17,16 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-extensions-sorter")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: Extensions :: Sorter"
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
   provided library.java.hadoop_mapreduce_client_core
   provided library.java.hadoop_common
-  testCompile project(path: ":runners:direct-java", configuration: "shadow")
+  testCompile project(path: ":beam-runners-direct-java", configuration: "shadow")
   testCompile library.java.hamcrest_core
   testCompile library.java.mockito_core
   testCompile library.java.junit
diff --git a/sdks/java/extensions/sql/build.gradle b/sdks/java/extensions/sql/build.gradle
index 22f7a286040..2d04f6d6f64 100644
--- a/sdks/java/extensions/sql/build.gradle
+++ b/sdks/java/extensions/sql/build.gradle
@@ -17,10 +17,11 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-extensions-sql")
+applyJavaNature()
 apply plugin: 'ca.coglinc.javacc'
 
 description = "Apache Beam :: SDKs :: Java :: Extensions :: SQL"
+ext.summary = "Beam SQL provides a new interface to generate a Beam pipeline from SQL statement"
 
 test {
   jvmArgs "-da"
@@ -57,13 +58,13 @@ dependencies {
   compile "com.alibaba:fastjson:1.2.12"
   compileOnly library.java.findbugs_jsr305
   compileOnly library.java.findbugs_annotations
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
-  shadow project(path: ":sdks:java:extensions:join-library", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-extensions-join-library", configuration: "shadow")
   shadow library.java.slf4j_api
   shadow library.java.commons_csv
   shadow library.java.joda_time
-  shadow project(path: ":runners:direct-java", configuration: "shadow")
-  provided project(path: ":sdks:java:io:kafka", configuration: "shadow")
+  shadow project(path: ":beam-runners-direct-java", configuration: "shadow")
+  provided project(path: ":beam-sdks-java-io-kafka", configuration: "shadow")
   provided library.java.kafka_clients
   testCompile library.java.slf4j_jdk14
   testCompile library.java.junit
diff --git a/sdks/java/fn-execution/build.gradle b/sdks/java/fn-execution/build.gradle
index cdf58061950..cf175a78f17 100644
--- a/sdks/java/fn-execution/build.gradle
+++ b/sdks/java/fn-execution/build.gradle
@@ -17,16 +17,19 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-fn-execution")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: Fn Execution"
+ext.summary = """Contains code shared across the Beam Java SDK Harness and Java Runners to execute using
+the Beam Portability Framework."""
+
 
 dependencies {
   compile library.java.guava
   compile library.java.findbugs_jsr305
-  shadow project(path: ":model:pipeline", configuration: "shadow")
-  shadow project(path: ":model:fn-execution", configuration: "shadow")
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
+  shadow project(path: ":beam-model-pipeline", configuration: "shadow")
+  shadow project(path: ":beam-model-fn-execution", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
   shadow library.java.slf4j_api
   shadow library.java.joda_time
   shadow library.java.grpc_core
diff --git a/sdks/java/harness/build.gradle b/sdks/java/harness/build.gradle
index 9825fb8b58e..7f215e683d8 100644
--- a/sdks/java/harness/build.gradle
+++ b/sdks/java/harness/build.gradle
@@ -17,10 +17,11 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-harness", enableShadow: false /* Disable shadow because of custom configuration below. */)
+applyJavaNature(enableShadow: false /* Disable shadow because of custom configuration below. */)
 apply plugin: "com.github.johnrengelman.shadow"
 
 description = "Apache Beam :: SDKs :: Java :: Harness"
+ext.summary = "This contains the SDK Fn Harness for Beam Java"
 
 /*
  * We need to rely on manually specifying these evaluationDependsOn to ensure that
@@ -29,16 +30,16 @@ description = "Apache Beam :: SDKs :: Java :: Harness"
  * TODO: Swap to generating test artifacts which we can then rely on instead of
  * the test outputs directly.
  */
-evaluationDependsOn(":sdks:java:fn-execution")
+evaluationDependsOn(":beam-sdks-java-fn-execution")
 
 dependencies {
-  compile project(path: ":model:pipeline", configuration: "shadow")
-  compile project(path: ":model:fn-execution", configuration: "shadow")
-  compile project(path: ":sdks:java:core", configuration: "shadow")
-  compile project(path: ":sdks:java:fn-execution", configuration: "shadow")
-  compile project(path: ":sdks:java:extensions:google-cloud-platform-core", configuration: "shadow")
-  compile project(path: ":runners:core-java", configuration: "shadow")
-  compile project(path: ":runners:core-construction-java", configuration: "shadow")
+  compile project(path: ":beam-model-pipeline", configuration: "shadow")
+  compile project(path: ":beam-model-fn-execution", configuration: "shadow")
+  compile project(path: ":beam-sdks-java-core", configuration: "shadow")
+  compile project(path: ":beam-sdks-java-fn-execution", configuration: "shadow")
+  compile project(path: ":beam-sdks-java-extensions-google-cloud-platform-core", configuration: "shadow")
+  compile project(path: ":beam-runners-core-java", configuration: "shadow")
+  compile project(path: ":beam-runners-core-construction-java", configuration: "shadow")
   compile library.java.jackson_databind
   compile library.java.findbugs_jsr305
   compile library.java.guava
diff --git a/sdks/java/io/amazon-web-services/build.gradle b/sdks/java/io/amazon-web-services/build.gradle
index 43f146e65b6..10d016037f3 100644
--- a/sdks/java/io/amazon-web-services/build.gradle
+++ b/sdks/java/io/amazon-web-services/build.gradle
@@ -17,15 +17,16 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-io-amazon-web-services")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: IO :: Amazon Web Services"
+ext.summary = "IO library to read and write Amazon Web Services services from Beam."
 
 def aws_java_sdk_version = "1.11.255"
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
   shadow "com.amazonaws:aws-java-sdk-core:$aws_java_sdk_version"
   shadow "com.amazonaws:aws-java-sdk-s3:$aws_java_sdk_version"
   shadow library.java.jackson_core
diff --git a/sdks/java/io/amqp/build.gradle b/sdks/java/io/amqp/build.gradle
index 5b3541efe95..607c0b9f2ba 100644
--- a/sdks/java/io/amqp/build.gradle
+++ b/sdks/java/io/amqp/build.gradle
@@ -17,17 +17,18 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-io-amqp")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: IO :: AMQP"
+ext.summary = "IO to read and write using AMQP 1.0 protocol (http://www.amqp.org)."
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
   shadow library.java.joda_time
   shadow library.java.findbugs_jsr305
   shadow "org.apache.qpid:proton-j:0.13.1"
-  testCompile project(path: ":runners:direct-java", configuration: "shadow")
+  testCompile project(path: ":beam-runners-direct-java", configuration: "shadow")
   testCompile library.java.slf4j_api
   testCompile library.java.slf4j_jdk14
   testCompile library.java.junit
diff --git a/sdks/java/io/cassandra/build.gradle b/sdks/java/io/cassandra/build.gradle
index 5de5bc025d8..91abf95326e 100644
--- a/sdks/java/io/cassandra/build.gradle
+++ b/sdks/java/io/cassandra/build.gradle
@@ -17,9 +17,10 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-io-cassandra")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: IO :: Cassandra"
+ext.summary = "IO to read and write with Apache Cassandra database"
 
 /*
  * We need to rely on manually specifying these evaluationDependsOn to ensure that
@@ -28,19 +29,19 @@ description = "Apache Beam :: SDKs :: Java :: IO :: Cassandra"
  * TODO: Swap to generating test artifacts which we can then rely on instead of
  * the test outputs directly.
  */
-evaluationDependsOn(":sdks:java:io:common")
+evaluationDependsOn(":beam-sdks-java-io-common")
 
 def cassandra_version = "3.2.0"
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
   shadow library.java.slf4j_api
   shadow library.java.findbugs_jsr305
   shadow "com.datastax.cassandra:cassandra-driver-core:$cassandra_version"
   shadow "com.datastax.cassandra:cassandra-driver-mapping:$cassandra_version"
-  testCompile project(path: ":runners:direct-java", configuration: "shadow")
-  testCompile project(":sdks:java:io:common").sourceSets.test.output
+  testCompile project(path: ":beam-runners-direct-java", configuration: "shadow")
+  testCompile project(":beam-sdks-java-io-common").sourceSets.test.output
   testCompile library.java.junit
   testCompile library.java.hamcrest_core
   testCompile library.java.slf4j_jdk14
diff --git a/sdks/java/io/common/build.gradle b/sdks/java/io/common/build.gradle
index 6c9b8a30963..b7a23e43cff 100644
--- a/sdks/java/io/common/build.gradle
+++ b/sdks/java/io/common/build.gradle
@@ -17,13 +17,14 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-io-common")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: IO :: Common"
+ext.summary = "Code used by all Beam IOs"
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
   testCompile library.java.junit
   testCompile library.java.postgres
 }
diff --git a/sdks/java/io/elasticsearch-tests/elasticsearch-tests-2/build.gradle b/sdks/java/io/elasticsearch-tests/elasticsearch-tests-2/build.gradle
index c986b819936..1f47bd6ef16 100644
--- a/sdks/java/io/elasticsearch-tests/elasticsearch-tests-2/build.gradle
+++ b/sdks/java/io/elasticsearch-tests/elasticsearch-tests-2/build.gradle
@@ -17,9 +17,10 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-io-elasticsearch-tests-2")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: IO :: Elasticsearch-Tests :: 2.x"
+ext.summary = "Tests of ElasticsearchIO on Elasticsearch 2.x"
 
 /*
  * We need to rely on manually specifying these evaluationDependsOn to ensure that
@@ -28,19 +29,19 @@ description = "Apache Beam :: SDKs :: Java :: IO :: Elasticsearch-Tests :: 2.x"
  * TODO: Swap to generating test artifacts which we can then rely on instead of
  * the test outputs directly.
  */
-evaluationDependsOn(":sdks:java:io:elasticsearch-tests:elasticsearch-tests-common")
-evaluationDependsOn(":sdks:java:io:common")
+evaluationDependsOn(":beam-sdks-java-io-elasticsearch-tests-common")
+evaluationDependsOn(":beam-sdks-java-io-common")
 
 def jna_version = "4.1.0"
 def log4j_version = "2.6.2"
 def elastic_search_version = "2.4.1"
 
 dependencies {
-  testCompile project(":sdks:java:io:elasticsearch-tests:elasticsearch-tests-common").sourceSets.test.output
-  testCompile project(path: ":sdks:java:core", configuration: "shadow")
-  testCompile project(path: ":sdks:java:io:elasticsearch", configuration: "shadow")
-  testCompile project(":sdks:java:io:common").sourceSets.test.output
-  testCompile project(path: ":runners:direct-java", configuration: "shadow")
+  testCompile project(":beam-sdks-java-io-elasticsearch-tests-common").sourceSets.test.output
+  testCompile project(path: ":beam-sdks-java-core", configuration: "shadow")
+  testCompile project(path: ":beam-sdks-java-io-elasticsearch", configuration: "shadow")
+  testCompile project(":beam-sdks-java-io-common").sourceSets.test.output
+  testCompile project(path: ":beam-runners-direct-java", configuration: "shadow")
   testCompile library.java.slf4j_api
   testCompile "net.java.dev.jna:jna:$jna_version"
   testCompile "org.apache.logging.log4j:log4j-api:$log4j_version"
diff --git a/sdks/java/io/elasticsearch-tests/elasticsearch-tests-5/build.gradle b/sdks/java/io/elasticsearch-tests/elasticsearch-tests-5/build.gradle
index 9cb1f3fbf7f..ad6b1f2017e 100644
--- a/sdks/java/io/elasticsearch-tests/elasticsearch-tests-5/build.gradle
+++ b/sdks/java/io/elasticsearch-tests/elasticsearch-tests-5/build.gradle
@@ -17,9 +17,10 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-io-elasticsearch-tests-5")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: IO :: Elasticsearch-Tests :: 5.x"
+ext.summary = "Tests of ElasticsearchIO on Elasticsearch 5.x"
 
 /*
  * We need to rely on manually specifying these evaluationDependsOn to ensure that
@@ -28,8 +29,8 @@ description = "Apache Beam :: SDKs :: Java :: IO :: Elasticsearch-Tests :: 5.x"
  * TODO: Swap to generating test artifacts which we can then rely on instead of
  * the test outputs directly.
  */
-evaluationDependsOn(":sdks:java:io:elasticsearch-tests:elasticsearch-tests-common")
-evaluationDependsOn(":sdks:java:io:common")
+evaluationDependsOn(":beam-sdks-java-io-elasticsearch-tests-common")
+evaluationDependsOn(":beam-sdks-java-io-common")
 
 test {
   // needed for ESIntegTestCase
@@ -50,16 +51,16 @@ configurations.all {
 }
 
 dependencies {
-  testCompile project(":sdks:java:io:elasticsearch-tests:elasticsearch-tests-common").sourceSets.test.output
+  testCompile project(":beam-sdks-java-io-elasticsearch-tests-common").sourceSets.test.output
   testCompile "org.elasticsearch.test:framework:$elastic_search_version"
   testCompile "org.elasticsearch.plugin:transport-netty4-client:$elastic_search_version"
   testCompile "com.carrotsearch.randomizedtesting:randomizedtesting-runner:2.5.0"
   testCompile "org.elasticsearch:elasticsearch:$elastic_search_version"
 
-  testCompile project(path: ":sdks:java:core", configuration: "shadow")
-  testCompile project(path: ":sdks:java:io:elasticsearch", configuration: "shadow")
-  testCompile project(":sdks:java:io:common").sourceSets.test.output
-  testCompile project(path: ":runners:direct-java", configuration: "shadow")
+  testCompile project(path: ":beam-sdks-java-core", configuration: "shadow")
+  testCompile project(path: ":beam-sdks-java-io-elasticsearch", configuration: "shadow")
+  testCompile project(":beam-sdks-java-io-common").sourceSets.test.output
+  testCompile project(path: ":beam-runners-direct-java", configuration: "shadow")
   testCompile "org.apache.logging.log4j:log4j-core:$log4j_version"
   testCompile "org.apache.logging.log4j:log4j-api:$log4j_version"
   testCompile library.java.slf4j_api
diff --git a/sdks/java/io/elasticsearch-tests/elasticsearch-tests-common/build.gradle b/sdks/java/io/elasticsearch-tests/elasticsearch-tests-common/build.gradle
index 0093048debf..444a5a5f112 100644
--- a/sdks/java/io/elasticsearch-tests/elasticsearch-tests-common/build.gradle
+++ b/sdks/java/io/elasticsearch-tests/elasticsearch-tests-common/build.gradle
@@ -17,9 +17,10 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-io-elasticsearch-tests-common")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: IO :: Elasticsearch-Tests :: Common"
+ext.summary = "Common test classes for ElasticsearchIO"
 
 /*
  * We need to rely on manually specifying these evaluationDependsOn to ensure that
@@ -28,7 +29,7 @@ description = "Apache Beam :: SDKs :: Java :: IO :: Elasticsearch-Tests :: Commo
  * TODO: Swap to generating test artifacts which we can then rely on instead of
  * the test outputs directly.
  */
-evaluationDependsOn(":sdks:java:io:common")
+evaluationDependsOn(":beam-sdks-java-io-common")
 
 def jna_version = "4.1.0"
 def log4j_version = "2.6.2"
@@ -40,10 +41,10 @@ dependencies {
   testCompile "org.apache.httpcomponents:httpcore:4.4.5"
   testCompile "org.apache.httpcomponents:httpclient:4.5.2"
 
-  testCompile project(path: ":sdks:java:core", configuration: "shadow")
-  testCompile project(path: ":sdks:java:io:elasticsearch", configuration: "shadow")
-  testCompile project(":sdks:java:io:common").sourceSets.test.output
-  testCompile project(path: ":runners:direct-java", configuration: "shadow")
+  testCompile project(path: ":beam-sdks-java-core", configuration: "shadow")
+  testCompile project(path: ":beam-sdks-java-io-elasticsearch", configuration: "shadow")
+  testCompile project(":beam-sdks-java-io-common").sourceSets.test.output
+  testCompile project(path: ":beam-runners-direct-java", configuration: "shadow")
   testCompile library.java.slf4j_api
   testCompile "net.java.dev.jna:jna:$jna_version"
   testCompile "org.apache.logging.log4j:log4j-api:$log4j_version"
diff --git a/sdks/java/io/elasticsearch/build.gradle b/sdks/java/io/elasticsearch/build.gradle
index f513f98eae6..a8a06e63ff7 100644
--- a/sdks/java/io/elasticsearch/build.gradle
+++ b/sdks/java/io/elasticsearch/build.gradle
@@ -17,13 +17,14 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-io-elasticsearch")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: IO :: Elasticsearch"
+ext.summary = "IO to read and write on Elasticsearch"
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
   shadow library.java.jackson_databind
   shadow library.java.findbugs_jsr305
   shadow "org.elasticsearch.client:elasticsearch-rest-client:5.6.3"
@@ -31,5 +32,5 @@ dependencies {
   shadow "org.apache.httpcomponents:httpcore-nio:4.4.5"
   shadow "org.apache.httpcomponents:httpcore:4.4.5"
   shadow "org.apache.httpcomponents:httpclient:4.5.2"
-  testCompile project(path: ":sdks:java:io:common", configuration: "shadow")
+  testCompile project(path: ":beam-sdks-java-io-common", configuration: "shadow")
 }
diff --git a/sdks/java/io/file-based-io-tests/build.gradle b/sdks/java/io/file-based-io-tests/build.gradle
index 8275b3cad06..ed18b8689c2 100644
--- a/sdks/java/io/file-based-io-tests/build.gradle
+++ b/sdks/java/io/file-based-io-tests/build.gradle
@@ -17,9 +17,10 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-io-file-based-io-tests")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: File-based-io-tests"
+ext.summary = "Integration tests for reading/writing using file-based sources/sinks."
 
 /*
  * We need to rely on manually specifying these evaluationDependsOn to ensure that
@@ -28,14 +29,14 @@ description = "Apache Beam :: SDKs :: Java :: File-based-io-tests"
  * TODO: Swap to generating test artifacts which we can then rely on instead of
  * the test outputs directly.
  */
-evaluationDependsOn(":sdks:java:io:common")
+evaluationDependsOn(":beam-sdks-java-io-common")
 
 dependencies {
-  shadowTest project(":sdks:java:core")
-  shadowTest project(":runners:direct-java").sourceSets.test.output
-  shadowTest project(":sdks:java:io:common")
-  shadowTest project(":sdks:java:io:common").sourceSets.test.output
-  shadowTest project(":sdks:java:io:xml")
+  shadowTest project(":beam-sdks-java-core")
+  shadowTest project(":beam-runners-direct-java").sourceSets.test.output
+  shadowTest project(":beam-sdks-java-io-common")
+  shadowTest project(":beam-sdks-java-io-common").sourceSets.test.output
+  shadowTest project(":beam-sdks-java-io-xml")
   shadowTest library.java.guava
   shadowTest library.java.junit
   shadowTest library.java.hamcrest_core
diff --git a/sdks/java/io/google-cloud-platform/build.gradle b/sdks/java/io/google-cloud-platform/build.gradle
index c38bb8fb391..a292ebf0883 100644
--- a/sdks/java/io/google-cloud-platform/build.gradle
+++ b/sdks/java/io/google-cloud-platform/build.gradle
@@ -17,9 +17,10 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-io-google-cloud-platform", enableFindbugs: false)
+applyJavaNature(enableFindbugs: false)
 
 description = "Apache Beam :: SDKs :: Java :: IO :: Google Cloud Platform"
+ext.summary = "IO library to read and write Google Cloud Platform systems from Beam."
 
 /*
  * We need to rely on manually specifying these evaluationDependsOn to ensure that
@@ -28,13 +29,13 @@ description = "Apache Beam :: SDKs :: Java :: IO :: Google Cloud Platform"
  * TODO: Swap to generating test artifacts which we can then rely on instead of
  * the test outputs directly.
  */
-evaluationDependsOn(":sdks:java:extensions:google-cloud-platform-core")
+evaluationDependsOn(":beam-sdks-java-extensions-google-cloud-platform-core")
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
-  shadow project(path: ":sdks:java:extensions:google-cloud-platform-core", configuration: "shadow")
-  shadow project(path: ":sdks:java:extensions:protobuf", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-extensions-google-cloud-platform-core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-extensions-protobuf", configuration: "shadow")
   shadow library.java.jackson_databind
   shadow library.java.grpc_core
   shadow library.java.google_api_services_bigquery
@@ -68,9 +69,9 @@ dependencies {
   shadow library.java.proto_google_common_protos
   shadow library.java.grpc_all
   shadow library.java.netty_tcnative_boringssl_static
-  testCompile project(path: ":sdks:java:core", configuration: "shadowTest")
-  testCompile project(":sdks:java:extensions:google-cloud-platform-core").sourceSets.test.output
-  testCompile project(path: ":runners:direct-java", configuration: "shadow")
+  testCompile project(path: ":beam-sdks-java-core", configuration: "shadowTest")
+  testCompile project(":beam-sdks-java-extensions-google-cloud-platform-core").sourceSets.test.output
+  testCompile project(path: ":beam-runners-direct-java", configuration: "shadow")
   testCompile library.java.hamcrest_core
   testCompile library.java.mockito_core
   testCompile library.java.junit
diff --git a/sdks/java/io/hadoop-common/build.gradle b/sdks/java/io/hadoop-common/build.gradle
index fde57173482..1ee3b7cbe6e 100644
--- a/sdks/java/io/hadoop-common/build.gradle
+++ b/sdks/java/io/hadoop-common/build.gradle
@@ -17,12 +17,13 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-io-hadoop-common")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: IO :: Hadoop Common"
+ext.summary = "Library to add shared Hadoop classes among Beam IOs."
 
 dependencies {
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
   shadow library.java.findbugs_jsr305
   provided library.java.hadoop_client
   provided library.java.hadoop_common
diff --git a/sdks/java/io/hadoop-file-system/build.gradle b/sdks/java/io/hadoop-file-system/build.gradle
index b682d876b00..ff478380b58 100644
--- a/sdks/java/io/hadoop-file-system/build.gradle
+++ b/sdks/java/io/hadoop-file-system/build.gradle
@@ -17,13 +17,14 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-io-hadoop-file-system")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: IO :: Hadoop File System"
+ext.summary = "Library to read and write Hadoop/HDFS file formats from Beam."
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
   shadow library.java.jackson_core
   shadow library.java.jackson_databind
   shadow library.java.slf4j_api
@@ -31,8 +32,8 @@ dependencies {
   provided library.java.hadoop_client
   provided library.java.hadoop_common
   provided library.java.hadoop_mapreduce_client_core
-  testCompile project(path: ":runners:direct-java", configuration: "shadow")
-  testCompile project(path: ":sdks:java:core", configuration: "shadowTest")
+  testCompile project(path: ":beam-runners-direct-java", configuration: "shadow")
+  testCompile project(path: ":beam-sdks-java-core", configuration: "shadowTest")
   testCompile library.java.guava_testlib
   testCompile library.java.hamcrest_core
   testCompile library.java.mockito_core
diff --git a/sdks/java/io/hadoop-input-format/build.gradle b/sdks/java/io/hadoop-input-format/build.gradle
index 6cb7932abf6..8597a280428 100644
--- a/sdks/java/io/hadoop-input-format/build.gradle
+++ b/sdks/java/io/hadoop-input-format/build.gradle
@@ -17,9 +17,10 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-io-hadoop-input-format")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: IO :: Hadoop Input Format"
+ext.summary = "IO to read data from sources that implement Hadoop Input Format."
 
 /*
  * We need to rely on manually specifying these evaluationDependsOn to ensure that
@@ -28,7 +29,7 @@ description = "Apache Beam :: SDKs :: Java :: IO :: Hadoop Input Format"
  * TODO: Swap to generating test artifacts which we can then rely on instead of
  * the test outputs directly.
  */
-evaluationDependsOn(":sdks:java:io:common")
+evaluationDependsOn(":beam-sdks-java-io-common")
 
 def log4j_version = "2.6.2"
 def elastic_search_version = "5.0.0"
@@ -45,17 +46,17 @@ configurations.testRuntimeClasspath {
 }
 
 dependencies {
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
   compile library.java.guava
   shadow library.java.slf4j_api
   shadow library.java.findbugs_jsr305
-  shadow project(path: ":sdks:java:io:hadoop-common", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-io-hadoop-common", configuration: "shadow")
   provided library.java.hadoop_common
   provided library.java.hadoop_mapreduce_client_core
-  testCompile project(path: ":runners:direct-java", configuration: "shadow")
-  testCompile project(path: ":sdks:java:core", configuration: "shadowTest")
-  testCompile project(path: ":sdks:java:io:common", configuration: "shadow")
-  testCompile project(":sdks:java:io:common").sourceSets.test.output
+  testCompile project(path: ":beam-runners-direct-java", configuration: "shadow")
+  testCompile project(path: ":beam-sdks-java-core", configuration: "shadowTest")
+  testCompile project(path: ":beam-sdks-java-io-common", configuration: "shadow")
+  testCompile project(":beam-sdks-java-io-common").sourceSets.test.output
   testCompile "org.elasticsearch.plugin:transport-netty4-client:$elastic_search_version"
   testCompile "org.elasticsearch.client:transport:$elastic_search_version"
   testCompile "io.netty:netty-transport-native-epoll:4.1.0.CR3"
@@ -75,7 +76,7 @@ dependencies {
   testCompile "com.datastax.cassandra:cassandra-driver-mapping:$cassandra_driver"
   testCompile "org.apache.cassandra:cassandra-all:3.9"
   testCompile "com.datastax.cassandra:cassandra-driver-core:$cassandra_driver"
-  testCompile project(path: ":sdks:java:io:jdbc", configuration: "shadow")
+  testCompile project(path: ":beam-sdks-java-io-jdbc", configuration: "shadow")
   testCompile library.java.postgres
   testCompile "org.apache.logging.log4j:log4j-core:$log4j_version"
   testCompile library.java.junit
diff --git a/sdks/java/io/hbase/build.gradle b/sdks/java/io/hbase/build.gradle
index 4bc938d7a66..0ec892b61b8 100644
--- a/sdks/java/io/hbase/build.gradle
+++ b/sdks/java/io/hbase/build.gradle
@@ -17,9 +17,10 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-io-hbase")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: IO :: HBase"
+ext.summary = "Library to read and write from/to HBase"
 
 test {
   systemProperty "log4j.configuration", "log4j-test.properties"
@@ -33,13 +34,13 @@ def hbase_version = "1.2.6"
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
-  shadow project(path: ":sdks:java:io:hadoop-common", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-io-hadoop-common", configuration: "shadow")
   shadow library.java.findbugs_jsr305
   shadow library.java.slf4j_api
   shadow "org.apache.hbase:hbase-shaded-client:$hbase_version"
-  testCompile project(path: ":sdks:java:core", configuration: "shadowTest")
-  testCompile project(path: ":runners:direct-java", configuration: "shadow")
+  testCompile project(path: ":beam-sdks-java-core", configuration: "shadowTest")
+  testCompile project(path: ":beam-runners-direct-java", configuration: "shadow")
   testCompile library.java.commons_lang3
   testCompile library.java.junit
   testCompile library.java.hamcrest_core
diff --git a/sdks/java/io/hcatalog/build.gradle b/sdks/java/io/hcatalog/build.gradle
index 18131a756ae..4867c43e0d3 100644
--- a/sdks/java/io/hcatalog/build.gradle
+++ b/sdks/java/io/hcatalog/build.gradle
@@ -17,9 +17,10 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-io-hcatalog")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: IO :: HCatalog"
+ext.summary = "IO to read and write for HCatalog source."
 
 def hive_version = "2.1.0"
 
@@ -32,8 +33,8 @@ test {
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
-  shadow project(path: ":sdks:java:io:hadoop-common", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-io-hadoop-common", configuration: "shadow")
   shadow library.java.slf4j_api
   shadow library.java.findbugs_jsr305
   // Hive bundles without repackaging Jackson which is why we redeclare it here so that it appears
@@ -50,7 +51,7 @@ dependencies {
     exclude group: "org.apache.hive", module: "hive-exec"
     exclude group: "com.google.protobuf", module: "protobuf-java"
   }
-  testCompile project(path: ":runners:direct-java", configuration: "shadow")
+  testCompile project(path: ":beam-runners-direct-java", configuration: "shadow")
   testCompile library.java.commons_io_2x
   testCompile library.java.junit
   testCompile library.java.hamcrest_core
diff --git a/sdks/java/io/jdbc/build.gradle b/sdks/java/io/jdbc/build.gradle
index 237634e1478..04180d7f828 100644
--- a/sdks/java/io/jdbc/build.gradle
+++ b/sdks/java/io/jdbc/build.gradle
@@ -17,9 +17,10 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-io-jdbc")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: IO :: JDBC"
+ext.summary = "IO to read and write on JDBC datasource."
 
 /*
  * We need to rely on manually specifying these evaluationDependsOn to ensure that
@@ -28,17 +29,17 @@ description = "Apache Beam :: SDKs :: Java :: IO :: JDBC"
  * TODO: Swap to generating test artifacts which we can then rely on instead of
  * the test outputs directly.
  */
-evaluationDependsOn(":sdks:java:io:common")
+evaluationDependsOn(":beam-sdks-java-io-common")
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
   shadow library.java.findbugs_jsr305
   shadow "org.apache.commons:commons-dbcp2:2.1.1"
-  testCompile project(path: ":sdks:java:core", configuration: "shadowTest")
-  testCompile project(path: ":runners:direct-java", configuration: "shadow")
-  testCompile project(path: ":sdks:java:io:common", configuration: "shadow")
-  testCompile project(":sdks:java:io:common").sourceSets.test.output
+  testCompile project(path: ":beam-sdks-java-core", configuration: "shadowTest")
+  testCompile project(path: ":beam-runners-direct-java", configuration: "shadow")
+  testCompile project(path: ":beam-sdks-java-io-common", configuration: "shadow")
+  testCompile project(":beam-sdks-java-io-common").sourceSets.test.output
   testCompile library.java.junit
   testCompile library.java.hamcrest_core
   testCompile library.java.slf4j_api
diff --git a/sdks/java/io/jms/build.gradle b/sdks/java/io/jms/build.gradle
index ba301ccf7cc..717023446ab 100644
--- a/sdks/java/io/jms/build.gradle
+++ b/sdks/java/io/jms/build.gradle
@@ -17,18 +17,20 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-io-jms")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: IO :: JMS"
+ext.summary = """IO to read and write to JMS (Java Messaging Service)
+destinations (queues and topics)."""
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
   shadow library.java.slf4j_api
   shadow library.java.joda_time
   shadow library.java.findbugs_jsr305
   shadow "org.apache.geronimo.specs:geronimo-jms_1.1_spec:1.1.1"
-  testCompile project(path: ":runners:direct-java", configuration: "shadow")
+  testCompile project(path: ":beam-runners-direct-java", configuration: "shadow")
   testCompile library.java.activemq_broker
   testCompile library.java.activemq_jaas
   testCompile library.java.activemq_kahadb_store
diff --git a/sdks/java/io/kafka/build.gradle b/sdks/java/io/kafka/build.gradle
index 977edebc58b..77bf209157d 100644
--- a/sdks/java/io/kafka/build.gradle
+++ b/sdks/java/io/kafka/build.gradle
@@ -17,13 +17,14 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-io-kafka", enableFindbugs: false)
+applyJavaNature(enableFindbugs: false)
 
 description = "Apache Beam :: SDKs :: Java :: IO :: Kafka"
+ext.summary = "Library to read Kafka topics."
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
   shadow library.java.kafka_clients
   shadow library.java.slf4j_api
   shadow library.java.joda_time
@@ -31,8 +32,8 @@ dependencies {
   shadow library.java.jackson_annotations
   shadow library.java.jackson_databind
   shadow "org.springframework:spring-expression:4.3.5.RELEASE"
-  testCompile project(path: ":runners:direct-java", configuration: "shadow")
-  testCompile project(path: ":sdks:java:core", configuration: "shadowTest")
+  testCompile project(path: ":beam-runners-direct-java", configuration: "shadow")
+  testCompile project(path: ":beam-sdks-java-core", configuration: "shadowTest")
   testCompile library.java.hamcrest_core
   testCompile library.java.junit
   testCompile library.java.slf4j_jdk14
diff --git a/sdks/java/io/kinesis/build.gradle b/sdks/java/io/kinesis/build.gradle
index 0d01c6cfc08..074de9bfbcb 100644
--- a/sdks/java/io/kinesis/build.gradle
+++ b/sdks/java/io/kinesis/build.gradle
@@ -17,9 +17,10 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-io-kinesis")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: IO :: Kinesis"
+ext.summary = "Library to read Kinesis streams."
 
 test {
   // Forking every test resolves an issue where KinesisMockReadTest gets stuck forever.
@@ -30,7 +31,7 @@ def aws_version = "1.11.255"
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
   shadow library.java.slf4j_api
   shadow library.java.joda_time
   shadow library.java.findbugs_jsr305
@@ -41,7 +42,7 @@ dependencies {
   shadow "com.amazonaws:amazon-kinesis-client:1.8.8"
   shadow "com.amazonaws:amazon-kinesis-producer:0.12.8"
   shadow "commons-lang:commons-lang:2.6"
-  testCompile project(path: ":runners:direct-java", configuration: "shadow")
+  testCompile project(path: ":beam-runners-direct-java", configuration: "shadow")
   testCompile library.java.junit
   testCompile library.java.mockito_core
   testCompile library.java.guava_testlib
diff --git a/sdks/java/io/mongodb/build.gradle b/sdks/java/io/mongodb/build.gradle
index 6e82f35dbc5..a2ece375229 100644
--- a/sdks/java/io/mongodb/build.gradle
+++ b/sdks/java/io/mongodb/build.gradle
@@ -17,9 +17,10 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-io-mongodb")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: IO :: MongoDB"
+ext.summary = "IO to read and write on MongoDB."
 
 /*
  * We need to rely on manually specifying these evaluationDependsOn to ensure that
@@ -28,21 +29,21 @@ description = "Apache Beam :: SDKs :: Java :: IO :: MongoDB"
  * TODO: Swap to generating test artifacts which we can then rely on instead of
  * the test outputs directly.
  */
-evaluationDependsOn(":sdks:java:io:common")
+evaluationDependsOn(":beam-sdks-java-io-common")
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
   shadow library.java.slf4j_api
   shadow library.java.findbugs_jsr305
   shadow library.java.joda_time
   shadow "org.mongodb:mongo-java-driver:3.2.2"
-  testCompile project(path: ":runners:direct-java", configuration: "shadow")
+  testCompile project(path: ":beam-runners-direct-java", configuration: "shadow")
   testCompile library.java.junit
   testCompile library.java.slf4j_jdk14
   testCompile library.java.hamcrest_core
-  testCompile project(path: ":sdks:java:io:common", configuration: "shadow")
-  testCompile project(":sdks:java:io:common").sourceSets.test.output
+  testCompile project(path: ":beam-sdks-java-io-common", configuration: "shadow")
+  testCompile project(":beam-sdks-java-io-common").sourceSets.test.output
   testCompile "de.flapdoodle.embed:de.flapdoodle.embed.mongo:1.50.1"
   testCompile "de.flapdoodle.embed:de.flapdoodle.embed.process:1.50.1"
 }
diff --git a/sdks/java/io/mqtt/build.gradle b/sdks/java/io/mqtt/build.gradle
index 7ec080c83fb..d9eef843376 100644
--- a/sdks/java/io/mqtt/build.gradle
+++ b/sdks/java/io/mqtt/build.gradle
@@ -17,19 +17,20 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-io-mqtt")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: IO :: MQTT"
+ext.summary = "IO to read and write to a MQTT broker."
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
   shadow library.java.slf4j_api
   shadow library.java.joda_time
   shadow library.java.findbugs_jsr305
   shadow "org.fusesource.mqtt-client:mqtt-client:1.14"
   shadow "org.fusesource.hawtbuf:hawtbuf:1.11"
-  testCompile project(path: ":runners:direct-java", configuration: "shadow")
+  testCompile project(path: ":beam-runners-direct-java", configuration: "shadow")
   testCompile library.java.activemq_broker
   testCompile library.java.activemq_mqtt
   testCompile library.java.activemq_kahadb_store
diff --git a/sdks/java/io/redis/build.gradle b/sdks/java/io/redis/build.gradle
index 172a248b397..1c5f1f96da6 100644
--- a/sdks/java/io/redis/build.gradle
+++ b/sdks/java/io/redis/build.gradle
@@ -17,16 +17,17 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-io-redis")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: IO :: Redis"
+ext.summary ="IO to read and write on a Redis keystore."
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
   shadow library.java.findbugs_jsr305
   shadow "redis.clients:jedis:2.9.0"
-  testCompile project(path: ":runners:direct-java", configuration: "shadow")
+  testCompile project(path: ":beam-runners-direct-java", configuration: "shadow")
   testCompile library.java.junit
   testCompile library.java.slf4j_jdk14
   testCompile library.java.hamcrest_core
diff --git a/sdks/java/io/solr/build.gradle b/sdks/java/io/solr/build.gradle
index f7f9101d9cc..6190dd53d44 100644
--- a/sdks/java/io/solr/build.gradle
+++ b/sdks/java/io/solr/build.gradle
@@ -17,19 +17,20 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-io-solr")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: IO :: Solr"
+ext.summary = "IO to read and write from/to Solr."
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
   shadow library.java.findbugs_jsr305
   shadow library.java.commons_compress
   shadow "org.apache.solr:solr-solrj:5.5.4"
   compileOnly "org.apache.httpcomponents:httpclient:4.4.1"
-  testCompile project(path: ":sdks:java:io:common", configuration: "shadow")
-  testCompile project(path: ":runners:direct-java", configuration: "shadow")
+  testCompile project(path: ":beam-sdks-java-io-common", configuration: "shadow")
+  testCompile project(path: ":beam-runners-direct-java", configuration: "shadow")
   testCompile library.java.hamcrest_core
   testCompile library.java.junit
   testCompile library.java.slf4j_api
diff --git a/sdks/java/io/tika/build.gradle b/sdks/java/io/tika/build.gradle
index f40321a708b..4844d0b68e0 100644
--- a/sdks/java/io/tika/build.gradle
+++ b/sdks/java/io/tika/build.gradle
@@ -17,19 +17,20 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-io-tika")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: IO :: Tika"
+ext.summary = "Tika Input to parse files."
 
 def tika_version = "1.16"
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
   shadow library.java.findbugs_jsr305
   shadow "org.apache.tika:tika-core:$tika_version"
-  testCompile project(path: ":sdks:java:core", configuration: "shadowTest")
-  testCompile project(path: ":runners:direct-java", configuration: "shadow")
+  testCompile project(path: ":beam-sdks-java-core", configuration: "shadowTest")
+  testCompile project(path: ":beam-runners-direct-java", configuration: "shadow")
   testCompile library.java.junit
   testCompile library.java.hamcrest_core
   testCompile "org.apache.tika:tika-parsers:$tika_version"
diff --git a/sdks/java/io/xml/build.gradle b/sdks/java/io/xml/build.gradle
index e4cfd7cc3b8..3f02f283e2d 100644
--- a/sdks/java/io/xml/build.gradle
+++ b/sdks/java/io/xml/build.gradle
@@ -17,19 +17,20 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-io-xml")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: IO :: XML"
+ext.summary = "IO to read and write XML files."
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
   shadow library.java.stax2_api
   shadow library.java.findbugs_jsr305
   shadow library.java.woodstox_core_asl
   shadowTest library.java.jaxb_api
-  testCompile project(path: ":sdks:java:core", configuration: "shadowTest")
-  testCompile project(path: ":runners:direct-java", configuration: "shadow")
+  testCompile project(path: ":beam-sdks-java-core", configuration: "shadowTest")
+  testCompile project(path: ":beam-runners-direct-java", configuration: "shadow")
   testCompile library.java.junit
   testCompile library.java.slf4j_jdk14
   testCompile library.java.hamcrest_core
diff --git a/sdks/java/maven-archetypes/examples/build.gradle b/sdks/java/maven-archetypes/examples/build.gradle
index a7869393293..2a64e174a7c 100644
--- a/sdks/java/maven-archetypes/examples/build.gradle
+++ b/sdks/java/maven-archetypes/examples/build.gradle
@@ -17,9 +17,11 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-maven-archetypes-examples")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: Maven Archetypes :: Examples"
+ext.summary = """A Maven Archetype to create a project containing all the
+example pipelines from the Apache Beam Java SDK."""
 
 processResources {
   filter org.apache.tools.ant.filters.ReplaceTokens, tokens: [
@@ -44,14 +46,14 @@ processResources {
   ]
 }
 
-// The :examples:java main/test sourceSets are used in generation.
-evaluationDependsOn(':examples:java')
+// The :beam-examples-java main/test sourceSets are used in generation.
+evaluationDependsOn(':beam-examples-java')
 
 task generateSources(type: Exec) {
   println "Generating sources for archetype"
   inputs.file './generate-sources.sh'
-  inputs.dir project(':examples:java').sourceSets.main.allSource
-  inputs.dir project(':examples:java').sourceSets.test.allSource
+  inputs.dir project(':beam-examples-java').sourceSets.main.allSource
+  inputs.dir project(':beam-examples-java').sourceSets.test.allSource
   commandLine './generate-sources.sh'
 }
 
@@ -73,5 +75,5 @@ sourceSets {
 }
 
 dependencies {
-  shadow project(path: ":examples:java", configuration: "shadow")
+  shadow project(path: ":beam-examples-java", configuration: "shadow")
 }
diff --git a/sdks/java/maven-archetypes/starter/build.gradle b/sdks/java/maven-archetypes/starter/build.gradle
index 3a4332ada76..01d02861345 100644
--- a/sdks/java/maven-archetypes/starter/build.gradle
+++ b/sdks/java/maven-archetypes/starter/build.gradle
@@ -17,9 +17,11 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-maven-archetypes-starter")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: Maven Archetypes :: Starter"
+ext.summary = """A Maven archetype to create a simple starter pipeline to
+get started using the Apache Beam Java SDK."""
 
 // Add archetype testing/generation to existing GradleBuild PreCommit
 // https://issues.apache.org/jira/browse/BEAM-3256
@@ -33,6 +35,6 @@ task generateAndBuildArchetypeTest(type: Exec) {
 }
 
 dependencies {
-  shadow project(path: ":runners:direct-java", configuration: "shadow")
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
+  shadow project(path: ":beam-runners-direct-java", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
 }
diff --git a/sdks/java/nexmark/build.gradle b/sdks/java/nexmark/build.gradle
index 078365df375..b8f354d7af5 100644
--- a/sdks/java/nexmark/build.gradle
+++ b/sdks/java/nexmark/build.gradle
@@ -17,16 +17,16 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-nexmark")
+applyJavaNature()
 
 description = "Apache Beam :: SDKs :: Java :: Nexmark"
 
 dependencies {
   compile library.java.guava
-  shadow project(path: ":sdks:java:core", configuration: "shadow")
-  shadow project(path: ":sdks:java:io:google-cloud-platform", configuration: "shadow")
-  shadow project(path: ":sdks:java:extensions:google-cloud-platform-core", configuration: "shadow")
-  shadow project(path: ":sdks:java:extensions:sql", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-io-google-cloud-platform", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-extensions-google-cloud-platform-core", configuration: "shadow")
+  shadow project(path: ":beam-sdks-java-extensions-sql", configuration: "shadow")
   shadow library.java.google_api_services_bigquery
   shadow library.java.jackson_core
   shadow library.java.jackson_annotations
@@ -38,7 +38,7 @@ dependencies {
   shadow library.java.junit
   shadow library.java.hamcrest_core
   shadow library.java.commons_lang3
-  shadow project(path: ":runners:direct-java", configuration: "shadow")
+  shadow project(path: ":beam-runners-direct-java", configuration: "shadow")
   shadow library.java.slf4j_jdk14
   testCompile library.java.hamcrest_core
 }
diff --git a/sdks/python/container/build.gradle b/sdks/python/container/build.gradle
index 7c864365af9..551f10ec77d 100644
--- a/sdks/python/container/build.gradle
+++ b/sdks/python/container/build.gradle
@@ -25,14 +25,14 @@ description = "Apache Beam :: SDKs :: Python :: Container"
 // Figure out why the golang plugin does not add a build dependency between projects.
 // Without the line below, we get spurious errors about not being able to resolve
 // "./github.com/apache/beam/sdks/go"
-resolveBuildDependencies.dependsOn ":sdks:go:build"
+resolveBuildDependencies.dependsOn ":beam-sdks-go:build"
 
 dependencies {
   golang {
     // TODO(herohde): use "./" prefix to prevent gogradle use base github path, for now.
     // TODO(herohde): get the pkg subdirectory only, if possible. We spend mins pulling cmd/beamctl deps.
-    build name: './github.com/apache/beam/sdks/go', dir: project(':sdks:go').projectDir
-    test name: './github.com/apache/beam/sdks/go', dir: project(':sdks:go').projectDir
+    build name: './github.com/apache/beam/sdks/go', dir: project(':beam-sdks-go').projectDir
+    test name: './github.com/apache/beam/sdks/go', dir: project(':beam-sdks-go').projectDir
   }
 }
 
diff --git a/settings.gradle b/settings.gradle
index e740738d9e5..5558d15a6af 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -16,68 +16,135 @@
  * limitations under the License.
  */
 
-include ":examples:java"
-include ":model:fn-execution"
-include ":model:job-management"
-include ":model:pipeline"
+rootProject.name = "beam"
+
 include ":release"
-include ":runners:apex"
-include ":runners:core-construction-java"
-include ":runners:core-java"
-include ":runners:direct-java"
-include ":runners:flink"
-include ":runners:gcp:gcemd"
-include ":runners:gcp:gcsproxy"
-include ":runners:gearpump"
-include ":runners:google-cloud-dataflow-java"
-include ":runners:java-fn-execution"
-include ":runners:local-artifact-service-java"
-include ":runners:local-java"
-include ":runners:reference:java"
-include ":runners:reference:job-server"
-include ":runners:spark"
-include ":sdks:go"
-include ":sdks:go:container"
-include ":sdks:go:examples"
-include ":sdks:java:build-tools"
-include ":sdks:java:container"
-include ":sdks:java:core"
-include ":sdks:java:extensions:google-cloud-platform-core"
-include ":sdks:java:extensions:jackson"
-include ":sdks:java:extensions:join-library"
-include ":sdks:java:extensions:protobuf"
-include ":sdks:java:extensions:sketching"
-include ":sdks:java:extensions:sorter"
-include ":sdks:java:extensions:sql"
-include ":sdks:java:fn-execution"
-include ":sdks:java:harness"
-include ":sdks:java:io:amazon-web-services"
-include ":sdks:java:io:amqp"
-include ":sdks:java:io:cassandra"
-include ":sdks:java:io:common"
-include ":sdks:java:io:elasticsearch"
-include ":sdks:java:io:elasticsearch-tests:elasticsearch-tests-2"
-include ":sdks:java:io:elasticsearch-tests:elasticsearch-tests-5"
-include ":sdks:java:io:elasticsearch-tests:elasticsearch-tests-common"
-include ":sdks:java:io:file-based-io-tests"
-include ":sdks:java:io:google-cloud-platform"
-include ":sdks:java:io:hadoop-common"
-include ":sdks:java:io:hadoop-file-system"
-include ":sdks:java:io:hadoop-input-format"
-include ":sdks:java:io:hbase"
-include ":sdks:java:io:hcatalog"
-include ":sdks:java:io:jdbc"
-include ":sdks:java:io:jms"
-include ":sdks:java:io:kafka"
-include ":sdks:java:io:kinesis"
-include ":sdks:java:io:mongodb"
-include ":sdks:java:io:mqtt"
-include ":sdks:java:io:redis"
-include ":sdks:java:io:solr"
-include ":sdks:java:io:tika"
-include ":sdks:java:io:xml"
-include ":sdks:java:maven-archetypes:examples"
-include ":sdks:java:maven-archetypes:starter"
-include ":sdks:java:nexmark"
-include ":sdks:python"
-include ":sdks:python:container"
+
+include "beam-examples-java"
+project(":beam-examples-java").dir = file("examples/java")
+include "beam-model-fn-execution"
+project(":beam-model-fn-execution").dir = file("model/fn-execution")
+include "beam-model-job-management"
+project(":beam-model-job-management").dir = file("model/job-management")
+include "beam-model-pipeline"
+project(":beam-model-pipeline").dir = file("model/pipeline")
+include "beam-runners-apex"
+project(":beam-runners-apex").dir = file("runners/apex")
+include "beam-runners-core-construction-java"
+project(":beam-runners-core-construction-java").dir = file("runners/core-construction-java")
+include "beam-runners-core-java"
+project(":beam-runners-core-java").dir = file("runners/core-java")
+include "beam-runners-direct-java"
+project(":beam-runners-direct-java").dir = file("runners/direct-java")
+include "beam-runners-flink_2.11"
+project(":beam-runners-flink_2.11").dir = file("runners/flink")
+include "beam-runners-gcp-gcemd"
+project(":beam-runners-gcp-gcemd").dir = file("runners/gcp/gcemd")
+include "beam-runners-gcp-gcsproxy"
+project(":beam-runners-gcp-gcsproxy").dir = file("runners/gcp/gcsproxy")
+include "beam-runners-gearpump"
+project(":beam-runners-gearpump").dir = file("runners/gearpump")
+include "beam-runners-google-cloud-dataflow-java"
+project(":beam-runners-google-cloud-dataflow-java").dir = file("runners/google-cloud-dataflow-java")
+include "beam-runners-java-fn-execution"
+project(":beam-runners-java-fn-execution").dir = file("runners/java-fn-execution")
+include "beam-local-artifact-service-java"
+project(":beam-local-artifact-service-java").dir = file("runners/local-artifact-service-java")
+include "beam-runners-local-java-core"
+project(":beam-runners-local-java-core").dir = file("runners/local-java")
+include "beam-runners-reference-java"
+project(":beam-runners-reference-java").dir = file("runners/reference/java")
+include "beam-runners-reference-job-server"
+project(":beam-runners-reference-job-server").dir = file("runners/reference/job-server")
+include "beam-runners-spark"
+project(":beam-runners-spark").dir = file("runners/spark")
+include "beam-sdks-go"
+project(":beam-sdks-go").dir = file("sdks/go")
+include "beam-sdks-go-container"
+project(":beam-sdks-go-container").dir = file("sdks/go/container")
+include "beam-sdks-go-examples"
+project(":beam-sdks-go-examples").dir = file("sdks/go/container")
+include "beam-sdks-java-build-tools"
+project(":beam-sdks-java-build-tools").dir = file("sdks/java/build-tools")
+include "beam-sdks-java-container"
+project(":beam-sdks-java-container").dir = file("sdks/java/container")
+include "beam-sdks-java-core"
+project(":beam-sdks-java-core").dir = file("sdks/java/core")
+include "beam-sdks-java-extensions-google-cloud-platform-core"
+project(":beam-sdks-java-extensions-google-cloud-platform-core").dir = file("sdks/java/extensions/google-cloud-platform-core")
+include "beam-sdks-java-extensions-json-jackson"
+project(":beam-sdks-java-extensions-json-jackson").dir = file("sdks/java/extensions/jackson")
+include "beam-sdks-java-extensions-join-library"
+project(":beam-sdks-java-extensions-join-library").dir = file("sdks/java/extensions/join-library")
+include "beam-sdks-java-extensions-protobuf"
+project(":beam-sdks-java-extensions-protobuf").dir = file("sdks/java/extensions/protobuf")
+include "beam-sdks-java-extensions-sketching"
+project(":beam-sdks-java-extensions-sketching").dir = file("sdks/java/extensions/sketching")
+include "beam-sdks-java-extensions-sorter"
+project(":beam-sdks-java-extensions-sorter").dir = file("sdks/java/extensions/sorter")
+include "beam-sdks-java-extensions-sql"
+project(":beam-sdks-java-extensions-sql").dir = file("sdks/java/extensions/sql")
+include "beam-sdks-java-fn-execution"
+project(":beam-sdks-java-fn-execution").dir = file("sdks/java/fn-execution")
+include "beam-sdks-java-harness"
+project(":beam-sdks-java-harness").dir = file("sdks/java/harness")
+include "beam-sdks-java-io-amazon-web-services"
+project(":beam-sdks-java-io-amazon-web-services").dir = file("sdks/java/io/amazon-web-services")
+include "beam-sdks-java-io-amqp"
+project(":beam-sdks-java-io-amqp").dir = file("sdks/java/io/amqp")
+include "beam-sdks-java-io-cassandra"
+project(":beam-sdks-java-io-cassandra").dir = file("sdks/java/io/cassandra")
+include "beam-sdks-java-io-common"
+project(":beam-sdks-java-io-common").dir = file("sdks/java/io/common")
+include "beam-sdks-java-io-elasticsearch"
+project(":beam-sdks-java-io-elasticsearch").dir = file("sdks/java/io/elasticsearch")
+include "beam-sdks-java-io-elasticsearch-tests-2"
+project(":beam-sdks-java-io-elasticsearch-tests-2").dir = file("sdks/java/io/elasticsearch-tests/elasticsearch-tests-2")
+include "beam-sdks-java-io-elasticsearch-tests-5"
+project(":beam-sdks-java-io-elasticsearch-tests-5").dir = file("sdks/java/io/elasticsearch-tests/elasticsearch-tests-5")
+include "beam-sdks-java-io-elasticsearch-tests-common"
+project(":beam-sdks-java-io-elasticsearch-tests-common").dir = file("sdks/java/io/elasticsearch-tests/elasticsearch-tests-common")
+include "beam-sdks-java-io-file-based-io-tests"
+project(":beam-sdks-java-io-file-based-io-tests").dir = file("sdks/java/io/file-based-io-tests")
+include "beam-sdks-java-io-google-cloud-platform"
+project(":beam-sdks-java-io-google-cloud-platform").dir = file("sdks/java/io/google-cloud-platform")
+include "beam-sdks-java-io-hadoop-common"
+project(":beam-sdks-java-io-hadoop-common").dir = file("sdks/java/io/hadoop-common")
+include "beam-sdks-java-io-hadoop-file-system"
+project(":beam-sdks-java-io-hadoop-file-system").dir = file("sdks/java/io/hadoop-file-system")
+include "beam-sdks-java-io-hadoop-input-format"
+project(":beam-sdks-java-io-hadoop-input-format").dir = file("sdks/java/io/hadoop-input-format")
+include "beam-sdks-java-io-hbase"
+project(":beam-sdks-java-io-hbase").dir = file("sdks/java/io/hbase")
+include "beam-sdks-java-io-hcatalog"
+project(":beam-sdks-java-io-hcatalog").dir = file("sdks/java/io/hcatalog")
+include "beam-sdks-java-io-jdbc"
+project(":beam-sdks-java-io-jdbc").dir = file("sdks/java/io/jdbc")
+include "beam-sdks-java-io-jms"
+project(":beam-sdks-java-io-jms").dir = file("sdks/java/io/jms")
+include "beam-sdks-java-io-kafka"
+project(":beam-sdks-java-io-kafka").dir = file("sdks/java/io/kafka")
+include "beam-sdks-java-io-kinesis"
+project(":beam-sdks-java-io-kinesis").dir = file("sdks/java/io/kinesis")
+include "beam-sdks-java-io-mongodb"
+project(":beam-sdks-java-io-mongodb").dir = file("sdks/java/io/mongodb")
+include "beam-sdks-java-io-mqtt"
+project(":beam-sdks-java-io-mqtt").dir = file("sdks/java/io/mqtt")
+include "beam-sdks-java-io-redis"
+project(":beam-sdks-java-io-redis").dir = file("sdks/java/io/redis")
+include "beam-sdks-java-io-solr"
+project(":beam-sdks-java-io-solr").dir = file("sdks/java/io/solr")
+include "beam-sdks-java-io-tika"
+project(":beam-sdks-java-io-tika").dir = file("sdks/java/io/tika")
+include "beam-sdks-java-io-xml"
+project(":beam-sdks-java-io-xml").dir = file("sdks/java/io/xml")
+include "beam-sdks-java-maven-archetypes-examples"
+project(":beam-sdks-java-maven-archetypes-examples").dir = file("sdks/java/maven-archetypes/examples")
+include "beam-sdks-java-maven-archetypes-starter"
+project(":beam-sdks-java-maven-archetypes-starter").dir = file("sdks/java/maven-archetypes/starter")
+include "beam-sdks-java-nexmark"
+project(":beam-sdks-java-nexmark").dir = file("sdks/java/nexmark")
+include "beam-sdks-python"
+project(":beam-sdks-python").dir = file("sdks/python")
+include "beam-sdks-python-container"
+project(":beam-sdks-python-container").dir = file("sdks/python/container")


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Issue Time Tracking
-------------------

    Worklog Id:     (was: 88965)
    Time Spent: 1h 40m  (was: 1.5h)

> Update release process to use Gradle
> ------------------------------------
>
>                 Key: BEAM-3255
>                 URL: https://issues.apache.org/jira/browse/BEAM-3255
>             Project: Beam
>          Issue Type: Sub-task
>          Components: build-system
>            Reporter: Luke Cwik
>            Assignee: Alan Myrvold
>            Priority: Major
>          Time Spent: 1h 40m
>  Remaining Estimate: 0h
>
> This task is about configuring Gradle to generate pom's and artifacts required to perform a release and update the nightly release snapshot Jenkins jobs found here https://github.com/apache/beam/blob/master/.test-infra/jenkins/job_beam_Release_NightlySnapshot.groovy
> We will also require some integration tests to run against the released nightly snapshot artifacts to ensure that what was built is valid.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)


Mime
View raw message