Este codelab está planeado para mostrar una forma de depurar un proyecto JHipster en VScode (VisualStudio Code).

Debido a que un proyecto de JHipster es tanto un proyecto spring-boot como un proyecto node, la forma de ejecutarlo y depurarlo en VScode es mediante los métodos que éste proveé para interactuar con spring-boot y node.

Los proyectos de CONACyT suelen estar previamente preconfigurados para reducir los problemas de compilación y ejecución. Sin embargo, si el proyecto fue creado por medio del generador de JHipster (para alguna prueba) y usa H2 como base de datos en desarrollo, será necesario hacer una configuración previa en el proyecto.

Dentro del archivo pom.xml se debe modificar el profile eclipse, agregando la dependencia para H2:

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
</dependency>

Esto evitará que, al momento de ejecutar el proyecto, se muestre la siguiente excepción:

org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is java.lang.RuntimeException: java.lang.RuntimeException: Failed to load and initialize org.h2.server.web.WebServlet
...
Caused by: java.lang.ClassNotFoundException: org.h2.server.web.WebServlet

Debido a que VScode es un IDE multipropósito, es necesario se configure para ejecutar el proyecto de forma adecuada.

Como parte de esta configuración, se requiere tener instaladas las siguientes extensiones:

Una vez instaladas las extensiones, es necesario reiniciar el IDE para que las extensiones se activen de forma correcta.

Como se menciona con anterioridad, VScode es un un IDE multipropósito y se requiere agregar una configuración para que el proyecto spring-boot se ejecute como tal.

La forma más simple de generar la configuración por medio de la extensión Spring Boot Dashboard, esta habilita el panel de Spring Boot Dashboard dentro del panel Explorer. En esta sección se debe dar clic en el botón start o debug de la aplicación que se quiere configurar/depurar.

img06

Después de que se de clic en el botón de start o debug de la aplicación, se abrirá la ventana Debug console y dentro de esta se deberá mostrar el log de la aplicación. Una vez que termine de arrancarse la aplicación se mostrará un mensaje que indica que la aplicación está ejecutándose en el puerto 8080 (o el puerto que esté usando la aplicación).

img04

Aunado a lo anterior, la extensión de Spring Boot Dashboard agrega la configuración del proyecto spring-boot al archivo de configuración para ejecución del proyecto (.vscode/launch.json).

El contenido del archivo de configuración para ejecución del proyecto es similar al siguiente:

{
    "configurations": [
        {
            "type": "java",
            "name": "Spring Boot-OpenapiApp<openapi>",
            "request": "launch",
            "cwd": "${workspaceFolder}",
            "console": "internalConsole",
            "mainClass": "mx.conacyt.crip.ejemplos.openapi.OpenapiApp",
            "projectName": "openapi",
            "args": "",
            "envFile": "${workspaceFolder}/.env"
        }
    ]
}

Es recomendable editar la configuración generada y agregar un parámetro para el profile dev:

{
    "configurations": [
        {
            "type": "java",
            "name": "Spring Boot-OpenapiApp<openapi>",
            "request": "launch",
            "cwd": "${workspaceFolder}",
            "console": "internalConsole",
            "mainClass": "mx.conacyt.crip.ejemplos.openapi.OpenapiApp",
            "projectName": "openapi",
            "args": "--spring.profiles.active=dev",
            "envFile": "${workspaceFolder}/.env"
        }
    ]
}

Si se requiere agregar manualmente la configuración de ejecución del proyecto, es necesario usar el submenú Add configuration... que se encuentra dentro del menú Run. Al dar clic en Add configuration... se desplegará una lista con las configuraciones soportadas y se deberá seleccionar Java.

img01

Después de seleccionar la opción de Java, VScode generará el archivo de configuración para ejecución del proyecto (.vscode/launch.json) (en caso de no existir uno previo):

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "type": "java",
            "name": "Launch Current File",
            "request": "launch",
            "mainClass": "${file}"
        }
    ]
}

Es necesario que se modifique el contenido de la configuración generada por VScode para que se parezca a la configuración que la extensión de Spring Boot Dashboard hubiese generado:

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "type": "java",
            "name": "Spring Boot-PruebApp<prueba>",
            "request": "launch",
            "cwd": "${workspaceFolder}",
            "console": "internalConsole",
            "mainClass": "mx.conacyt.crip.ejemplos.prueba.PruebaApp",
            "projectName": "prueba",
            "args": "--spring.profiles.active=dev",
            "envFile": "${workspaceFolder}/.env"
        }
    ]
}

De la configuración, lo más importante es:

Una vez guardada la configuración, se puede ejecutar el proyecto de diferentes formas:

Ejecución desde menú de comandos

Por medio del menú de comandos (control + shift + p en Linux y Windows o command + shift + p en MacOs) se pueden ejecutar diversas operaciones, algunas de ellas están relacionadas con la ejecución y depuración de los proyectos.

Ejecución desde el panel Run and Debug

Otra forma de ejecutar el proyecto es desde el panel de Run and Debug. Dentro de ese panel se debe dar clic en el botón de Start Debugging (el triángulo de play) esto ejecutará el proyecto modo de depuración:

img03

Consola de log del proyecto

Sin importar el método usado para ejecutar el proyecto, el log del mismo se mostrará en la ventana de Debug Console (esto por el atributo console: internalConsole la configuración guardada).

img04

En los pasos anteriores solo se ha contemplado el proyecto spring-boot del proyecto JHipster (la parte del back), es necesario ejecutar a la par el proyecto node (la parte del front) si se desea ejecutar la aplicación web completa.

Para poder ejecutar el proyecto node es necesario instalar las dependencias por medio del comando npm. Esto lo podemos hacer dentro de una terminal interna de VScode (menú Terminal y seleccionar el submenú New termial):

npm install

Una vez instaladas las dependencias es posible ejecutar el proyecto (en la misma terminal), con el siguiente comando:

npm start

Una vez que el proyecto termine de arrancar, se debería mostrar algo como lo siguiente:

 ----------------------------------------
       Local: http://localhost:9000
    External: http://1.1.1.1:9000
 ----------------------------------------
          UI: http://localhost:3001
 UI External: http://localhost:3001
 ----------------------------------------

En el siguiente paso se podrá agregar una configuración para ejecutar el proyecto node en VScode.

Configuración

Para poder ejecutar el proyecto node dentro del VScode, es necesario usar el submenú Add configuration... que se encuentra dentro del menú Run. Al dar clic en Add configuration... se desplegará, una vez más, una lista con las configuraciones soportadas y se deberá seleccionar Node.js: Launch via npm.

img07

Después de seleccionar la opción, se agregará al archivo de configuraciones (.vscode/launch.json) una entrada como la siguiente:

    {
        "name": "Launch via NPM",
        "request": "launch",
        "runtimeArgs": [
            "run-script",
            "debug"
        ],
        "runtimeExecutable": "npm",
        "skipFiles": [
            "<node_internals>/**"
        ],
        "type": "pwa-node"
    }

Es necesario modificar la configuración para sea compatible con el proyecto node, en particular es necesario cambiar la llave runtimeArgs y dejarla como se muestra a continuación:

    {
        "name": "Launch via NPM",
        "request": "launch",
        "runtimeArgs": [
            "start"
        ],
        "runtimeExecutable": "npm",
        "skipFiles": [
            "<node_internals>/**"
        ],
        "type": "pwa-node"
    }

Nota: Antes de ejecutar el proyecto es necesario instalar las dependencias del mismo con el comando npm install.

Ejecución

Para ejecutar el proyecto es necesario que ir al panel Run and debug y ahí seleccionar de la lista de configuraciones disponibles la opción Launch via NPM.

img08

Una vez seleccionada la configuración deseada, se debe dar clic al botón Start Debugging (el triángulo de play).

img09

Esto ejecutará el proyecto y en la ventana de Debug console deberá se mostrará el log de ejecución, al final se debe mostrar algo como lo siguiente:

img10

Debido a que el proyecto node es un proyecto Vue (un proyecto web), la depuración requiere el uso de un navegador.

Se tienen dos opciones para la depuración:

Como sucedió con spring-boot, se requiere crear una configuración para poder depurar el proyecto node.

Dentro del menú Run se debe dar clic al submenú Add configuration..., esto desplegará una lista de opciones de configuración disponibles y de las cuales se deberá seleccionar Chrome: Launch

img11

Al seleccionar la opción indicada, se generará una entrada como la siguiente:

    {
        "name": "Launch Chrome",
        "request": "launch",
        "type": "pwa-chrome",
        "url": "http://localhost:8080",
        "webRoot": "${workspaceFolder}"
    },

Esa configuración se deberá modificar de la siguiente forma:

        {
            "type": "chrome",
            "request": "launch",
            "name": "vuejs: chrome",
            "url": "http://localhost:9000",
            "webRoot": "${workspaceFolder}/src",
            "breakOnLoad": true,
            "sourceMapPathOverrides": {
              "webpack:///src/*": "${webRoot}/*"
            }
          }

Para más opciones sobre esta configuración, revisar el sitio de la extensión de debugger for chrome.

Dentro del menú Run se debe dar clic al submenú Add configuration..., esto desplegará una lista de opciones de configuración disponibles y de las cuales se deberá seleccionar Firefox: Launch (server)

img12

Al seleccionar la opción indicada, se generará una entrada como la siguiente:

        {
            "type": "firefox",
            "request": "launch",
            "reAttach": true,
            "name": "Launch localhost",
            "url": "http://localhost/index.html",
            "webRoot": "${workspaceFolder}"
        }

Esa configuración se deberá modificar de la siguiente forma:

        {
            "type": "firefox",
            "request": "launch",
            "name": "vuejs: firefox",
            "url": "http://localhost:9000",
            "webRoot": "${workspaceFolder}/src",
            "pathMappings": [{ "url": "webpack:///src/", "path": "${webRoot}/" }]
        }

Para más opciones sobre esta configuración, revisar el sitio de la extensión de Debugger for Firefox.

Una vez creada la configuración, se podrá seleccionar en el panel Run and Debug (en el ejemplo se ha seleccionado la configuración para firefox)

img13

Una vez seleccionada la opción de configuración deseada, se debe dar clic el botón Start Debugging (el triángulo de play).

img14

Esto abrirá un navegador con las siguientes características:

Para los proyectos de CONACyT, será necesario agregar parámetros a las configuraciones de ejecución de proyecto (por ejemplo para la url de la base de datos).

Revisar el codelab de Cómo agregar parámetros para ejecutar el proyecto.