我将Java 11 Corretto Spring Boot与Apache POI一起使用,但在AWS Lambda上使用时遇到了问题。如果我以“普通”API运行,效果很好,但在AWS lambda中运行servless时失败。
try (ByteArrayOutputStream out = new ByteArrayOutputStream(); SXSSFWorkbook workbook = new SXSSFWorkbook(1000)) {
SXSSFSheet sheet = workbook.createSheet("test"); //error here!!
} ...
原因:java。lang.错误:可能的致命错误:找不到物理字体。在java。桌面/阳光。字体。SunFontManager。java上的lambda$getDefaultPhysicalFont$0(未知源代码)。基本/java。util。可选择的orElseThrow(未知源代码)位于java。桌面/阳光。字体。SunFontManager。java上的getDefaultPhysicalFont(未知源)。桌面/阳光。字体。CompositeFont。java上的DoDeferredInitialization(未知源)。桌面/阳光。字体。CompositeFont。java上的getSlotFont(未知源)。桌面/阳光。字体。CompositeGlyphMapper。java上的initMapper(未知源)。桌面/阳光。字体。CompositeGlyphMapper。(未知源代码)位于java。桌面/阳光。字体。CompositeFont。java上的getMapper(未知源)。桌面/阳光。字体。CompositeFont。java上的canDisplay(未知源代码)。桌面/java。awt。字体。canDisplayUpTo(未知源代码)位于java。桌面/java。awt。字体。文本布局。java上的singleFont(未知源)。桌面/java。awt。字体。文本布局。(未知来源)位于组织。阿帕奇。poi。不锈钢。util。SheetUtil。位于org的getDefaultCharWidth(SheetUtil.java:285)。阿帕奇。poi。xssf。流动。AutoSizeColumnTracker。(AutoSizeColumnTracker.java:117)位于org。阿帕奇。poi。xssf。流动。SXSSF表。(SXSSFSheet.java:84)位于org。阿帕奇。poi。xssf。流动。SXSSF工作手册。在org上创建andregistersxssfsheet(SXSSFWorkbook.java:705)。阿帕奇。poi。xssf。流动。SXSSF工作手册。createSheet(SXSSFWorkbook.java:724)
我试图创建一个修复字体但我不知道如何进行
@PostConstruct
public void loadFonts() {
URL configURL = getClass().getClassLoader().getResource("fontconfig.properties");
String path = configURL != null ? configURL.getPath() : null;
Properties props = System.getProperties();
LOGGER.info("Loading font config file: {}", path);
props.put("sun.awt.fontconfig", path);
String[] fonts;
try {
GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
} catch (Throwable ex) {
LOGGER.warn("Reloading Fonts");
}
try {
fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
for (String font : fonts) {
LOGGER.info("Available Font: {}", font);
}
} catch (Throwable ex) {
LOGGER.error("Could not load Fonts");
}
}
配置文件:
version=1
sequence.allfonts=default
在AWS Lambda上运行时,它会将一些字体输出到日志中,所以我不明白为什么会出现这个错误:
2022-05-31 16:00:14 INFO Starting Lambda Container Handler
2022-05-31 16:00:18 INFO Loading font config file: /var/task/fontconfig.properties
2022-05-31 16:00:18 INFO Available Font: Dialog
2022-05-31 16:00:18 INFO Available Font: DialogInput
2022-05-31 16:00:18 INFO Available Font: Monospaced
2022-05-31 16:00:18 INFO Available Font: SansSerif
2022-05-31 16:00:18 INFO Available Font: Serif
知道如何添加物理字体吗?为什么POI不能使用输出到日志的可用字体?
编辑:我也试图运行无头,但我得到了同样的错误:
`props.setProperty("java.awt.headless", "true");`
知道如何添加物理字体吗
Oracle的Oracle JDK产品从Java11起停止捆绑字体。
OpenJDK项目不捆绑字体,至少在最新版本中不捆绑字体。
Amazon产品中的Corretto JDK基于OpenJDK代码库。根据你的报告,显然他们没有捆绑字体。
您必须选择:
我知道至少有一家这样的供应商:Azul Systems将字体与Azul平台的核心商业产品捆绑在一起。
我不知道还有其他这样的供应商。许多供应商提供JDK二进制文件和安装程序。这些供应商包括Adoptium、SAP、BellSoft、Microsoft、Azul Systems、Amazon、Oracle、Red Hat/IBM、Pivotal等。
为什么POI不能使用输出到日志的可用字体
日志中列出的字体是逻辑字体,而不是物理字体。Javadoc中清楚地记录了字体的区别。
要使用逻辑字体名称,您必须有一些后备物理字体。如果您的应用程序、JDK或主机操作系统中不存在字体,则逻辑字体无法工作。
关于在AWS Lambda中提供字体,这两个页面可能会有所帮助。(感谢jarmod提供的链接。)
基本思想是在软件包中创建一个字体文件夹。包括字体。内的conf文件,带有XML配置元素。将捆绑的字体文件放在该配置文件旁边。
主要内容:Java11 Optional类 的示例Java 11 向 Optional 类引入了新方法 isEmpty() 来检查值是否存在。如果值存在,则 isEmpty() 返回 false,否则返回 true。 它可以用作 isPresent() 方法的替代方法,该方法通常需要否定以检查值是否不存在。 Java11 Optional类 的示例 ApiTester.java 输出结果为
主要内容:Java11的新功能Java 11 是继 Java 8 之后的第一个 LTS 长期支持功能版本。它遵循 Java 发布节奏推出 Java 10,并于 2018 年 9 月发布,距 Java 10 发布仅六个月。 Java 9 和 Java 10 是非 LTS 版本。Java 11 版本是 LTS 版本。 Java11的新功能 以下是 Java 11 中引入的主要新功能。 JEP 321 : HTTP 客户端 API
有没有可能在fo:块中禁用文本片段的断字功能?我的问题是不可能在fo:inline上设置hyphenate="false ",因为它不是一个属性。fo:block内部的fo:block创建一个新行... fo-示例: 更新: 我尝试了 soulution 由 @DanielNorberg 发布,因为所有解决方案都无法正常工作。这似乎是一种解决方法,但仍然没有提供我想要的输出。 我使用此模板: fo
我试图在Mac OS上运行一个示例JavaFX应用程序。 Build.Gradle Java类 怎么啦?由于某种原因,JavaFX库没有正确加载。可能是MacOS或openjfx的错误吗?
试图通过遍历查看以下PDF文件中的所有字段,但它是“空的”。但如果我保存到一个新文件: 田地是否“隐蔽”?有办法得到他们吗?(我的最终目标是自动填写其中的一些内容)
我正在尝试用Java11编译我的项目。 我尝试用各种方法来修复它,比如更改环境变量,更新路径,将%JAVA_HOME%指向Java11。 我的计算机上的命令及其结果如下: 我正在使用IntelliJ IDEA,并按照本教程中的建议进行了必要的更改。 我的pom.xml看起来如下所示: 我如何将Maven指向Java11?或者,如果这不是问题所在,如何解决这一问题?我不认为这个问题是无效目标版本:1