12. Publicando
O que você vai aprender: fechar o ciclo — empacotar o app para cada plataforma. Pré-requisitos: Testando seu 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á.
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 esqueletoMainWindowacima.
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).
- 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/. - Qualidade em escala:
best-practices/. - Publicação detalhada:
platforms/. - Tarefas pontuais:
cookbook/·ui/·data-and-services/.
Recapitulando
Um core, quatro launchers Gradle; MainWindow por classname; checklist de release por plataforma.
Veja também
- Build e distribuição · Fonte canônica: Capítulo 4 §4.2