1 回答
TA贡献1895条经验 获得超3个赞
在我看来,这就像一个 Spring 错误。从来源:
ProtectionDomain protectionDomain = getClass().getProtectionDomain();
CodeSource codeSource = protectionDomain.getCodeSource();
URI location = (codeSource != null) ? codeSource.getLocation().toURI() : null;
String path = (location != null) ? location.getSchemeSpecificPart() : null;
if (path == null) {
throw new IllegalStateException("Unable to determine code source archive");
}
File root = new File(path);
if (!root.exists()) {
throw new IllegalStateException(
"Unable to determine code source archive from " + root);
}
问题是这一行:
String path = (location != null) ? location.getSchemeSpecificPart() : null;
从URI 文档:
在最高级别,字符串形式的 URI 引用(以下简称“URI”)具有以下语法
[方案:]方案特定部分[#片段]
因此,在 URI 中http://localhost/printpoc.jnlp,特定于方案的部分是//localhost/printpoc.jnlp. 然后 Spring 尝试将其视为文件名,这当然不存在,这就是为什么您会看到您所看到的异常。
Spring 代码不正确。它错误地假设您可以从任何 URI 中创建文件名。只有file:URI 可以安全地转换为文件名,这可以通过new File(location)或Paths.get(location)正确完成。
我不确定解决方案是什么。Spring Boot 启动器似乎假设 .jar 始终是本地文件。我怀疑它是否可以与通过 HTTP 获得的 .jar 文件一起使用。
添加回答
举报