conductor-oss/conductor · error · IOException

missing Jar file

Error message

missing Jar file 

What it means

Thrown as IOException by ProtoGen.processPackage when the supplied jarFile is not a regular file (!jarFile.isFile()). protogen scans the jar's classes via a URLClassLoader + ClassPath, so a missing/inaccessible jar means there is nothing to introspect for @ProtoMessage annotations.

Source

Thrown at annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/ProtoGen.java:111

        Handlebars handlebars =
                new Handlebars(loader)
                        .infiniteLoops(true)
                        .prettyPrint(true)
                        .with(EscapingStrategy.NOOP);

        Template protoFile = handlebars.compile("file");

        for (ProtoFile file : protoFiles) {
            File filename = new File(root, file.getFilePath());
            try (Writer writer = new FileWriter(filename)) {
                System.out.printf("protogen: writing '%s'...\n", filename);
                protoFile.apply(file, writer);
            }
        }
    }

    public void processPackage(File jarFile, String packageName) throws IOException {
        if (!jarFile.isFile()) throw new IOException("missing Jar file " + jarFile);

        URL[] urls = new URL[] {jarFile.toURI().toURL()};
        ClassLoader loader =
                new URLClassLoader(urls, Thread.currentThread().getContextClassLoader());
        ClassPath cp = ClassPath.from(loader);

        System.out.printf("protogen: processing Jar '%s'\n", jarFile);
        for (ClassPath.ClassInfo info : cp.getTopLevelClassesRecursive(packageName)) {
            try {
                processClass(info.load());
            } catch (NoClassDefFoundError ignored) {
            }
        }
    }

    public void processClass(Class<?> obj) {
        if (obj.isAnnotationPresent(ProtoMessage.class)) {
            System.out.printf("protogen: found %s\n", obj.getCanonicalName());

View on GitHub (pinned to cf7c3e4a8a)

Solutions

  1. Verify the sourceJar path exists and is a file: new File(path).isFile() must be true before running protogen.
  2. Use an absolute path for sourceJar to avoid working-directory ambiguity.
  3. Ensure the upstream jar build (the artifact containing @ProtoMessage classes) runs before protogen.
  4. Check file permissions if the path exists but isFile() returns false (e.g., it is a directory).

Example fix

// before
--sourceJar build/libs/app.jar   // not built yet
// after
./gradlew jar && --sourceJar $(pwd)/build/libs/app.jar
Defensive patterns

Strategy: validation

Validate before calling

import java.io.File;
File jar = new File(sourceJarPath);
if (!jar.isFile()) {
    throw new IllegalArgumentException(
        "sourceJar does not exist or is not a file: " + jar.getAbsolutePath());
}
// only then: generator.processPackage(jar, packageName);

Prevention

When it happens

Trigger: Running ProtoGenTask with a --sourceJar path that does not exist, points to a directory, or is unreadable. processPackage is called early in generate() and fails before any class scanning.

Common situations: Build misconfiguration pointing sourceJar at a stale or not-yet-built artifact; relative path resolved against an unexpected working directory; jar deleted by a clean step; typo in the path argument.

Related errors


AI-assisted analysis of conductor-oss/conductor@cf7c3e4a8a (2026-08-14). Data as JSON: /api/errors/e3278ce44a4b9ed1. Report an issue: GitHub.