我正在使用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>
可以请你帮我吗?
答案 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参考(以下简称为“ 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文件一起使用。