# Anatomía de un proyecto

> Módulos Gradle, cómo se resuelve MainWindow por classname y dónde quedan los assets.

Source: https://crossfly.dev/es/docs/get-started/project-structure — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# Anatomía de un proyecto

Entiende lo que generó el "esqueleto" antes de tocarlo.

## Los módulos Gradle
```
:core     → código compartilhado: suas Windows, componentes, lógica, dados
:lwjgl3   → launcher desktop
:android  → launcher Android
:ios      → launcher iOS (RoboVM)
:web      → launcher Web (TeaVM)
```
Programas **casi siempre en el `core`**. Cada launcher solo hace el *bootstrap* del SO — instancia el `Main`
y configura la ventana (ver [plataformas](/docs/platforms)).

## Cómo se resuelve la `MainWindow`
El `Main` instancia la ventana principal **por reflexión**:
1. usa la clase indicada en **`cmdline["classname"]`** (pasada por el launcher); o
2. en su ausencia, el **`getMainWindow()`** sobrescrito.

Exigencia: la clase necesita un **constructor público sin argumentos** (se instancia por reflexión).

## Ejemplo completo (copiar, pegar y ejecutar)
Clase `MainWindow` mínima y ejecutable, con el constructor sin-args exigido por la reflexión:
```java
package com.exemplo;

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

public class MainWindow extends Window
{
   public MainWindow() { }          // constructor sin-args (obligatorio para la reflexión)

   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());
      add(LAY_AUTO, new Label("MainWindow resolvida por classname"));
   }
}
```

## Organización de app sugerida
Dentro del `core`, una estructura que escala (ver [arquitectura de app](/docs/best-practices/arquitetura-de-app)):
```
app/
 ├─ ui/screens/      → suas Windows (uma tela = uma Window)
 ├─ ui/components/   → componentes reutilizáveis
 ├─ data/            → repositórios (SQLite, rede)
 └─ model/           → objetos de domínio
```

## Assets y fuentes
Las fuentes base (Roboto, FontAwesome, Material) se cargan en el bootstrap; tus assets (imágenes,
datos) quedan en el directorio de assets del proyecto y se leen por ruta (ver
[Imágenes](/docs/ui/images-and-graphics/images)).

## Próximos pasos
→ [Tour panorámico de CrossFly](/docs/get-started/tour)

## Ver también
- Concepto: [El ciclo de vida](/docs/concepts/lifecycle) · [La arquitectura en capas](/docs/concepts/architecture)
