Ir al contenido principal

TeaVM: convertir código Java a WebAssembly

TeaVM es un compilador ahead-of-time que transforma bytecode de Java en JavaScript o WebAssembly, permitiendo ejecutar aplicaciones Java directamente en el navegador sin necesidad de reescribirlas en JavaScript.

Es útil para quienes quieren aprovechar su código Java (o incluso Kotlin y Scala) en entornos web modernos.

Es similar a lo que se hacía con GWT (Google Web Toolkit). Convertir tu código Java a código Javascript.

En este blog ya hemos hablado de WebAssembly:

Creando un proyecto Java (y TeaVM)

1. Creamos nuestro proyecto Java con Maven:

$ mvn -DarchetypeCatalog=local -DarchetypeGroupId=org.teavm -DarchetypeArtifactId=teavm-maven-webapp -DarchetypeVersion=0.13.1 archetype:generate
$ cd demo-teavm

2. Una vez ubicados en el directorio creado modificaremos el programa principal ``MainClass.java``.

package com.inforhomex.web;

import org.teavm.jso.dom.html.HTMLDocument;

public class MainClass {
    public static void main(String[] args) {
        var document = HTMLDocument.current();
        var div = document.createElement("div");
        div.appendChild(document.createTextNode("TeaVM va a generar un elemento HTML."));
        document.getBody().appendChild(div);
    }
}

3. Modificaremos el archivo ``pom.xml``:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.inforhomex.web</groupId>
  <artifactId>demo-teavm</artifactId>
  <version>1</version>
  <packaging>war</packaging>

  <properties>
    <java.version>11</java.version>
    <teavm.version>0.13.1</teavm.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <!-- Emulator of Java class library for TeaVM -->
    <dependency>
      <groupId>org.teavm</groupId>
      <artifactId>teavm-classlib</artifactId>
      <version>${teavm.version}</version>
      <scope>provided</scope>
    </dependency>

    <!-- JavaScriptObjects (JSO) - a JavaScript binding for TeaVM -->
    <dependency>
      <groupId>org.teavm</groupId>
      <artifactId>teavm-jso-apis</artifactId>
      <version>${teavm.version}</version>
      <scope>provided</scope>
    </dependency>

    <!-- Servlet specification -->
    <dependency>
      <groupId>jakarta.servlet</groupId>
      <artifactId>jakarta.servlet-api</artifactId>
      <version>6.0.0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
	
	
      <!-- Configure Java compiler to use Java 8 syntax  -->
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.13.0</version>
        <configuration>
          <source>${java.version}</source>
          <target>${java.version}</target>
        </configuration>
      </plugin>

      <!-- Configure WAR plugin to include JavaScript files generated by TeaVM -->
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.4.0</version>
        <configuration>
          <webResources>
            <resource>
              <directory>${project.build.directory}/generated/js</directory>
            </resource>
          </webResources>
        </configuration>
      </plugin>

      <!-- Configure TeaVM -->
      <plugin>
        <groupId>org.teavm</groupId>
        <artifactId>teavm-maven-plugin</artifactId>
        <version>${teavm.version}</version>
        <executions>
          <execution>
            <id>web-client</id>
            <goals>
              <goal>compile</goal>
            </goals>
            <configuration>
              <!-- Directory where TeaVM should put generated files. This configuration conforms to the settings
                   of the WAR plugin -->
              <targetDirectory>${project.build.directory}/generated/js/teavm</targetDirectory>

              <!-- Main class, containing static void main(String[]) -->
              <mainClass>com.inforhomex.web.MainClass</mainClass>

              <!-- Whether TeaVM should produce minified JavaScript. Can reduce JavaScript file size more than
                   two times -->
              <minifying>true</minifying>

              <!-- Whether TeaVM should produce debug information for its built-in debugger -->
              <debugInformationGenerated>true</debugInformationGenerated>

              <!-- Whether TeaVM should produce source maps file -->
              <sourceMapsGenerated>true</sourceMapsGenerated>

              <!-- Whether TeaVM should also put source files into output directory,
                   for compatibility with source maps -->
              <sourceFilesCopied>true</sourceFilesCopied>

              <!-- Optimization level. Valid values are: SIMPLE, ADVANCED, FULL -->
              <optimizationLevel>ADVANCED</optimizationLevel>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

4. Construimos el proyecto:

$ mvn clean package

5. Abrimos la página HTML generada en ``index.html``

<!DOCTYPE html>
<html>
  <head>
    <title>Main page</title>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
    <script type="text/javascript" charset="utf-8" src="teavm/classes.js"></script>
	<script>
    
    </script>
  </head>
  <body onload="main()">
    
  </body>
</html>

Abrimos el archivo en un navegador. La salida será la siguiente:

TeaVM va a generar un elemento HTML.

¡Hemos generado código JS a través de TeaVM!

En próximas entregas continuaremos con este tema.


Enlaces:

https://teavm.org/
https://webassembly.org/
https://onlyhaskellforyou.blogspot.com/2026/04/webassembly-con-haskell.html
https://codemonkeyjunior.blogspot.com/2026/04/webassembly-con-dlang.html
https://codemonkeyjunior.blogspot.com/2026/04/grain-un-lenguaje-para-webassembly.html

Comentarios

Entradas populares de este blog

Odin language: el lenguaje de programación orientado a datos para un desarrollo de software sensato

En esta serie sobre lenguajes de programación hablamos de Odin , un lenguaje orientado a datos. Un nuevo lenguaje de programación que nos podrá recordar a lenguajes como C++, Python, Golang o hasta Rust. Instalación (Windows): 1 2 3 4 $ git clone https://github.com/odin-lang/Odin $ cd Odin $ git pull $ build.bat release Debemos asegurarnos de crear la variable de entorno: Nombre: ODIN_HOME Valor: C:\Users\HP\Documents\pruebasOdin\Odin Ejemplo 1. Como primer programa tendremos al clásico "Hola, mundo". holamundo.odin package holamundo import " core:fmt " main : : proc ( ) { fmt . println ( " ¡Hola, mundo desde Odin! " ) } Construimos: $ odin build holamundo . odin - file Ejecutamos: $ holamundo .exe Recordar que si usamos Visual Studio Code podemos instalar el plugin de Odin Language: https://marketplace.visualstudio.com/items?itemName=DanielGavin.ols Ejemplo 2. Programa que muestre las variables que pod...

Programación Windows Batch (CMD) parte 3

Crear ciclos para efectuar operaciones tediosas nos ahorrará tiempo para realizar otras tareas. En está ocasión veremos ciclos con FOR . ¿Cuál es la síntaxis de bucle FOR en Windows Batch? Si está dentro de un archivo *.bat : FOR %%variable IN (seq) DO operaciones Si lo ejecutamos en una terminal: FOR %variable IN (seq) DO operaciones Ejemplo 1 . Recorrer una secuencia de números del 0 al 5: recorrer.bat @ echo off FOR %%i in ( 0 1 2 3 4 5 ) DO echo Hola no. %%i pause Nos imprimirá en pantalla: Hola no. 0 Hola no. 1 Hola no. 2 Hola no. 3 Hola no. 4 Hola no. 5 ¿Puedo usar contadores? Si, se pueden usar. Ejemplo 2 . Uso de contadores: contador.bat @ echo off set numeros = 1 2 3 4 5 6 7 8 9 10 set cont = 0 for %%a in ( %numeros% ) do ( echo Hola no. %%a :: Contador set /a cont+ = 1 ) echo Total: %cont% Este código nos imprimirá, además de los mensajes Hola no. 0 ..., el total de valores conta...

z/OS, ¿Qué es? y ¿Cuáles son sus herramientas?

  En este post veremos las herramientas de z/OS de IBM. z/OS es un sistema operativo de mainframe desarrollado por IBM.  Es parte de la serie IBM z Systems (anteriormente conocida como System z), que se utiliza en los sistemas mainframe de IBM. z/OS es uno de los sistemas operativos más utilizados en el mundo empresarial para ejecutar aplicaciones críticas y procesar grandes volúmenes de datos. Características clave de z/OS: Escalabilidad : z/OS es conocido por su capacidad para manejar grandes cargas de trabajo y escalabilidad vertical, lo que permite agregar recursos de hardware para satisfacer las demandas de procesamiento. Confiabilidad y disponibilidad : z/OS está diseñado para ofrecer alta disponibilidad y confiabilidad. Incorpora características como redundancia y recuperación ante fallas para garantizar la continuidad de las operaciones. Seguridad : Proporciona una amplia gama de funciones de seguridad, como autenticación, autorización y auditoría, para proteger los...