# 项目剖析

> Gradle 模块、MainWindow 如何通过 classname 解析，以及资源文件放在哪里。

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

# 项目剖析

在动手修改之前，先理解生成"骨架"的东西。

## 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)
```
你**几乎总是在 `core` 中**编程。每个启动器只做操作系统的 *bootstrap* —— 实例化 `Main`
并配置窗口（见 [平台](/docs/platforms)）。

## `MainWindow` 如何解析
`Main` **通过反射**实例化主窗口：
1. 使用 **`cmdline["classname"]`** 中指定的类（由启动器传入）；或者
2. 在缺失该值时，使用被重写的 **`getMainWindow()`**。

要求：该类需要一个**公共的无参构造函数**（它是通过反射实例化的）。

## 完整示例（复制、粘贴、运行）
最小且可执行的 `MainWindow` 类，带有反射所要求的无参构造函数：
```java
package com.exemplo;

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

public class MainWindow extends Window
{
   public MainWindow() { }          // 无参构造函数（反射所必需）

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

## 建议的应用组织方式
在 `core` 内，一个可扩展的结构（见 [应用架构](/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
```

## 资源与字体
基础字体（Roboto、FontAwesome、Material）在 bootstrap 时加载；你的资源（图片、
数据）放在项目的资源目录中，并通过路径读取（见
[图片](/docs/ui/images-and-graphics/images)）。

## 下一步
→ [CrossFly 全景导览](/docs/get-started/tour)

## 另请参阅
- 概念：[生命周期](/docs/concepts/lifecycle) · [分层架构](/docs/concepts/architecture)
