Исключение при использовании Spring Boot и Java Web Start (JNLP) - PullRequest
0 голосов
/ 12 сентября 2018

Я создаю приложение с помощью Spring Boot.Я упаковал его как исполняемый файл.Я хотел бы развернуть это приложение с помощью Java Web Start.Я написал файл JNLP, но когда я пытаюсь его запустить, я получаю следующее исключение:

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>

Не могли бы вы помочь мне?

1 Ответ

0 голосов
/ 12 сентября 2018

Это выглядит для меня как ошибка весны.Из источника :

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 могут быть безопасно преобразованы в имена файлов, и это правильно сделать с новым файлом (местоположение) или Paths.get (местоположение) .

Я не уверен, что решение.Похоже, что средство запуска Spring Boot предполагает, что .jar всегда является локальным файлом.Я сомневаюсь, что он может работать с файлом .jar, полученным через HTTP.

...