【发布时间】:2015-03-05 19:59:21
【问题描述】:
我有一个 Spring Boot Web 应用程序,直接使用可执行 jar 时无法启动。
我正在使用 Spring Boot 1.2.0.RELEASE、Maven 3.0.5、Java 1.7.0_72。
我需要使用 hp-roman8 字符集 - 以便处理来自某些远程旧系统的传入请求。为了提供 hp-roman8 字符集,我在 1.5 版中使用了 net.freeutils.jcharset。 jcharset 工件已安装在我的本地存储库中
但是,当使用 java -jar 启动我的应用程序时,应用程序无法启动,并且我得到“java.nio.charset.UnsupportedCharsetException: hp-roman8”作为原因。
如果我执行 mvn spring-boot:run 会出现同样的错误,除非我将 spring-boot-maven-plugin 配置为始终分叉。
使用<fork>true</fork> spring-boot:run 成功启动应用程序,并且 hp-roman8 字符集在类路径中可用。
但是<fork>true</fork> 对创建的 jar 没有影响,所以我仍然无法使用 java -jar 启动我的应用程序 - 并继续获取“java.nio.charset.UnsupportedCharsetException: hp-roman8”。
jcharset-1.5.jar 正确包含在路径“lib/jcharset-1.5.jar”中其余依赖项旁边的创建的可执行 jar 文件中,所以我不太明白为什么它不可用启动 jar 时的类路径。
你们有没有看到过类似的行为,或者对我可以尝试什么来排除故障甚至解决这个问题有任何想法?
更新:
我还尝试将主类更改为使用 PropertiesLauncher(在插件配置中使用 <layout>ZIP</layout> 标签) - 请参阅 http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#build-tool-plugins-maven-packaging。
之后我将 loader.path 添加到我的 application.properties。即使我指定了 jcharset-1.5.jar 的绝对路径,我仍然会得到 UnsupportedCharsetException。
我也尝试过使用exploded archive,但还是不行。
【问题讨论】:
-
@AndyWilkinson - 有什么解决方法的建议吗?如果该错误确实是原因,我假设我会使用 Shade 或 OneJar 插件来创建胖 jar 看到相同的问题。
-
我找到了解决问题的方法 - 不是最好的解决方案,但它有效。我将 jcharset.jar 放在名为 libext/ 的 application.jar 旁边的文件夹中,然后像
java -Djava.ext.dirs=libext/ -jar application.jar一样启动我的应用程序。我发现在我的引导应用程序中加载 jcharset.jar 中的字符集的唯一其他方法是将 jcharset 的源包含并编译为我的应用程序的一部分。但我更喜欢将 jcharset jar 与我的代码分开。不过,我仍然希望找到更好/更清洁的解决方案。 -
我遇到了类似的问题,并且在使用带有 jcharset 的 Spring Boot Maven 插件时也遇到了 UnsupportedCharsetException。就我而言,我的代码中有一行在调用字符串构造函数时创建了一个字符串并配置了字符集。我的问题可以通过直接使用相应的字符集类(通过创建字符集类的实例)而不是 Charset.forName() 来解决。
标签: spring-boot