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

我正在使用 Spring Boot 构建应用程序。我将它打包为一个可执行的 jar。我想使用 Java Web Start 部署此应用程序。我写了一个 JNLP 文件,但是当我尝试运行它时,我让他遵循 Exception :


java.lang.IllegalStateException: Unable to determine code source archive from \\localhost\printpoc.jar

at 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>

你能帮我吗?


一只斗牛犬
浏览 252回答 1
1回答

蛊毒传说

在我看来,这就像一个 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) {&nbsp; &nbsp; throw new IllegalStateException("Unable to determine code source archive");}File root = new File(path);if (!root.exists()) {&nbsp; &nbsp; throw new IllegalStateException(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "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 文件一起使用。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java