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

使用update4j实现自动更新时下载配置文件遇致命错误求助

问题解决:update4j配置文件解析致命错误

问题根源

你遇到的XML解析错误,核心原因是你请求的URL指向的是GitHub网页界面(blob页面),而非config.xml文件的原始内容。GitHub的blob页面返回的是HTML代码,其中包含不符合XML规范的<link crossorigin>标签(XML要求属性必须是属性名="值"的格式,而HTML中crossorigin可采用无值简写形式),导致Configuration.read(in)解析时抛出致命错误。

修复步骤

1. 修正配置文件请求URL

将Updater类中的URL从GitHub blob地址替换为原始文件地址:

  • 原错误URL:https://github.com/Skurczybyk/UpdateTest/blob/master/Bootstrap/target/config.xml
  • 修正后URL:https://github.com/Skurczybyk/UpdateTest/raw/master/Bootstrap/target/config.xml
    (只需将路径中的blob替换为raw,即可获取文件原始内容)

2. 修正baseUri配置

ConfigCreator中设置的baseUri使用了GitHub tree页面地址,这会导致后续下载jar文件时获取网页而非目标文件,需一并修改为raw路径:

.baseUri("https://github.com/Skurczybyk/UpdateTest/raw/master/TheApp/target")

修正后的Updater类代码

package Update;

import org.update4j.Configuration;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Updater {
    public void update() throws MalformedURLException {
        // 使用raw文件URL获取配置文件原始内容
        URL configurl = new URL("https://github.com/Skurczybyk/UpdateTest/raw/master/Bootstrap/target/config.xml");
        Path updateZip = Paths.get("update.zip");
        Configuration config = null;
        try(Reader in = new InputStreamReader(configurl.openStream(), StandardCharsets.UTF_8))
        {
            config = Configuration.read(in);
        }
        catch (IOException e)
        {
            System.out.println("更新失败:" + e.getMessage());
            e.printStackTrace();
        }
    }
}

修正后的ConfigCreator类代码

package Update;

import org.update4j.Configuration;
import org.update4j.FileMetadata;

import java.io.IOException;
import java.io.Writer;
import java.nio.file.Files;
import java.nio.file.Paths;

public class ConfigCreator {
    private String appDir = System.getProperty("user.dir");
    private String theAppTarget = appDir + "\\TheApp\\target";
    private  String bootstrapTarget = appDir + "\\Bootstrap\\target";


    public void createConfig() throws IOException {
        Configuration config = Configuration.builder()
                // 替换为raw路径,确保后续能正确下载jar文件
                .baseUri("https://github.com/Skurczybyk/UpdateTest/raw/master/TheApp/target")
                .basePath(theAppTarget)
                .file(FileMetadata.readFrom(theAppTarget + "\\TheApp-1.0-SNAPSHOT.jar"))
                .build();
        try (Writer out = Files.newBufferedWriter(Paths.get(bootstrapTarget + "\\config.xml")))
        {config.write(out);}
    }
}

额外提示

  • 可直接在浏览器中打开raw URL验证,确保能看到纯XML内容或jar文件下载提示;
  • 建议补充更详细的异常日志,方便调试更新过程中的问题。

内容的提问来源于stack exchange,提问作者Marek Podolak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 02:34:57