# Publicando

> Empacotar e rodar em cada plataforma a partir dos módulos Gradle — o fim do ciclo.

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

# 12. Publicando

> **O que você vai aprender:** fechar o ciclo — empacotar o app para cada plataforma.
> **Pré-requisitos:** [Testando seu app](/docs/learn/testing-your-app).

## Exemplo completo (copiar, colar e rodar)
O ponto de entrada que o `Main` instancia **por classname** (reflexão, construtor sem-args) — o mesmo
`core` roda nos quatro launchers. Esta `MainWindow` mínima e autocontida é o que cada alvo empacota.
Compila como está.
```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);
   }
}
```
> Os trechos abaixo mostram **só o miolo** (o que vai dentro de `onShow()`). Para rodar, coloque-os no esqueleto `MainWindow` acima.

## Um código, quatro alvos
O mesmo `core` roda em todos os launchers:
| Alvo | 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` → conteúdo estático |

## O que garante o bootstrap
O `Main` instancia sua **`MainWindow` por *classname*** (reflexão, construtor sem-args) — o mesmo em
todos os alvos. Ícones e assets (fontes Roboto/Material são carregadas no bootstrap) acompanham o
pacote.

## Checklist "pronto para publicar"
- [ ] Testado (cap. 11) e responsivo (cap. 10).
- [ ] Recursos indisponíveis por plataforma tratados (ver [matriz](/docs/platforms/overview)).
- [ ] Permissões: `AndroidManifest.xml` / `Info.plist`.
- [ ] Assinatura (keystore Android / provisioning iOS).
- [ ] Ícones, *launch screen*, versão.

## Fim do curso — e agora?
Você construiu um app que **abre, adiciona, navega, persiste, se adapta e é testado** — e o
empacotou. Daqui:
- **Aprofundar o "porquê":** [`concepts/`](/docs/concepts).
- **Qualidade em escala:** [`best-practices/`](/docs/best-practices).
- **Publicação detalhada:** [`platforms/`](/docs/platforms).
- **Tarefas pontuais:** [`cookbook/`](/docs/cookbook) · [`ui/`](/docs/ui) · [`data-and-services/`](/docs/data-and-services).

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

## Veja também
- [Build e distribuição](/docs/platforms/building-and-releasing) · Fonte canônica: Capítulo 4 §4.2
