> Markdown version of [Quick Start](https://vaadin.com/docs/v25/tools/modernization-toolkit/swing-bridge/netbeans-rcp/quick-start). Section index: [llms.txt](https://vaadin.com/docs/v25/tools/llms.txt)

# <a id="swing-bridge.netbeans-rcp.quick-start"></a>NetBeans RCP Quick Start

This page walks through the fastest path to a pre-built NetBeans Platform application rendering in the browser: drop the distribution into `applibs/`, add a few JVM flags, mount the bridge in a view, and run.

> **Note: Prerequisites**
>
> This page builds on a working SwingBridge project. If you don’t have one yet, set it up first with the [SwingBridge Quick Start](https://vaadin.com/docs/v25/tools/modernization-toolkit/swing-bridge/quick-start-guide.md) (skeleton starter) or [Installation from Scratch](https://vaadin.com/docs/v25/tools/modernization-toolkit/swing-bridge/installation-from-scratch.md). You also need a pre-built NetBeans Platform distribution and JDK 21 — see [Prerequisites](https://vaadin.com/docs/v25/tools/modernization-toolkit/swing-bridge/netbeans-rcp.md#swing-bridge.netbeans-rcp.prerequisites).

## <a id="swing-bridge.netbeans-rcp.quick-start.cluster"></a>Step 1: Add the Distribution to `applibs`

Copy your pre-built NetBeans Platform distribution directory into the project’s `applibs` directory. This is the same directory the platform’s own launcher would run; it has this shape:

```filesystem
my-vaadin-app/
├── pom.xml
├── applibs/
│   └── my-rcp-app/                  ← the pre-built NetBeans Platform distribution
│       ├── etc/
│       │   ├── my-rcp-app.clusters  ← branding marker
│       │   └── my-rcp-app.conf      ← (optional) defines --laf, JVM options
│       ├── platform/
│       │   └── lib/boot.jar
│       ├── my-rcp-app/              ← branding cluster (matches the .clusters name)
│       └── <feature clusters>/
└── src/...
```

SwingBridge discovers the distribution through the standard convention ladder — the `applibs/` directory, a directory entry in `swing-app-jar-list.conf`, or the `-Dswingbridge.rcp.cluster.dir` system property. See [Cluster Discovery](https://vaadin.com/docs/v25/tools/modernization-toolkit/swing-bridge/netbeans-rcp/configuration.md#swing-bridge.netbeans-rcp.configuration.discovery) for the full resolution order.

> **Note:** A directory qualifies as a distribution only when it contains both `etc/<branding>.clusters` and `platform/lib/boot.jar`. A directory of loose JARs is not a NetBeans Platform distribution.

## <a id="swing-bridge.netbeans-rcp.quick-start.flags"></a>Step 2: Add the NetBeans-Specific JVM Flags

On top of the standard SwingBridge runtime flags, a NetBeans Platform guest needs a few more. Add them to the `<jvmArguments>` of the `spring-boot-maven-plugin`:

```
--add-opens=java.base/java.lang=ALL-UNNAMED
--add-opens=java.desktop/javax.swing=ALL-UNNAMED
--add-opens=java.desktop/javax.swing.text=ALL-UNNAMED
--add-opens=java.base/java.net=ALL-UNNAMED
--add-opens=java.base/java.security=ALL-UNNAMED
-Djava.security.manager=allow
```

`--add-opens=java.base/java.lang=ALL-UNNAMED` and `-Djava.security.manager=allow` are the load-bearing ones — without them the platform fails to boot. See [NetBeans JVM Flags](https://vaadin.com/docs/v25/tools/modernization-toolkit/swing-bridge/netbeans-rcp/configuration.md#swing-bridge.netbeans-rcp.configuration.jvm-flags) for the complete block and an explanation of each flag.

## <a id="swing-bridge.netbeans-rcp.quick-start.view"></a>Step 3: Mount the Bridge in a View

Add a `NetBeansRcpBridge` to a Vaadin view. The no-arg constructor renders the whole platform shell:

```java
@Route("desktop")
public class DesktopView extends VerticalLayout {
    public DesktopView() {
        setSizeFull();
        setPadding(false);
        var rcp = new NetBeansRcpBridge();
        rcp.setSizeFull();
        add(rcp);
        expand(rcp);
    }
}
```

That’s the whole integration — no path parameters, no source changes to the RCP project.

> **Note:** As with any SwingBridge guest, server push must be enabled with the `@Push` annotation on the application shell class, or the view stays empty. See [Create a Vaadin View](https://vaadin.com/docs/v25/tools/modernization-toolkit/swing-bridge/adding-your-app.md#swing-bridge.adding-your-app.view).

## <a id="swing-bridge.netbeans-rcp.quick-start.run"></a>Step 4: Run the Application

**macOS/Linux**

```terminal
./mvnw spring-boot:run
```

**Windows**

```terminal
mvnw.cmd spring-boot:run
```

Open the application in your browser and navigate to the view’s route (`/desktop` in the example above). The first session pays a one-time cold-start cost of a few seconds while the platform boots in-process; then the NetBeans main window paints into the canvas, and mouse, keyboard, menus, and dialogs all work as they do on the desktop.

> **Note:** Cold start is roughly 5–8 seconds per session. If two browser sessions mount the bridge cold at the same time, their boots are serialized, so the second waits for the first. See [Cold-Start Performance](https://vaadin.com/docs/v25/tools/modernization-toolkit/swing-bridge/netbeans-rcp/multi-tenancy.md#swing-bridge.netbeans-rcp.multi-tenancy.performance).

## <a id="swing-bridge.netbeans-rcp.quick-start.next-steps"></a>Next Steps

- Embed a single view instead of the whole shell, or drive Vaadin navigation from an RCP action: [Embedding Modes](https://vaadin.com/docs/v25/tools/modernization-toolkit/swing-bridge/netbeans-rcp/embedding-modes.md).

- Cluster discovery, the full JVM flag set, and system properties: [Requirements and Configuration](https://vaadin.com/docs/v25/tools/modernization-toolkit/swing-bridge/netbeans-rcp/configuration.md).

- Per-session isolation, lifecycle, performance, and known limitations: [Multi-Tenancy and Lifecycle](https://vaadin.com/docs/v25/tools/modernization-toolkit/swing-bridge/netbeans-rcp/multi-tenancy.md).
