You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 22:50:29