# Publicando

> Empaquetar y ejecutar en cada plataforma a partir de los módulos Gradle — el fin del ciclo.

Source: https://crossfly.dev/es/docs/learn/shipping — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# 12. Publicando

> **Lo que vas a aprender:** cerrar el ciclo — empaquetar la app para cada plataforma.
> **Prerrequisitos:** [Probando tu app](/docs/learn/testing-your-app).

## Ejemplo completo (copiar, pegar y ejecutar)
El punto de entrada que el `Main` instancia **por classname** (reflexión, constructor sin args) — el mismo
`core` corre en los cuatro launchers. Esta `MainWindow` mínima y autocontenida es lo que cada objetivo empaqueta.
Compila tal cual.
```java
package com.exemplo;

import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;

public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      add(LAY_AUTO, new Label("Meu app CrossFly"));

      Button ola = new Button("Olá, mundo!");
      ola.onAction(c -> Hint.show("Rodando em todas as plataformas", 2000));
      add(LAY_AUTO, ola);
   }
}
```
> Los fragmentos siguientes muestran **solo el núcleo** (lo que va dentro de `onShow()`). Para ejecutar, colócalos en el esqueleto `MainWindow` de arriba.

## Un código, cuatro objetivos
El mismo `core` corre en todos los launchers:
| Objetivo | Build |
|---|---|
| 🖥️ Desktop | `gradlew :lwjgl3:run` (dev) / jar / instalador |
| 🤖 Android | `gradlew :android:installDebug` / `assembleRelease` (AAB) |
| 🍎 iOS | `gradlew :ios:launchIPhoneSimulator` / `.ipa` (macOS+Xcode) |
| 🌐 Web | `gradlew :web:webBundle` → contenido estático |

## Lo que garantiza el bootstrap
El `Main` instancia tu **`MainWindow` por *classname*** (reflexión, constructor sin args) — el mismo en
todos los objetivos. Los íconos y assets (las fuentes Roboto/Material se cargan en el bootstrap) acompañan al
paquete.

## Checklist "listo para publicar"
- [ ] Probado (cap. 11) y responsivo (cap. 10).
- [ ] Recursos no disponibles por plataforma tratados (ver [matriz](/docs/platforms/overview)).
- [ ] Permisos: `AndroidManifest.xml` / `Info.plist`.
- [ ] Firma (keystore Android / provisioning iOS).
- [ ] Íconos, *launch screen*, versión.

## Fin del curso — ¿y ahora?
Construiste una app que **abre, agrega, navega, persiste, se adapta y está probada** — y la
empaquetaste. Desde aquí:
- **Profundizar en el "porqué":** [`concepts/`](/docs/concepts).
- **Calidad a escala:** [`best-practices/`](/docs/best-practices).
- **Publicación detallada:** [`platforms/`](/docs/platforms).
- **Tareas puntuales:** [`cookbook/`](/docs/cookbook) · [`ui/`](/docs/ui) · [`data-and-services/`](/docs/data-and-services).

## Recapitulando
Un `core`, cuatro launchers Gradle; `MainWindow` por *classname*; checklist de release por plataforma.

## Ver también
- [Build y distribución](/docs/platforms/building-and-releasing) · Fuente canónica: Capítulo 4 §4.2
