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

时间:2018-09-12 14:01:23

标签: java spring 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" />

我想尝试that,但是布局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 个答案:

答案 0 :(得分:1)

在我看来,这就像一个Spring错误。来自source

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 documentation

  

在最高级别,字符串形式的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文件一起使用。