diff --git a/appengine/endpoints-frameworks-v2/backend/README.md b/appengine/endpoints-frameworks-v2/backend/README.md
index 4c226cda3b0..817547af270 100644
--- a/appengine/endpoints-frameworks-v2/backend/README.md
+++ b/appengine/endpoints-frameworks-v2/backend/README.md
@@ -3,7 +3,9 @@
This sample demonstrates how to use Google Cloud Endpoints Frameworks using
Java on App Engine Standard.
-## Adding the project ID to the sample API code
+## Build with Maven
+
+### Adding the project ID to the sample API code
You must add the project ID obtained when you created your project to the
sample's `pom.xml` before you can deploy the code.
@@ -21,19 +23,19 @@ your project ID.
0. Save your changes.
-## Building the sample project
+### Building the sample project
To build the project:
mvn clean package
-## Generating the openapi.json file
+### Generating the openapi.json file
To generate the required configuration file `openapi.json`:
mvn exec:java -DGetSwaggerDoc
-## Deploying the sample API to App Engine
+### Deploying the sample API to App Engine
To deploy the sample API:
@@ -51,7 +53,92 @@ To deploy the sample API:
0. Wait for the upload to finish.
-## Sending a request to the sample API
+### Sending a request to the sample API
+
+After you deploy the API and its configuration file, you can send requests
+to the API.
+
+To send a request to the API, from a command line, invoke the following `cURL`
+command:
+
+ curl \
+ -H "Content-Type: application/json" \
+ -X POST \
+ -d '{"message":"echo"}' \
+ https://$PROJECT_ID.appspot.com/_ah/api/echo/v1/echo
+
+You will get a 200 response with the following data:
+
+ {
+ "message": "echo"
+ }
+
+## Build with gradle
+
+### Adding the project ID to the sample API code
+
+0. Edit the file `build.gradle`.
+
+0. For `def projectId = 'YOUR_PROJECT_ID'`, replace the value `YOUR_PROJECT_ID` with
+your project ID.
+
+0. Edit the file `src/main/java/com/example/echo/Echo.java
+
+0. Replace the value `YOUR-PROJECT-ID` with your project ID.
+
+0. Save your changes.
+
+### Building the sample project
+
+To build the project use:
+
+ gradle build
+
+
+ more details
+ The project contains the standard java and war plugins and in addition to that it contains the following plugins:
+ https://github.com/GoogleCloudPlatform/endpoints-framework-gradle-plugin for the endpoint related tasks and
+ https://github.com/GoogleCloudPlatform/app-gradle-plugin for the appengine standard related tasks.
+
+ Check the links for details about the available Plugin Goals and Parameters.
+
+
+### Generating the openapi.json file
+
+To generate the required configuration file `openapi.json`:
+
+ gradle endpointsOpenApiDocs
+
+This results in a file in build/endpointsOpenApiDocs/openapi.json
+
+### Deploying the sample API to App Engine
+
+To deploy the sample API:
+
+0. Invoke the `gcloud` command to deploy the API configuration file:
+
+ gcloud service-management deploy build/endpointsOpenApiDocs/openapi.json
+
+0. Deploy the API implementation code by invoking:
+
+ gradle appengineDeploy
+
+ The first time you upload a sample app, you may be prompted to authorize the
+ deployment. Follow the prompts: when you are presented with a browser window
+ containing a code, copy it to the terminal window.
+
+
+ ERROR: (gcloud.app.deploy) The current Google Cloud project [...] does not contain an App Engine application.
+ If you create a fresh cloud project that doesn't contain a appengine application you may receive this Error:
+
+ ERROR: (gcloud.app.deploy) The current Google Cloud project [...] does not contain an App Engine application. Use `gcloud app create` to initialize an App Engine application within the project.
+
+ In that case just execute `gcloud app create`, you will be asked to select a region and the app will be created. Then run gradle appengineDeploy again.
+
+
+0. Wait for the upload to finish.
+
+### Sending a request to the sample API
After you deploy the API and its configuration file, you can send requests
to the API.
diff --git a/appengine/endpoints-frameworks-v2/backend/build.gradle b/appengine/endpoints-frameworks-v2/backend/build.gradle
new file mode 100644
index 00000000000..e09ba4c3851
--- /dev/null
+++ b/appengine/endpoints-frameworks-v2/backend/build.gradle
@@ -0,0 +1,68 @@
+// Copyright 2017 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.import org.apache.tools.ant.filters.ReplaceTokens
+
+buildscript {
+ repositories {
+ mavenCentral()
+ }
+
+ dependencies {
+ classpath 'com.google.cloud.tools:endpoints-framework-gradle-plugin:+'
+ classpath 'com.google.cloud.tools:appengine-gradle-plugin:+'
+ }
+}
+
+repositories {
+ maven {
+ url 'https://maven-central.storage.googleapis.com'
+ }
+ jcenter()
+ mavenCentral()
+}
+
+task wrapper(type: Wrapper) {
+ gradleVersion = '3.5'
+}
+
+def projectId = 'YOUR_PROJECT_ID'
+
+apply plugin: 'java'
+apply plugin: 'war'
+apply plugin: 'com.google.cloud.tools.endpoints-framework-server'
+apply plugin: 'com.google.cloud.tools.appengine'
+
+dependencies {
+ // For real projects: use concrete versions here instead of the '+' to make your build consistent
+ compile 'com.google.endpoints:endpoints-framework:+'
+ compile 'com.google.endpoints:endpoints-management-control-appengine:+'
+ compile 'com.google.endpoints:endpoints-framework-auth:+'
+}
+
+endpointsServer {
+ // Endpoints Framework Plugin server-side configuration
+ hostname = "echo-api.endpoints.${projectId}.cloud.goog"
+}
+
+sourceCompatibility = 1.7 // App Engine Standard uses Java 7
+targetCompatibility = 1.7 // App Engine Standard uses Java 7
+
+// this replaces the ${endpoints.project.id} in appengine-web.xml and web.xml
+task replaceProjectId(type: Copy) {
+ from 'src/main/webapp/WEB-INF/'
+ include '*.xml'
+ into 'build/exploded-backend/WEB-INF'
+ expand(endpoints:[project:[id:projectId]])
+ filteringCharset = 'UTF-8'
+}
+assemble.dependsOn replaceProjectId