windmill-labs/windmill · error

the configured maven repositories did not serve: {}. Coursie

Error message

the configured maven repositories did not serve: {}. Coursier reported success but no artifact for them was found in its cache.

What it means

After Coursier fetches Java dependencies, Windmill walks the fetch directory and checks that every requested coordinate's artifact was actually retrieved. If Coursier exited successfully but some requested artifacts are absent from its cache (e.g. the repository 404'd or left an empty directory for the coordinate), the job fails listing the missing display names.

Source

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

                display_name: display_name.clone(),
                found: false,
            })
        })
        .collect::<anyhow::Result<Vec<_>>>()?;
    // longest coordinate first: a group id ending in another one's coordinates (com.org.foo:bar
    // over org.foo:bar) would otherwise be free to claim the shorter one's directory
    wanted.sort_by_key(|w| std::cmp::Reverse(w.coordinate.len()));

    find_and_copy(&PathBuf::from(fetch_dir), &mut vec![], &mut wanted).await?;

    let missing = wanted
        .iter()
        .filter(|w| !w.found)
        .map(|w| w.display_name.as_str())
        .sorted()
        .collect_vec();
    if !missing.is_empty() {
        bail!(
            "the configured maven repositories did not serve: {}. \
            Coursier reported success but no artifact for them was found in its cache.",
            missing.join(", ")
        );
    }
    Ok(())
}

async fn compile<'a>(
    JobHandlerInput {
        occupancy_metrics,
        mem_peak,
        canceled_by,
        worker_name,
        job,
        conn,
        job_dir,
        client,

View on GitHub (pinned to e474e8803c)

Solutions

  1. Read the missing artifact names in the message and verify the coordinate (group:artifact:version) actually exists on the configured repository — fix typos in the script's requirements
  2. Add a Maven repository that serves the artifact via workspace settings (or re-enable default repositories if `no_default_repositories` was set)
  3. Check the repository URL serves the expected layout (`<group path>/<artifact>/<version>/<artifact>-<version>.jar`); fix registry URL/mirror config
  4. Clear the Coursier fetch cache on the worker if a stale empty 404 directory shadows a now-existing artifact, then retry

Example fix

// before (workspace maven repo setting)
https://maven.example.com/releases
// after (repo that actually hosts the artifact)
https://repo1.maven.org/maven2
Defensive patterns

Strategy: validation

Validate before calling

#!/bin/sh
# before submitting, check the coordinate is served by the configured repo
curl -fsSI "$REPO/com/example/artifact/1.0.0/artifact-1.0.0.jar" > /dev/null \
  || echo "artifact not served by repository"

Try / catch

match job_result {
    Err(e) if e.to_string().contains("did not serve") => {
        let missing = extract_names(&e.to_string());
        // surface per-artifact resolution failure, don't blind-retry
    }
    other => other?,
}

Prevention

When it happens

Trigger: A Java job runs against configured Maven repositories where one or more coordinates are not actually served — a 404 at the registry URL path, a repository that leaves an empty directory, an artifact missing from the version requested, or a mirror silently swallowing the request.

Common situations: Typo'd group/artifact id or nonexistent version; a private Maven repo that doesn't host the artifact; `no_default_repositories` set with only a mirror missing the package; a repository whose URL path layout doesn't match what Coursier expects, so a 404 leaves an empty directory that looks like the coordinate.

Related errors


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