JBang 25.11
JBang es una herramienta que te permite ejecutar código Java como scripts, sin archivos de construcción, configuración de proyectos o compilación manual. La integración de webforJ con JBang te permite crear aplicaciones webforJ rápidamente, siendo más adecuada para prototipos rápidos, aprendizaje y demostraciones rápidas, sin necesidad de las dependencias e infraestructura tradicionales de un programa Java completo.
¿Por qué usar JBang con webforJ?
Los proyectos tradicionales de webforJ utilizan Maven o Gradle con múltiples archivos de configuración y una estructura de proyecto estándar. Esta configuración es común para aplicaciones de producción, pero puede parecer pesada para experimentos o demostraciones simples.
Con JBang, puedes:
- Comenzar instantáneamente: Escribir un único archivo
.javay ejecutarlo de inmediato - Saltar la configuración del proyecto: Sin
pom.xml, sinbuild.gradle, sin estructura de directorios - Compartir fácilmente: Enviar a alguien un solo archivo que puede ejecutar con un comando
- Aprender más rápido: Concentrarte en los conceptos de webforJ sin la complejidad de herramientas de construcción
La integración incluye el cierre automático del servidor cuando cierras la pestaña del navegador, manteniendo limpio tu flujo de trabajo de desarrollo.
Requisitos previos
Instalar JBang
Elige tu método de instalación preferido:
# Universal (Linux/macOS/Windows con bash)
curl -Ls https://sh.jbang.dev | bash -s - app setup
# SDKMan
sdk install jbang
# Homebrew (macOS)
brew install jbangdev/tap/jbang
# Chocolatey (Windows)
choco install jbang
# Scoop (Windows)
scoop install jbang
Verifica la instalación:
jbang --version
Cuando ejecutas JBang por primera vez sin un JDK instalado, JBang lo descarga automáticamente. Puedes establecer la versión y el proveedor del JDK antes de ejecutar JBang:
export JBANG_DEFAULT_JAVA_VERSION=21
export JBANG_JDK_VENDOR=temurin
Para una documentación completa de JBang, consulta:
- JBang Introducción - Instalación y conceptos básicos
- Referencia de Directivas de Script - Todas las directivas disponibles
- Dependencias - Gestión avanzada de dependencias
Creando un script de webforJ
Crea un archivo llamado HelloWorld.java con el siguiente contenido:
///usr/bin/env jbang "$0" "$@" ; exit $?
//DEPS com.webforj:webforj-jbang-starter:25.11
//JAVA 21
package bang;
import com.webforj.App;
import com.webforj.annotation.Routify;
import com.webforj.component.Composite;
import com.webforj.component.Theme;
import com.webforj.component.button.Button;
import com.webforj.component.button.ButtonTheme;
import com.webforj.component.field.TextField;
import com.webforj.component.icons.FeatherIcon;
import com.webforj.component.layout.flexlayout.FlexDirection;
import com.webforj.component.layout.flexlayout.FlexLayout;
import com.webforj.component.toast.Toast;
import com.webforj.router.annotation.Route;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@Routify
public class HelloWorld extends App {
public static void main(String[] args) {
SpringApplication.run(HelloWorld.class, args);
}
}
@Route("/")
class MainView extends Composite<FlexLayout> {
private FlexLayout self = getBoundComponent();
private TextField hello = new TextField("¿Cuál es tu nombre?");
private Button btn = new Button("Di Hola");
public MainView() {
self.setDirection(FlexDirection.COLUMN);
self.setMaxWidth(300);
self.setStyle("margin", "1em auto");
btn.setPrefixComponent(FeatherIcon.BELL.create())
.setTheme(ButtonTheme.PRIMARY)
.addClickListener(e -> Toast.show("¡Bienvenido a webforJ JBang Starter " + hello.getValue() + "!", Theme.GRAY));
self.add(hello, btn);
}
}
Entendiendo la estructura del script
| Línea | Propósito |
|---|---|
///usr/bin/env jbang "$0" "$@" ; exit $? | Línea shebang que permite la ejecución directa del script en sistemas Unix |
//JAVA 21 | Especifica la versión mínima de Java requerida; JBang la descarga automáticamente si es necesario |
//DEPS com.webforj:webforj-jbang-starter:25.11 | Declara el iniciador de webforJ JBang como una dependencia usando coordenadas de Maven |
@SpringBootApplication | Habilita la auto-configuración de Spring Boot |
extends App | Hace de esta clase una aplicación webforJ |
La dependencia webforj-jbang-starter incluye todo lo necesario para ejecutar una aplicación webforJ: el iniciador de Spring Boot, herramientas de desarrollo y apertura automática del navegador.
Reemplaza 25.11 con la última versión de webforJ. Consulta Maven Central para la versión más reciente.
Agregando dependencias
Puedes agregar dependencias de Maven adicionales usando múltiples líneas //DEPS:
///usr/bin/env jbang "$0" "$@" ; exit $?
//JAVA 21
//DEPS com.webforj:webforj-jbang-starter:25.11
//DEPS com.google.code.gson:gson:2.11.0
//DEPS org.apache.commons:commons-lang3:3.14.0
Las dependencias utilizan coordenadas estándar de Maven (groupId:artifactId:version). JBang las obtiene automáticamente de Maven Central en la primera ejecución.
Ejecutando tu script
Ejecuta el script con JBang:
jbang HelloWorld.java
JBang hará:
- Descargar dependencias (solo en la primera ejecución)
- Compilar el script
- Iniciar el servidor embebido en un puerto aleatorio disponible
- Abrir tu navegador predeterminado a la aplicación
Haciendo el script ejecutable
En sistemas Unix, puedes hacer que el script sea directamente ejecutable:
chmod +x HelloWorld.java
./HelloWorld.java
Esto funciona gracias a la línea shebang en la parte superior del archivo.
Soporte de IDE
JBang se integra con IDEs de Java populares, incluyendo VS Code, IntelliJ IDEA, Eclipse y otros. Estas integraciones proporcionan características como autocompletado de directivas, resolución automática de dependencias y la capacidad de ejecutar y depurar scripts directamente desde el IDE.
Consulta la documentación de integración de IDE de JBang para obtener instrucciones de configuración y editores compatibles.
Configuración
El iniciador de webforJ JBang incluye configuraciones predeterminadas sensatas optimizadas para scripting. Puedes personalizar el comportamiento utilizando propiedades del sistema.
Cierre automático
Por defecto, el servidor se cierra automáticamente cuando se cierran todas las pestañas del navegador conectadas a la aplicación. Esto mantiene limpio tu flujo de trabajo de desarrollo al no dejar servidores huérfanos en ejecución.
| Propiedad | Predeterminado | Descripción |
|---|---|---|
webforj.jbang.auto-shutdown | true | Activar o desactivar el cierre automático |
webforj.jbang.idle-timeout | 5 | Segundos a esperar después de que la última desconexión del navegador ocurra antes de apagarse |
Para desactivar el cierre automático:
jbang -Dwebforj.jbang.auto-shutdown=false HelloWorld.java
Para cambiar el tiempo de espera inactivo:
jbang -Dwebforj.jbang.idle-timeout=30 HelloWorld.java
Configuraciones predeterminadas
El iniciador de JBang configura los siguientes valores predeterminados:
| Configuración | Valor | Descripción |
|---|---|---|
server.port | 0 | Asignación de puerto aleatorio para evitar conflictos al ejecutar múltiples scripts |
server.shutdown | immediate | Cierre rápido para una rápida terminación del script |
spring.main.banner-mode | off | Oculta el banner de Spring Boot para una salida más limpia |
logging.level.root | ERROR | Registro mínimo para mantener la salida de la consola limpia |
logging.level.com.webforj | WARN | Muestra solo advertencias y errores de webforJ |
webforj.devtools.browser.open | true | Abre automáticamente el navegador cuando la aplicación se inicia |
Redeployment y recarga en vivo
Los scripts de JBang no admiten recarga en vivo. Para ver los cambios:
- Detén el script en ejecución (cierra la pestaña del navegador o presiona
Ctrl+C) - Edita tu código
- Ejecuta
jbang HelloWorld.javanuevamente
Para la redeployment automática durante el desarrollo, considera usar un proyecto completo de Maven con Spring DevTools. Consulta la documentación de recarga en vivo para más detalles.
Transición a un proyecto completo
Cuando tu prototipo crezca más allá de un solo archivo, crea un proyecto adecuado usando startforJ o el arquetipo de Maven. Puedes copiar la lógica de tu script directamente en la estructura de proyecto generada.