Usar Gradle y el complemento de App Engine

Puedes usar Gradle, un sistema de automatización de compilaciones flexible y declarativo que se usa para automatizar la compilación, las pruebas, la publicación y el despliegue. En esta página se explica cómo usar Gradle con un proyecto de App Engine en el entorno estándar.

Antes de empezar

Instala y configura los siguientes requisitos previos:

Configurar y validar un proyecto de Google Cloud

Debes configurar tu Google Cloud proyecto e instalar gcloud CLI:

  1. Usa la Google Cloud consola para crear y configurar tu Google Cloud proyecto:

    Ir a App Engine

    1. Selecciona o crea un Google Cloud proyecto.
    2. Sigue las indicaciones para asegurarte de que existe una aplicación de App Engine y de que la facturación está habilitada:
      1. Si necesitas crear una aplicación de App Engine para tu proyecto, se te pedirá que selecciones la región en la que quieras ubicarla.
      2. Sigue las indicaciones para crear una cuenta de facturación o seleccionar una que ya tengas.
    3. El panel de control se abre después de que se haya creado tu aplicación de App Engine y se haya habilitado la facturación en tu proyecto.
  2. No es necesario que instales la CLI de gcloud, ya que el complemento instala automáticamente el SDK cuando es necesario.

Crear un proyecto de Gradle

Puedes crear un proyecto de Gradle desde cero con la shell. También puedes descargar, ejecutar de forma local y desplegar el proyecto Hello World para probar el complemento.

  1. Crea un directorio y accede a él.

  2. Para inicializar un proyecto nuevo, sigue estos pasos:

    gradle init --type java-library;
    mkdir -p src/main/webapp/WEB-INF;
    rm src/main/java/Library.java src/test/java/LibraryTest.java
    
  3. Añade lo siguiente al archivo build.gradle para añadir tareas de Gradle de App Engine, repositorios Maven, el complemento Gradle de App Engine, dependencias y configuración de tareas:

    buildscript {    // Configuration for building
      repositories {
        jcenter()    // Bintray's repository - a fast Maven Central mirror & more
        mavenCentral()
      }
      dependencies {
        classpath 'com.google.cloud.tools:appengine-gradle-plugin:2.5.0' // If a newer version is available, use it
      }
    }
    
    repositories {   // repositories for Jar's you access in your code
      maven {
        url 'https://oss.sonatype.org/content/repositories/snapshots' // SNAPSHOT repository (if needed)
      }
      mavenCentral()
      jcenter()
    }
    
    apply plugin: 'java'                              // standard Java tasks
    apply plugin: 'war'                               // standard Web Archive plugin
    apply plugin: 'com.google.cloud.tools.appengine'  // App Engine tasks
    
    dependencies {
      implementation 'com.google.appengine:appengine-api-1.0-sdk:+'  // Latest App Engine Api's
      providedCompile 'javax.servlet:javax.servlet-api:3.1.0'
    
      implementation 'jstl:jstl:1.2'
    
    // Add your dependencies here.
    //  implementation 'com.google.cloud:google-cloud:+'   // Latest Cloud API's http://googlecloudplatform.github.io/google-cloud-java
    
      testImplementation 'junit:junit:4.13.2'
      testImplementation 'com.google.truth:truth:1.1.5'
      testImplementation 'org.mockito:mockito-core:4.11.0'
    
      testImplementation 'com.google.appengine:appengine-testing:+'
      testImplementation 'com.google.appengine:appengine-api-stubs:+'
      testImplementation 'com.google.appengine:appengine-tools-sdk:+'
    }
    
    // Always run unit tests
    appengineDeploy.dependsOn test
    appengineStage.dependsOn test
    
    appengine {  // App Engine tasks configuration
      deploy {   // deploy configuration
        projectId = System.getenv('GOOGLE_CLOUD_PROJECT')
        version = '1'
      }
    }
    
    test {
      useJUnit()
      testLogging.showStandardStreams = true
      beforeTest { descriptor ->
         logger.lifecycle("test: " + descriptor + "  Running")
      }
    
      onOutput { descriptor, event ->
         logger.lifecycle("test: " + descriptor + ": " + event.message )
      }
      afterTest { descriptor, result ->
        logger.lifecycle("test: " + descriptor + ": " + result )
      }
    }
    
    group   = "com.example.appenginej8"        // Generated output GroupId
    version = "1.0-SNAPSHOT"       // Version in generated output
    
    sourceCompatibility = 1.8     // App Engine Flexible uses Java 8
    targetCompatibility = 1.8     // App Engine Flexible uses Java 8
  4. También debes añadir los siguientes archivos a tu proyecto mediante un editor de texto o un entorno de desarrollo integrado (IDE):

Consulta Archivos de configuración para obtener una descripción general de un proyecto de App Engine en Java.

Descargar la aplicación Hello World

  1. Clona el repositorio de la aplicación de muestra Hello World en la máquina local:

    git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
    

    También puedes descargar la muestra como un archivo ZIP y extraerla.

  2. Accede al directorio que contiene el código de muestra:

    cd java-docs-samples/appengine-java8/helloworld
    

Probar una aplicación con el servidor de desarrollo

  1. Para acceder a los recursos de Google desde tu proyecto cuando se ejecute de forma local, define las credenciales predeterminadas de la aplicación ejecutando el siguiente comando:

    gcloud auth application-default login
    
  2. Cambia a la raíz del directorio de tu aplicación.

  3. Durante la fase de desarrollo, puedes ejecutar y probar tu aplicación en cualquier momento en el servidor de desarrollo invocando Gradle:

    gradle appengineRun
    

    También puedes ejecutar Gradle sin instalarlo usando el wrapper de Gradle.

  4. Espera a que se inicie el servidor. El servidor se inicia con tu aplicación en ejecución cuando ves un mensaje similar a este:

    :compileJava
    :processResources NO-SOURCE
    :classes
    :war
    :explodeWar
    :assemble
    :appengineRun
    2018-06-05 22:50:46.231:INFO::main: Logging initialized @321ms
    Jun 06, 2018 2:50:49 AM com.google.appengine.tools.development.AbstractModule startup
    INFO: Module instance default is running at http://localhost:8080/
    Jun 06, 2018 2:50:49 AM com.google.appengine.tools.development.AbstractModule startup
    INFO: The admin console is running at http://localhost:8080/_ah/admin
    Jun 05, 2018 10:50:49 PM com.google.appengine.tools.development.DevAppServerImpl doStart
    INFO: Dev App Server is now running
    
  5. Consulta tu aplicación en http://127.0.0.1:8080.

Depurar en el servidor de desarrollo

Para depurar una aplicación que se ejecuta de forma local, asigna el valor jvmFlags a la propiedad para habilitar la depuración en la JVM subyacente. Por ejemplo:

    appengine {
      run {
        jvmFlags = ['-Xdebug', '-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005']
      }
    }

Habilitar la recarga activa de la aplicación

La recarga en caliente es la capacidad de actualizar una o varias clases en una aplicación que se está ejecutando sin detener el entorno. Para habilitar la recarga en caliente, sigue estos pasos:

  • Debes indicar al servidor local que busque cambios:

    appengine {
      run {
        automaticRestart = true
      }
    }
    
  • Mientras tu aplicación se está ejecutando, ejecuta la tarea explodeWar para copiar los cambios directamente en la aplicación descompilada y propaga los cambios a la aplicación en ejecución.

Desplegar una aplicación

Para desplegar tu aplicación, sigue estos pasos:

gradle appengineDeploy

La tarea appengineDeploy y todas las demás tareas de Gradle tienen propiedades asociadas que puedes usar. Para ver una lista completa de tareas y propiedades, consulta Tareas y propiedades de Gradle de App Engine.

Usar el envoltorio de Gradle

Gradle proporciona un mecanismo para descargar y ejecutar la versión necesaria de Gradle sin necesidad de instalarla:

Linux/macOS

./gradlew appengineRun

Windows

gradlew.bat appengineRun

Puedes consultar más información sobre Gradle en Tareas y propiedades de Gradle de App Engine.

Siguientes pasos