En este documento se describe cómo volver a empaquetar una aplicación Java 8 como un archivo JAR para ejecutarla en un entorno de ejecución de Java compatible. Para usar un tiempo de ejecución de Java compatible, puedes insertar un servidor como Jetty o contenerizar tu aplicación con Docker para obtener un tiempo de ejecución personalizado sin tener que reescribir completamente tu aplicación. Puedes ejecutar tus aplicaciones WAR en plataformas Java modernas o en entornos de nube flexibles. Elige uno de los siguientes métodos, el que mejor se adapte a tu estrategia de implementación e infraestructura:
- Usar Dockerfiles para desplegar la aplicación (recomendado)
- Usar un tiempo de ejecución de Java insertado (Jetty)
Preparar tu aplicación web Java 8 (archivo WAR)
Antes de volver a empaquetar tu aplicación Java 8 como un archivo JAR compatible, debes crear un archivo WAR. En esta sección se proporciona una aplicación de ejemplo de Java 8 que crea un archivo WAR. Sigue las instrucciones para crear una aplicación Java 8 hello-world
:
Crea un archivo
HelloServlet.java
en el directorio de origen:Crea un archivo de descriptor de implementación
web.xml
para configurar tu aplicación web:Crea una página de destino
index.jsp
:Añade el siguiente código al archivo
pom.xml
para definir la compilación de tu aplicación Java 8:Configuración del empaquetado de WAR:
<groupId>com.example</groupId> <artifactId>HelloWorldApp</artifactId> <version>1.0</version> <packaging>war</packaging>
Complemento
maven-war-plugin
con el origenmaven.compiler
y el destino definidos en la versión1.8
:<properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <java.version>8</java.version> </properties>
javax.servlet-api
dependencia:<dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> </dependencies>
Configuración de Maven:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>${maven.compiler.source}</source> <target>${maven.compiler.target}</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.2</version> </plugin> </plugins> </build>
El directorio de tu proyecto debería tener una estructura similar a la siguiente:
├── pom.xml └── src └── main ├── java │ └── com │ └── example │ └── HelloServlet.java └── webapp ├── WEB-INF │ └── web.xml └── index.jsp
Ejecuta
mvn install
en el directorio del proyecto de tu aplicación para generar el archivo WARHelloWorldApp-1.0.war
en el directorio de destino.
Usar Dockerfiles para desplegar la aplicación (opción recomendada)
Los entornos de ejecución personalizados son adecuados para plataformas que admiten contenedores personalizados, como los entornos de ejecución personalizados de App Engine. Los entornos de ejecución personalizados ofrecen flexibilidad, ya que te permiten configurar el entorno de ejecución. Para ver un ejemplo de cómo implementar tiempos de ejecución personalizados, consulta Crear una aplicación de tiempo de ejecución personalizado en el entorno flexible de App Engine.
En las siguientes instrucciones se describe cómo crear un contenedor para tu aplicación Java 8 mediante un Dockerfile:
- Preparar una aplicación web Java 8 (archivo WAR)
- Crea la imagen de contenedor y envíala a Artifact Registry
- Desplegar una aplicación
Crea la imagen de contenedor y envíala a Artifact Registry
En esta sección se describe cómo crear una imagen Docker con Cloud Build y enviarla a un repositorio de Artifact Registry. Sigue estos pasos para crear una imagen de contenedor de tu aplicación:
Crea un archivo
cloudbuild.yaml
en el directorio de origen para crear la imagen de Docker y enviarla a Artifact Registry:steps: # Step 1: Build the Docker image - name: "gcr.io/cloud-builders/docker" args: - "build" - "-t" - "$LOCATION-docker.pkg.dev/$PROJECT/$REPOSITORY/SERVICE:VERSION" - "." # Step 2: Push the Docker image to Artifact Registry - name: "gcr.io/cloud-builders/docker" args: - "push" - "$LOCATION-docker.pkg.dev/$PROJECT/$REPOSITORY/SERVICE:VERSION" images: - "$LOCATION-docker.pkg.dev/$PROJECT/$REPOSITORY/SERVICE:VERSION"
Sustituye:
- LOCATION con la Google Cloud región en la que implementes tu aplicación.
- PROJECT por el ID de tu proyecto. Google Cloud
- REPOSITORY por el nombre de tu repositorio de Artifact Registry.
- IMAGE por la URL de la imagen del contenedor.
- TAG con la etiqueta de tu imagen de contenedor.
Crea un Dockerfile con la siguiente configuración:
Descarga e instala Docker para probar tu aplicación de ejemplo y ejecuta el contenedor Hello World en tu máquina local.
Crea la imagen de contenedor y envíala a Artifact Registry:
gcloud builds submit .
Desplegar una aplicación
Para desplegar tu aplicación de App Engine, sigue estos pasos:
Configura el archivo
app.yaml
para que use un tiempo de ejecución personalizado en el directorio de origen:El directorio de tu proyecto debería tener una estructura similar a la siguiente:
├── Dockerfile ├── README.md ├── app.yaml ├── cloudbuild.yaml ├── pom.xml └── src └── main ├── java │ └── com │ └── example │ └── HelloServlet.java └── webapp ├── WEB-INF │ └── web.xml └── index.jsp
Despliega tu aplicación con el comando
gcloud app deploy
:gcloud app deploy --image-url=REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE:tag
Sustituye:
- LOCATION con la Google Cloud región en la que implementes tu aplicación.
- PROJECT por el ID de tu proyecto. Google Cloud
- REPOSITORY por el nombre de tu repositorio de Artifact Registry.
- IMAGE por la URL de la imagen del contenedor.
- TAG con la etiqueta de tu imagen de contenedor.
Usar un entorno de ejecución de Java insertado
En las siguientes instrucciones se muestra cómo volver a empaquetar una aplicación Java 8 de App Engine con un servidor insertado (Jetty) para que se ejecute como un archivo JAR independiente en un entorno de ejecución Java compatible:
- Crear un servidor Jetty insertado
- Preparar una aplicación web Java 8 (archivo WAR)
- Ejecutar el archivo WAR con Jetty insertado e implementar la aplicación
Crear un servidor Jetty insertado
Para empaquetar el archivo WAR de tu aplicación con un servidor Jetty insertado, sigue estos pasos:
Crea una clase
Main
para inicializar y configurar el servidor Jetty para ejecutar tu archivo WAR. La claseMain
configura el puerto del servidor, que tiene el valor predeterminado8080
. También puedes modificar el código fuente para usar un puerto especificado en la variable de entornoPORT
. La claseMain
configura el controladorWebAppContext
para servir tu archivo WAR:Crea el archivo de proyecto de Maven
pom.xml
y añade la siguiente configuración:Asigna a las propiedades
maven.compiler.source
ymaven.compiler.target
un tiempo de ejecución de Java compatible:Añade las dependencias de Jetty:
Configura la propiedad
maven-assembly-plugin
para empaquetar las dependencias:
El directorio de tu proyecto debería tener una estructura similar a la siguiente:
├─src │ └─main │ └─java │ └─jetty │ └─Main.java └─pom.xml
Ejecuta el comando
mvn install
en el directorio del proyecto Jetty Runner. De esta forma, se genera eljetty-jar-with-dependencies.jar
en el directorio de destino.Sigue las instrucciones de la sección Prepara tu aplicación web Java 8 (archivo WAR) para crear un archivo WAR.
Ejecutar el archivo WAR con Jetty insertado y desplegar la aplicación
En esta sección se explica cómo empaquetar tu aplicación en un archivo JAR ejecutable. Sigue estas instrucciones para empaquetar y desplegar tu aplicación:
Coloca el archivo JAR del ejecutor de Jetty generado
jetty-jar-with-dependencies.jar
y el archivo WAR de tu aplicaciónHelloWorldApp-1.0.war
en el mismo directorio.Ejecuta la aplicación con un entorno de ejecución de Java compatible:
java -jar jetty-jar-with-dependencies.jar HelloWorldApp-1.0.war
- En tu navegador web, ve a http://localhost:8080. Deberías ver la página de bienvenida de tu aplicación.
Crea un elemento
entrypoint
en tu archivoapp.yaml
para llamar al archivojetty-jar-with-dependencies
y pasa tu archivo WAR como argumento. La versión que especifiques en el archivo WAR debe ser la misma que la del archivopom.xml
:Despliega tu aplicación con el comando
gcloud app deploy
.