From fdd04c657e0b0cb3f8b11c895c39a47f3d6e2a5a Mon Sep 17 00:00:00 2001 From: sqersters <109853788+bouclem@users.noreply.github.com> Date: Mon, 25 May 2026 16:30:18 +0200 Subject: [PATCH 1/2] fix: extract Classic server zip after download completes Extraction was attempted in the constructor right after only queueing the download, so the zip didn't exist yet on disk and a NoSuchFileException was thrown and silently swallowed. Move the extract step to run at the end of performDownload, once the zip has actually been written. Fixes #221 --- .../mcp/tools/versions/DownloadData.java | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/mcphackers/mcp/tools/versions/DownloadData.java b/src/main/java/org/mcphackers/mcp/tools/versions/DownloadData.java index 3410888d..daf965d3 100644 --- a/src/main/java/org/mcphackers/mcp/tools/versions/DownloadData.java +++ b/src/main/java/org/mcphackers/mcp/tools/versions/DownloadData.java @@ -28,6 +28,8 @@ public class DownloadData { public int totalSize; protected List downloadQueue = new ArrayList<>(); protected AssetIndex assets; + private Path serverZip; + private Path serverJar; public DownloadData(MCP mcp, Version version) { this(mcp, MCPPaths.get(mcp, MCPPaths.LIB), MCPPaths.get(mcp, MCPPaths.JARS), MCPPaths.get(mcp, MCPPaths.JAR_ORIGINAL, Side.CLIENT), MCPPaths.get(mcp, MCPPaths.JAR_ORIGINAL, Side.SERVER), version); @@ -43,18 +45,10 @@ public DownloadData(MCP mcp, Path libraries, Path gameDir, Path client, Path ser Path serverOut = server; if (serverArtifact.url.endsWith(".zip")) { serverOut = server.getParent().resolve("minecraft_server.zip"); + this.serverZip = serverOut; + this.serverJar = server; } queueDownload(serverArtifact, serverOut); - if (serverArtifact.url.endsWith(".zip")) { - try { - FileUtil.extractByExtension(serverOut, serverOut.getParent(), ".jar"); - if (Files.exists(serverOut.getParent().resolve("minecraft-server.jar"))) { - Files.move(serverOut.getParent().resolve("minecraft-server.jar"), server); - } - } catch (IOException e) { - e.printStackTrace(); - } - } } for (DependDownload dependencyDownload : version.libraries) { if (Rule.apply(dependencyDownload.rules)) { @@ -153,6 +147,18 @@ public void performDownload(DownloadListener listener) throws IOException { FileUtil.downloadFile(download.downloadURL(), file); } } + extractServerZip(); + } + + private void extractServerZip() throws IOException { + if (serverZip == null || !Files.exists(serverZip)) { + return; + } + FileUtil.extractByExtension(serverZip, serverZip.getParent(), ".jar"); + Path extracted = serverZip.getParent().resolve("minecraft-server.jar"); + if (Files.exists(extracted)) { + Files.move(extracted, serverJar); + } } private static class Download { From 9b860b49443690574a2f77985ed73e746cc57e10 Mon Sep 17 00:00:00 2001 From: sqersters <109853788+bouclem@users.noreply.github.com> Date: Tue, 26 May 2026 22:09:52 +0200 Subject: [PATCH 2/2] refactor: extract server zip via private instance method --- .../mcp/tools/versions/DownloadData.java | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/mcphackers/mcp/tools/versions/DownloadData.java b/src/main/java/org/mcphackers/mcp/tools/versions/DownloadData.java index daf965d3..d419b5e5 100644 --- a/src/main/java/org/mcphackers/mcp/tools/versions/DownloadData.java +++ b/src/main/java/org/mcphackers/mcp/tools/versions/DownloadData.java @@ -28,8 +28,6 @@ public class DownloadData { public int totalSize; protected List downloadQueue = new ArrayList<>(); protected AssetIndex assets; - private Path serverZip; - private Path serverJar; public DownloadData(MCP mcp, Version version) { this(mcp, MCPPaths.get(mcp, MCPPaths.LIB), MCPPaths.get(mcp, MCPPaths.JARS), MCPPaths.get(mcp, MCPPaths.JAR_ORIGINAL, Side.CLIENT), MCPPaths.get(mcp, MCPPaths.JAR_ORIGINAL, Side.SERVER), version); @@ -43,12 +41,12 @@ public DownloadData(MCP mcp, Path libraries, Path gameDir, Path client, Path ser Artifact serverArtifact = version.downloads.artifacts.get("server"); if (mcp.getOptions().getSide().includesServer() && serverArtifact != null) { Path serverOut = server; + Path serverExtractTo = null; if (serverArtifact.url.endsWith(".zip")) { serverOut = server.getParent().resolve("minecraft_server.zip"); - this.serverZip = serverOut; - this.serverJar = server; + serverExtractTo = server; } - queueDownload(serverArtifact, serverOut); + queueDownload(serverArtifact, serverOut, serverExtractTo); } for (DependDownload dependencyDownload : version.libraries) { if (Rule.apply(dependencyDownload.rules)) { @@ -126,11 +124,15 @@ public void setAssets(AssetIndex assets) { } public void queueDownload(IDownload dl, Path baseDir) { + queueDownload(dl, baseDir, null); + } + + private void queueDownload(IDownload dl, Path baseDir, Path extractTo) { if (dl == null) { return; } totalSize += dl.downloadSize(); - downloadQueue.add(new Download(dl, baseDir)); + downloadQueue.add(new Download(dl, baseDir, extractTo)); } public void performDownload(DownloadListener listener) throws IOException { @@ -146,14 +148,13 @@ public void performDownload(DownloadListener listener) throws IOException { if (parent != null) Files.createDirectories(parent); FileUtil.downloadFile(download.downloadURL(), file); } + if (dl.extractTo != null) { + extractServerZip(file, dl.extractTo); + } } - extractServerZip(); } - private void extractServerZip() throws IOException { - if (serverZip == null || !Files.exists(serverZip)) { - return; - } + private void extractServerZip(Path serverZip, Path serverJar) throws IOException { FileUtil.extractByExtension(serverZip, serverZip.getParent(), ".jar"); Path extracted = serverZip.getParent().resolve("minecraft-server.jar"); if (Files.exists(extracted)) { @@ -164,10 +165,12 @@ private void extractServerZip() throws IOException { private static class Download { IDownload download; Path dir; + Path extractTo; - public Download(IDownload dl, Path path) { + public Download(IDownload dl, Path path, Path extractTo) { download = dl; dir = path; + this.extractTo = extractTo; } } }