为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Spring Boot 和 Java Web Start (JNLP) 时的异常

使用 Spring Boot 和 Java Web Start (JNLP) 时的异常

一只斗牛犬 2021-09-15 15:38:45
我正在使用 Spring Boot 构建应用程序。我将它打包为一个可执行的 jar。我想使用 Java Web Start 部署此应用程序。我写了一个 JNLP 文件,但是当我尝试运行它时,我让他遵循 Exception :java.lang.IllegalStateException: Unable to determine code source archive from \\localhost\printpoc.jarat org.springframework.boot.loader.Launcher.createArchive(Launcher.java:126)at org.springframework.boot.loader.ExecutableArchiveLauncher.<init>(ExecutableArchiveLauncher.java:38)at org.springframework.boot.loader.JarLauncher.<init>(JarLauncher.java:35)at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)at java.lang.reflect.Method.invoke(Unknown Source)at com.sun.javaws.Launcher.executeApplication(Unknown Source)at com.sun.javaws.Launcher.executeMainClass(Unknown Source)at com.sun.javaws.Launcher.doLaunchApp(Unknown Source)at com.sun.javaws.Launcher.run(Unknown Source)at java.lang.Thread.run(Unknown Source)这是我的 JNLP 文件:<?xml version="1.0" encoding="utf-8"?><jnlp spec="1.0+" codebase="http://localhost/" href="printpoc.jnlp"><information>    <vendor>Me</vendor>    <homepage href="http://localhost/" />    <description>PrintPoc</description></information><security>    <all-permissions/></security><resources>    <j2se version="1.8+" />    <jar href="printpoc.jar" /></resources><application-desc main-class="org.springframework.boot.loader.JarLauncher" />我想尝试一下,但布局 MODULE 不再存在。我尝试了 ZIP、NONE 等,仍然没有成功。这是我的 pom.xml :        <plugin>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-maven-plugin</artifactId>            <configuration>                <layout>JAR</layout>            </configuration>            <executions>                <execution>                    <goals>                        <goal>repackage</goal>                    </goals>                </execution>            </executions>        </plugin>你能帮我吗?
查看完整描述

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 文件一起使用。




查看完整回答
反对 回复 2021-09-15
  • 1 回答
  • 0 关注
  • 250 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信