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
- Verify the sourceJar path exists and is a file: new File(path).isFile() must be true before running protogen.
- Use an absolute path for sourceJar to avoid working-directory ambiguity.
- Ensure the upstream jar build (the artifact containing @ProtoMessage classes) runs before protogen.
- 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
- Pass an absolute path for sourceJar.
- Ensure the upstream jar build runs before protogen.
- Verify isFile() (not just exists()) to catch directory-vs-file mistakes.
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
- protogen configuration incomplete, please provide all requir
- Skill registry is not available
- llmProvider not specified: {name}
- no configuration found for: {name}
- Bad/Unsupported schema? : {validationMessages}
AI-assisted analysis of conductor-oss/conductor@cf7c3e4a8a (2026-08-14).
Data as JSON: /api/errors/e3278ce44a4b9ed1.
Report an issue: GitHub.