windmill-labs/windmill · error

{line} is not parsable

Error message

{line} is not parsable

What it means

When installing a Java job's dependencies, Windmill parses each line of the requirements string as a Maven coordinate of the form `groupId:artifactId:version` (after stripping `:jar`/`:lib` classifiers). If splitting a line on ':' does not yield exactly those three parts, the line cannot become a RequiredDependency and the whole install fails, naming the offending line.

Source

Thrown at backend/windmill-worker/src/java_executor.rs:366

        .map(|line| {
            let unparsed_dep = line.replace(":jar", "").replace(":lib", "");
            let mut it = unparsed_dep.split(":");

            match (it.next(), it.next(), it.next()) {
                (Some(group_id), Some(artifact_id), Some(version)) => {
                    let path = format!(
                        "{}/{}/{artifact_id}/{version}",
                        *JAVA_REPOSITORY_DIR,
                        group_id.replace(".", "/")
                    );
                    Ok(RequiredDependency {
                        path,
                        _s3_handle: format!("{group_id}:{artifact_id}:{version}"),
                        display_name: format!("{artifact_id}:{version}"),
                        custom_payload: (),
                    })
                }
                _ => anyhow::bail!("{line} is not parsable"),
            }
        })
        .collect::<anyhow::Result<Vec<RequiredDependency<_>>>>()?;

    let classpath = deps
        .clone()
        .into_iter()
        .map(|RequiredDependency { path, .. }| path + "/*")
        .collect_vec()
        .join(":")
        + ":target";

    #[cfg(windows)]
    let classpath = classpath.replace(":", ";");

    tracing::debug!(
        workspace_id = %job.workspace_id,
        "JAVA classpath: {}", &classpath

View on GitHub (pinned to e474e8803c)

Solutions

  1. Fix the offending line (shown in the message) to be exactly `groupId:artifactId:version`, e.g. `com.google.code.gson:gson:2.10.1`
  2. Remove any `:jar`/`:lib` suffix or other extra `:`-separated segments the parser does not support
  3. Remove empty or malformed lines from the Java script's requirements field
  4. Split whitespace-separated multiple coordinates onto separate lines

Example fix

// before (requirements line)
com.google.code.gson:gson
// after
com.google.code.gson:gson:2.10.1
Defensive patterns

Strategy: validation

Validate before calling

// validate each requirements line before submitting the job
fn is_maven_coordinate(line: &str) -> bool {
    let line = line.trim();
    if line.is_empty() || line.starts_with('#') || line.contains(' ') { return false; }
    let mut it = line.replace(":jar", "").replace(":lib", "").split(':');
    matches!((it.next(), it.next(), it.next(), it.next()),
        (Some(g), Some(a), Some(v), None) if !g.is_empty() && !a.is_empty() && !v.is_empty())
}

Type guard

fn is_maven_coordinate(line: &str) -> bool {
    let mut it = line.replace(":jar", "").replace(":lib", "").split(':');
    matches!((it.next(), it.next(), it.next(), it.next()),
             (Some(g), Some(a), Some(v), None) if !g.is_empty() && !a.is_empty() && !v.is_empty())
}

Prevention

When it happens

Trigger: A Java script's requirements list contains a line that is not `group:artifact:version` — only `group:artifact` with no version, extra `:`-separated segments the parser does not handle, a trailing colon, or a stray blank/malformed line that survives line-splitting.

Common situations: Developers pasting Gradle-style or POM XML coordinates into the requirements field, omitting the version, adding a packaging/classifier suffix, or leaving an empty line or comment in the dependency list.

Related errors


AI-assisted analysis of windmill-labs/windmill@e474e8803c (2026-09-03). Data as JSON: /api/errors/b82e530c2328190e. Report an issue: GitHub.