Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringBoot Jar无法加载TrueType字体_Java_Spring Boot_Fonts - Fatal编程技术网

Java SpringBoot Jar无法加载TrueType字体

Java SpringBoot Jar无法加载TrueType字体,java,spring-boot,fonts,Java,Spring Boot,Fonts,当我想使用springboot fat jar中包含的字体时,我发现了一个奇怪的行为。在我的本地机器上运行测试时(从/resources目录加载字体),它工作得非常好。但如果我使用maven构建应用程序并从终端运行,那么我将收到: java.io.IOException: Problem reading font data. at java.awt.Font.createFont0(Font.java:1000) at java.awt.Font.createFont(Font.java:877

当我想使用springboot fat jar中包含的字体时,我发现了一个奇怪的行为。在我的本地机器上运行测试时(从
/resources
目录加载字体),它工作得非常好。但如果我使用maven构建应用程序并从终端运行,那么我将收到:

java.io.IOException: Problem reading font data.
at java.awt.Font.createFont0(Font.java:1000)
at java.awt.Font.createFont(Font.java:877)
我试图找到解决方案,并做了以下工作:

  • 使用不同的字体(有时会出现另一个关于损坏表格或其他内容的错误)
  • 构建了各种版本的docker openjdk容器来测试行为
  • 构建一个ubuntu容器,安装openjdk
  • 使用debian映像,安装fc缓存,并通过
    • /usr/share/font/truetype/europlate
    • fc缓存-f-v
  • 创建了一个临时文件,以确保jar中没有访问问题
  • 从我的终端运行应用程序,加载字体也失败
  • 使用字体可以在编辑器上工作,甚至当应用程序从IDE运行时(无测试)
方法:

public Font getFont()引发IOException,FontFormatException{
File f=File.createTempFile(“dang”、“tmp”);
断言f!=null;
f、 删除();
ClassLoader ClassLoader=getClass().getClassLoader();
Font Font=Font.createFont(Font.TRUETYPE_Font,classLoader.getSystemResourceAsStream(“EuroPlate.ttf”);
字体。衍生字体(105f);
System.out.println(font.getFontName());
返回字体;
}
编辑: IDE运行应用程序->工作

终端运行应用程序->失败

堆栈跟踪:

java.io.IOException:读取字体数据时出现问题。
位于java.desktop/java.awt.Font.createFont0(Font.java:1183)
位于java.desktop/java.awt.Font.createFont(Font.java:1052)
位于components.NumberPlateUtility.getFont(NumberPlateUtility.java:81)
在components.NumberPlateUtility.completeImage(NumberPlateUtility.java:173)
位于main.NumberplateClientCommands.one(NumberplateClientCommands.java:63)
位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
位于java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
位于java.base/java.lang.reflect.Method.invoke(Method.java:566)
位于org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:223)
位于org.springframework.shell.shell.evaluate(shell.java:169)
位于org.springframework.shell.shell.run(shell.java:134)
位于org.springframework.shell.jline.InteractiveShellApplicationRunner.run(InteractiveShellApplicationRunner.java:84)
位于org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:783)
位于org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:773)
位于org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
位于org.springframework.boot.SpringApplication.run(SpringApplication.java:1242)
位于org.springframework.boot.SpringApplication.run(SpringApplication.java:1230)
在main.main.main(main.java:20)
位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
位于java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
位于java.base/java.lang.reflect.Method.invoke(Method.java:566)
位于org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
位于org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
位于org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
位于org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
存储库:

此代码将用于:

public Font getFont()引发IOException,FontFormatException{
File f=File.createTempFile(“dang”、“tmp”);
断言f!=null;
f、 删除();
ClassLoader ClassLoader=getClass().getClassLoader();
Font=Font.createFont(Font.TRUETYPE\u Font,classLoader.getResourceAsStream(“EuroPlate.ttf”);
字体。衍生字体(105f);
System.out.println(font.getFontName());
返回字体;
}

注意
classLoader.getResourceAsStream
中的更改。查看此项了解更多解释。

您在开发环境中使用的是相同的jdk
openjdk
。@Malathi嗯,我尝试了很多,我不知道。我现在就确定并告诉你结果。结果:相同的问题,尽管版本相同。你想用字体做什么?引导应用程序操纵字体(例如,与在浏览器中为客户端提供字体相反)是极为罕见的。您的意思是在没有docker的情况下使用openjdk x,而在docker build中使用相同的openjdk x版本。问题出现在docker容器中,而不是没有docker的环境中。是这样吗?@chrylis使用后端的字体将字符串呈现为图像,并将其发送到Web服务以供进一步使用。