如何用Java代码获取Paper/Spigot/Bukkit服务器Jar版本以自动切换Java版本
自动匹配Minecraft服务器Jar对应的Java版本方案
可靠的版本检测方法
方法1:读取Jar内的内置版本文件
Paper/Spigot/Bukkit的服务器Jar都内置了明确的版本标识文件,无需启动服务器即可读取:
- Paper:根目录下的
paper.json,包含version字段(格式如1.20.1-R0.1-SNAPSHOT) - Spigot:
org/spigotmc/version.properties,存储version=1.19.4这类键值对 - Bukkit:
org/bukkit/version.properties,同样存储明确版本字符串
Java实现示例:
import java.io.IOException; import java.io.InputStream; import java.util.Properties; import java.util.jar.JarFile; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; public class MCVersionDetector { public static String getServerVersion(String jarPath) throws IOException { try (JarFile jar = new JarFile(jarPath)) { // 优先读取Paper版本文件 var paperEntry = jar.getJarEntry("paper.json"); if (paperEntry != null) { try (InputStream is = jar.getInputStream(paperEntry)) { JsonNode root = new ObjectMapper().readTree(is); String fullVersion = root.get("version").asText(); return fullVersion.split("-")[0]; // 提取主版本号 } } // 读取Spigot版本文件 var spigotEntry = jar.getJarEntry("org/spigotmc/version.properties"); if (spigotEntry != null) { try (InputStream is = jar.getInputStream(spigotEntry)) { Properties props = new Properties(); props.load(is); return props.getProperty("version").split("-")[0]; } } // 读取Bukkit版本文件 var bukkitEntry = jar.getJarEntry("org/bukkit/version.properties"); if (bukkitEntry != null) { try (InputStream is = jar.getInputStream(bukkitEntry)) { Properties props = new Properties(); props.load(is); return props.getProperty("version").split("-")[0]; } } throw new IOException("未找到版本标识文件"); } } public static String getRequiredJavaVersion(String mcVersion) { String[] versionParts = mcVersion.split("\\."); int major = Integer.parseInt(versionParts[0]); int minor = Integer.parseInt(versionParts[1]); if (major == 1 && minor <= 16) { return "Java 8"; } else if (major == 1 && minor <= 20) { return "Java 17"; } else { return "Java 21"; // 1.20.2及以上官方推荐Java 21 } } }
方法2:通过命令行提取版本输出
所有主流Minecraft服务器Jar都支持--version参数,执行后会直接输出版本信息,无需启动完整服务器:
java -jar <服务器Jar路径> --version
输出示例:git-Paper-310 (MC: 1.20.1),提取1.20.1即可。
Java实现示例(捕获命令输出):
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class MCVersionCommandDetector { public static String getVersionViaCommand(String jarPath) throws IOException, InterruptedException { Process process = new ProcessBuilder("java", "-jar", jarPath, "--version").start(); // 读取标准输出 BufferedReader outReader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = outReader.readLine()) != null) { if (line.contains("MC:")) { return line.split("MC: ")[1].trim(); } } // 读取错误输出(部分服务器会将版本信息输出到stderr) BufferedReader errReader = new BufferedReader(new InputStreamReader(process.getErrorStream())); while ((line = errReader.readLine()) != null) { if (line.contains("MC:")) { return line.split("MC: ")[1].trim(); } } throw new IOException("无法从命令输出中提取版本"); } }
方案选择建议
- 方法1:无需启动进程,检测速度快,适合批量处理或后台自动检测场景
- 方法2:兼容性最强,覆盖所有Paper/Spigot/Bukkit分支,适合对兼容性要求高的场景
内容的提问来源于stack exchange,提问作者Fasmos
相关产品推荐
相关产品推荐

