HMCL-dev/HMCL · error · Exception
Game processor dependency missing
Error message
Game processor dependency missing
What it means
Thrown when a JAR listed in the processor's classpath is not a regular file in the game repository. Forge processors run with a classpath of several libraries; if any one is missing, HMCL aborts before launching the processor since the processor would fail anyway.
Solutions
- Re-run the Forge installation so GameLibrariesTask re-downloads all processor classpath libraries
- Identify the missing library from logs/paths and restore or download it into the libraries directory
- Ensure the game repository base directory is the same one used when the libraries were downloaded
- Clear partial downloads and retry on a stable network connection
Example fix
// before: skipping the libraries download step processorTask.run(); // after: run the full ForgeNewInstallTask whose dependents fetch libraries first new ForgeNewInstallTask(dependencyManager, manifest, minecraftJar, version, installer).run();
Defensive patterns
Strategy: try-catch
Validate before calling
// Pre-check every classpath artifact resolves
for (Artifact a : processor.getClasspath()) {
Path f = gameRepository.getLayout().getArtifactFile(a);
if (!Files.isRegularFile(f)) throw new IOException("Missing library before install: " + f);
} Try / catch
try {
installTask.run();
} catch (Exception e) {
if ("Game processor dependency missing".equals(e.getMessage())) {
// re-run GameLibrariesTask / dependency downloads, then retry install
}
} Prevention
- Run the complete install task so dependent library downloads always precede processors
- Keep the game repository in one stable location across sessions
- Restore deleted libraries by re-running version/component completion checks
When it happens
Trigger: During ProcessorTask.execute(), any Artifact in processor.getClasspath() resolves via gameRepository.getLayout().getArtifactFile() to a nonexistent or non-regular path — i.e. the preprocess library download did not fetch that library.
Common situations: Incomplete libraries directory after an interrupted install; manually deleted libraries to 'clean up' disk; repository relocation; a library that failed SHA checks and was removed.
Understand the failure class
Background: "not installed", "pip install", "required for": how missing-dependency errors surface across open-source libraries — this error's family across 34 libraries.
Related errors
- Built-in theme-pack asset is missing
- Built-in theme-pack asset is missing
- Failed to find current HMCL location
- Failed to find current HMCL location
- Failed to add dependencies to classpath!
AI-assisted analysis of HMCL-dev/HMCL@24702dc5a0 (2026-09-10).
Data as JSON: /api/errors/3cc787633c55fbba.
Report an issue: GitHub.
Appendix: source
Thrown at HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeNewInstallTask.java:132
throw new FileNotFoundException("Game processor file not found, should be downloaded in preprocess");
String mainClass;
try (JarFile jarFile = new JarFile(jar.toFile())) {
mainClass = jarFile.getManifest().getMainAttributes().getValue(Attributes.Name.MAIN_CLASS);
}
if (StringUtils.isBlank(mainClass))
throw new Exception("Game processor jar does not have main class " + jar);
List<String> command = new ArrayList<>();
command.add(JavaRuntime.getDefault().getBinary().toString());
command.add("-cp");
List<String> classpath = new ArrayList<>(processor.getClasspath().size() + 1);
for (Artifact artifact : processor.getClasspath()) {
Path file = gameRepository.getLayout().getArtifactFile(artifact);
if (!Files.isRegularFile(file))
throw new Exception("Game processor dependency missing");
classpath.add(file.toString());
}
classpath.add(jar.toString());
command.add(String.join(File.pathSeparator, classpath));
command.add(mainClass);
List<String> args = new ArrayList<>(processor.getArgs().size());
for (String arg : processor.getArgs()) {
String parsed = parseLiteral(arg, vars);
if (parsed == null)
throw new ArtifactMalformedException("Invalid forge installation configuration");
args.add(parsed);
}
command.addAll(args);
LOG.info("Executing external processor " + processor.getJar().toString() + ", command line: " + new CommandBuilder().addAll(command).toString());View on GitHub (pinned to 24702dc5a0)