> ## Documentation Index
> Fetch the complete documentation index at: https://docs.reasonos.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Java SDK

> Build, test, and deploy Java applications with RBS — auto-managed JDK, Spring Boot support, JUnit 5, and OCI container images.

# Java SDK

RBS provides comprehensive Java support with automatic JDK management, Maven-compatible dependency resolution, JUnit 5 auto-inclusion, Spring Boot support, linting, and container image building.

## Setup

### Toolchain

Register a Java toolchain in `WORKSPACE.rbs`. RBS automatically downloads the JDK.

```python filename="WORKSPACE.rbs" theme={null}
load("@rbs//java/toolchain.rbs", "java_toolchain", "java_test_deps")

# Auto-downloads JDK 17
java_toolchain(name = "java", version = "17.0.11")

# Auto-installs JUnit 5 for tests
java_test_deps()
```

### Dependencies

Define external Java packages using `java_repository`. Supports Maven coordinates.

```python filename="WORKSPACE.rbs" theme={null}
load("@rbs//java/dependencies.rbs", "java_repository")

java_repository(
    name = "spring_boot_web",
    package = "org.springframework.boot:spring-boot-starter-web",
    version = "3.2.2",
)
```

## Rules

### `java_library`

Creates a reusable Java library (JAR).

```python theme={null}
load("@rbs//java/rules.rbs", "java_library")

java_library(
    name = "springboot_lib",
    srcs = [
        "src/main/java/com/example/springboot/Application.java",
        "src/main/java/com/example/springboot/GreetingService.java",
        "src/main/java/com/example/springboot/Calculator.java",
    ],
    deps = [
        "@external://org_springframework_boot_spring_boot_starter_web:3.2.2",
    ],
)
```

| Attribute   | Type   | Description                             |
| ----------- | ------ | --------------------------------------- |
| `name`      | string | Unique target name (required).          |
| `srcs`      | list   | Java source files.                      |
| `deps`      | list   | Dependencies (local or `@external://`). |
| `resources` | list   | Resource files to include in the JAR.   |

### `java_binary`

Creates an executable Java application.

```python theme={null}
load("@rbs//java/rules.rbs", "java_binary")

java_binary(
    name = "app",
    srcs = glob(["src/main/java/**/*.java"]),
    main = "com.example.springboot.Application",
    resources = ["src/main/resources/application.properties"],
    deps = [
        "@external://org_springframework_boot_spring_boot_starter_web:3.2.2",
    ],
    javaopts = ["-Djava.awt.headless=true", "-Xmx512m"],
)
```

| Attribute   | Type   | Description                                      |
| ----------- | ------ | ------------------------------------------------ |
| `name`      | string | Unique target name (required).                   |
| `srcs`      | list   | Java source files.                               |
| `main`      | string | Fully qualified main class (required).           |
| `deps`      | list   | Dependencies.                                    |
| `resources` | list   | Resource files (e.g., `application.properties`). |
| `javaopts`  | list   | JVM options.                                     |

### `java_test`

Runs Java tests. **JUnit 5 is automatically included** — no manual dependency required.

```python theme={null}
load("@rbs//java/rules.rbs", "java_test")

# Unit test — just depend on the code being tested
java_test(
    name = "greeting_service_test",
    srcs = [
        "src/main/java/com/example/springboot/GreetingService.java",
        "src/test/java/com/example/springboot/GreetingServiceTest.java",
    ],
    deps = [
        "@external://org_springframework_boot_spring_boot_starter_web:3.2.2",
    ],
    args = ["--select-class=com.example.springboot.GreetingServiceTest"],
)

# Full test suite
java_test(
    name = "all_tests",
    srcs = glob(["src/main/java/**/*.java", "src/test/java/**/*.java"]),
    deps = [
        "@external://org_springframework_boot_spring_boot_starter_web:3.2.2",
    ],
    args = [
        "--select-package=com.example.springboot",
        "--include-classname=.*Test",
    ],
)
```

| Attribute | Type   | Description                         |
| --------- | ------ | ----------------------------------- |
| `name`    | string | Unique target name (required).      |
| `srcs`    | list   | Test and source files.              |
| `deps`    | list   | Dependencies.                       |
| `args`    | list   | JUnit 5 console launcher arguments. |

### `java_lint`

Runs static analysis on Java source files.

```python theme={null}
load("@rbs//java/rules.rbs", "java_lint")

java_lint(
    name = "app_lint",
    srcs = glob(["src/main/java/**/*.java"]),
)
```

## Example: Spring Boot Application

<Tabs>
  <Tab title="WORKSPACE.rbs">
    ```python theme={null}
    load("@rbs//java/toolchain.rbs", "java_toolchain", "java_test_deps")
    load("@rbs//java/dependencies.rbs", "java_repository")

    java_toolchain(name = "java", version = "17.0.11")
    java_test_deps()

    java_repository(
        name = "spring_boot_web",
        package = "org.springframework.boot:spring-boot-starter-web",
        version = "3.2.2",
    )
    ```
  </Tab>

  <Tab title="BUILD.rbs">
    ```python theme={null}
    load("@rbs//java/rules.rbs", "java_binary", "java_library", "java_test", "java_lint")
    load("@rbs//oci/rules.rbs", "oci_image")

    java_library(
        name = "springboot_lib",
        srcs = glob(["src/main/java/**/*.java"]),
        deps = ["@external://org_springframework_boot_spring_boot_starter_web:3.2.2"],
    )

    java_binary(
        name = "app",
        srcs = glob(["src/main/java/**/*.java"]),
        main = "com.example.springboot.Application",
        resources = ["src/main/resources/application.properties"],
        deps = ["@external://org_springframework_boot_spring_boot_starter_web:3.2.2"],
        javaopts = ["-Djava.awt.headless=true"],
    )

    java_test(
        name = "greeting_service_test",
        srcs = [
            "src/main/java/com/example/springboot/GreetingService.java",
            "src/test/java/com/example/springboot/GreetingServiceTest.java",
        ],
        deps = ["@external://org_springframework_boot_spring_boot_starter_web:3.2.2"],
        args = ["--select-class=com.example.springboot.GreetingServiceTest"],
    )

    java_lint(
        name = "app_lint",
        srcs = glob(["src/main/java/**/*.java"]),
    )

    oci_image(
        name = "image",
        binary = ":app",
        base = "ubuntu:22.04",
        env = {"JAVA_OPTS": "-Djava.awt.headless=true"},
        tag = "springboot-example:latest",
    )
    ```
  </Tab>

  <Tab title="Commands">
    ```bash theme={null}
    rbs build app                       # Build the application
    rbs run app                         # Run Spring Boot server
    rbs test greeting_service_test      # Run specific test
    rbs test all_tests                  # Run all tests
    rbs build app_lint                  # Lint code
    rbs build image                     # Build container image
    ```
  </Tab>
</Tabs>
