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

# Java Configuration

> Configure Codeflash for Java projects

# Java Configuration

Codeflash stores its configuration inside your existing build file — `pom.xml` properties for Maven projects, or `gradle.properties` for Gradle projects. No separate config file is needed.

## Maven Configuration

For Maven projects, Codeflash writes properties under the `<properties>` section of your `pom.xml` with the `codeflash.` prefix:

```xml theme={null}
<properties>
    <!-- Only non-default overrides are written -->
    <codeflash.moduleRoot>src/main/java</codeflash.moduleRoot>
    <codeflash.testsRoot>src/test/java</codeflash.testsRoot>
    <codeflash.gitRemote>origin</codeflash.gitRemote>
    <codeflash.formatterCmds>mvn spotless:apply -DspotlessFiles=$file</codeflash.formatterCmds>
    <codeflash.disableTelemetry>false</codeflash.disableTelemetry>
    <codeflash.ignorePaths>src/main/java/generated/</codeflash.ignorePaths>
</properties>
```

## Gradle Configuration

For Gradle projects, Codeflash writes settings to `gradle.properties` with the `codeflash.` prefix:

```properties theme={null}
codeflash.moduleRoot=src/main/java
codeflash.testsRoot=src/test/java
codeflash.gitRemote=origin
```

<Info>
  Codeflash auto-detects most settings from your project structure. Running `codeflash init` will set up the correct config — manual configuration is usually not needed. For standard Maven/Gradle layouts, Codeflash may write no config at all if all defaults are correct.
</Info>

## Auto-Detection

When you run `codeflash init`, Codeflash inspects your project and auto-detects:

| Setting            | Detection logic                                                                                   |
| ------------------ | ------------------------------------------------------------------------------------------------- |
| **Source root**    | Looks for `src/main/java` (Maven/Gradle standard layout), falls back to pom.xml `sourceDirectory` |
| **Test root**      | Looks for `src/test/java`, `test/`, `tests/`                                                      |
| **Build tool**     | Detects Maven (`pom.xml`) or Gradle (`build.gradle` / `build.gradle.kts`)                         |
| **Test framework** | Checks build file dependencies for JUnit 5, JUnit 4, or TestNG                                    |

## Configuration Options

| Property           | Description                                                | Default         |
| ------------------ | ---------------------------------------------------------- | --------------- |
| `moduleRoot`       | Source directory to optimize                               | `src/main/java` |
| `testsRoot`        | Test directory                                             | `src/test/java` |
| `gitRemote`        | Git remote for pull requests                               | `origin`        |
| `formatterCmds`    | Code formatter command (`$file` placeholder for file path) | (none)          |
| `disableTelemetry` | Disable anonymized telemetry                               | `false`         |
| `ignorePaths`      | Paths within source root to skip during optimization       | (none)          |

<Info>
  Only non-default values are written to the config. If your project uses the standard `src/main/java` and `src/test/java` layout with the default `origin` remote, Codeflash may not need to write any config properties at all.
</Info>

## Multi-Module Projects

For multi-module Maven/Gradle projects, run `codeflash init` from the module you want to optimize. The config is written to that module's `pom.xml` or `gradle.properties`:

```text theme={null}
my-project/
|- client/
|  |- src/main/java/com/example/client/
|  |- src/test/java/com/example/client/
|  |- pom.xml          <-- run codeflash init here
|- server/
|  |- src/main/java/com/example/server/
|- pom.xml
```

For non-standard layouts (like the Aerospike client where source is under `client/src/`), `codeflash init` will prompt you to override the detected paths.

## Tracer Options

When using `codeflash optimize` to trace a Java program, these CLI options are available:

| Option                 | Description                                        | Default  |
| ---------------------- | -------------------------------------------------- | -------- |
| `--timeout`            | Maximum time (seconds) for each tracing stage      | No limit |
| `--max-function-count` | Maximum captures per method                        | 100      |
| `--trace-only`         | Trace and generate replay tests without optimizing | `false`  |

Example with timeout:

```bash theme={null}
codeflash optimize --timeout 30 java -jar target/my-app.jar --app-args
```

## Example

### Standard Maven project

```text theme={null}
my-app/
|- src/
|  |- main/java/com/example/
|  |  |- App.java
|  |  |- Utils.java
|  |- test/java/com/example/
|     |- AppTest.java
|- pom.xml
```

Standard layout — no extra config needed. `codeflash init` detects everything automatically.

### Gradle project

```text theme={null}
my-lib/
|- src/
|  |- main/java/com/example/
|  |- test/java/com/example/
|- build.gradle
|- gradle.properties    <-- codeflash config written here if overrides needed
```

Standard layout — no extra config needed. `codeflash init` detects everything automatically.
