使用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
相关产品推荐
相关产品推荐

