前言:最近我在将自己写的一些组件开源,想要发布到maven中央仓库,结果发现网上很多的教程都已经过时,而官网的教程也有一定程度上的混沌,主要是部分文章已经过时导致的。给我这样的小白选手带来了一些麻烦,在我自己成功发布后决定总结一下整个流程以及中间遇到的问题分享出来。

maven中央仓库的限制

官网地址:https://central.sonatype.org/publish/requirements/

  1. 不允许发布快照;
  2. 必须有javadoc包;
  3. 必须有souce包:也就是你的代码是开源的,这也是为什么一些不开源jar包不选择中央仓库的主要原因,比如itext和aspose等
  4. 至少有.md5.sha校验结果;
  5. 必须要使用GPG或者gpg签名;
  6. 必须有pom.xml文件:同时需要有正确的groupIdartifactIdversionnamedescriptionurllicensesdevelopersscm

那么接下来我会详细讲解一下关于这些条件的。

阅读全文 »

查看PDF文件元数据的方法

方法一:直接修改后缀名

这是简单的办法,将文件后缀名改成txt,然后用文本阅读器打开即可

方法二:使用itext-rups

工具类则是推荐itext7-rups,这是itext自己开源的阅读器

方法三:写代码

1
2
3
4
5
6
7
8
9
10
11
String filePath = "xxx.pdf";  

FileInputStream fis = new FileInputStream(filePath);
byte[] content = new byte[fis.available()];
fis.read(content);
fis.close();

String text = new String(content);


System.out.println(text);

PDF元数据解析

挖坑,待填,需要的可以先看相关资料

相关资料

项目中原本的方案中是将word保存了所有的修改并转为pdf做在线预览,但是在转换的过程中丢失了修改记录和批注信息。

❌ 方案一:使用aspose做word转pdf且同时保留修改记录 -收费

我司目前只采购了aspose 20.11版本,基于这个版本简单尝试了一下,缺点如下:

  1. 只能完成删除记录的显示;
  2. 无法声明出操作人和操作时间;
  3. 单页word有概率被转成了两页;

高版本的aspose有可能是支持的,我在官网有找到一份文档,需要的朋友可以去看看: Aspose Words export Comment and Revision author Aspose Words 导出注释和修订作者,但我司没有采购高版本aspose的计划,所以方案一我这里是放弃了。

另外我附上我自己写的demo代码以供大家尝试:

阅读全文 »

在v站上看到一篇帖子分享了开源项目Gallery-Portfolio,看了一下demo感觉蛮不错的,可以展示快门、光圈和ISO信息。
这个项目部署需要用到 vercelCloudflare R2,当然如果你有自己的域名会更好。

第一步,项目调整

因为项目本身有一些文字描述、页面标题等不支持动态设置,所以你觉得介意的话就得自己调整,这需要你有一定的开发知识。

我自己也有简单调整一些文字,默认主题也改成了dark模式,你可以在这里看看效果 baofeidyz’s gallery

项目本身的readme写的很详细,建议先看看readme,然后我这里补充几点:

  1. nodejs安装方法:https://nodejs.org/en/download/package-manager
  2. 新建的.env文件不要提交。默认fork操作后的权限都是public的,所以不要提交这个文件以避免Cloudflare R2的密钥被盗用

另外,如果你没有安装node.js你也可以不用拉取,善于利用GitHub提供的code space是更好的办法,关于code spaces可以看看https://docs.github.com/en/codespaces

第二步,申请免费的Cloudflare R2

阅读全文 »

Jetcache踩坑合集

写在前面

本文主要是记录个人在使用jetcache时遇到的一些问题以及相应的解决方案,次之是将这些问题和解决方案发布到互联网中希望能帮助到一些人,如果觉得文章写得还不错,可以点赞收藏以鼓励我继续更新博客,这将对我非常重要。

流水账子标题中重复带上jetcache关键字主要是为了提高搜索的准确性,本身文章上下文已足够表达含义,但是为了优化搜索情况特意加上的。

踩坑流水账

jetcache默认返回值为null时候,不会缓存

这个是jetcache的默认策略,我之所以遇到这个问题是我自己写的测试代码时直接返回了null,我误认为是我spring aop配置有问题,导致缓存没有生效,实则是jetcache默认策略。

com.alicp.jetcache.anno.Cached注解中有一个属性cacheNullValue,默认值为false,表示不缓存空值。

jetcache不支持模糊清空缓存

这点其实在GitHub issue清单中有好几个issue 都是与这个问题相关的,如果你也是从Spring Cache转到jetcache,由于缺少模糊清空缓存,会导致整个系统原有的实现都必须调整。

这个特性主要影响到缓存的数据是一个列表或者是一整颗树的情况,当列表或树中部分值更新以后,这个列表的缓存或树的缓存没有办法更新。

jetcache多节点缓存清空需要先有@Cached注册

阅读全文 »

2024年7月5日更新:

  1. 原帖在这里:https://baofeidyz.hashnode.dev/apple-music
  2. 调整部分过时的内容,新增了iCloud云盘链接(阿里云盘不让分享apk文件,所以先暂时拿iCloud云盘用一下)

2023年10月12日更新:
很抱歉,就目前来看苹果已经在逐步收紧了,如果还没上车的朋友请尽快上车了,后期可能注册和订阅都将变的越来越困难,详细操作步骤我已经单独更新了一篇博客,请务必查看!链接:《新注册土耳其Apple ID订阅Apple Music详细操作步骤,新手一定要看!》

2023年7月23日更新:
很抱歉,就我今天测试结果来看,至少从今天(也许很早之前)苹果已经改为免费一个月了,博客原标题中的“-免费六个月”部分已修改为“每月最低不到2元”(目前家庭订阅是29.99里拉,约等于8元,家庭订阅最多可以六人,平均算下来人均不到1.4元)。此外,部分平台由于文章无法再编辑,已尽量通过评论区的方式告知,希望您理解。

阅读全文 »

mat用小内存解析超大堆快照的可行方法

写在前面的话1:服务器上的堆大小已经远超过我开发机的内存大小了,如果直接使用mat客户端来分析很快就会出现OOM的问题,这篇博客一定程度上可以解决这个问题

写在前面的话2:大部分同学一直都在使用mat的gui来做分析,但其实mat的gui只是增加来一个html预览功能,我们可以利用mat命令直接生成html,甚至我们还可以挂载成在线服务,以供其他人浏览,非常赞

命令

1
2
3
/Applications/mat.app/Contents/Eclipse/ParseHeapDump.sh ~/Downloads/java_pidxxx.hprof org.eclipse.mat.api:suspects
/Applications/mat.app/Contents/Eclipse/ParseHeapDump.sh ~/Downloads/java_pidxxx.hprof org.eclipse.mat.api:overview
/Applications/mat.app/Contents/Eclipse/ParseHeapDump.sh ~/Downloads/java_pidxxx.hprof org.eclipse.mat.api:top_components
阅读全文 »

解决macOS IntelliJ IDEA 卡顿问题

写在前面的话1:我在撰写这篇博客时候,所用的IntelliJ IDEA版本是IntelliJ IDEA 2022.3.3 (Ultimate Edition),你需要知道可能对于不同的IntelliJ IDEA版本会有一定的差异

写在前面的话2:如果我这篇博客可以帮助到你,请给我一个免费的赞和收藏,谢谢

问题描述

我遇到的卡顿问题主要体现在编辑代码时,输入中文时,cpu使用率飙升到100%,并且中文已经在键盘中打完了,但是展示到IntelliJ IDEA页面上还需要5秒以上,已经卡到没办法做研发工作了。

一些相关的因素

在特别卡的时候,我有更换过一次项目。我在做这个项目之前,虽然也卡,但是不会类似于这个项目这么卡。
但同时我在这期间有升级过macOS的系统版本和IntelliJ IDEA的版本,变量因素很多,加大了问题排查定位的难度。

排查思路

我以前很喜欢写流水账,但是这次来来回回花了我好几个月才解决,所以我已经回忆不起来我到底是怎么一步一步排查的了,我尝试写一些我还能想起来的作为排查思路

检查内存、硬盘、cpu使用率

这是我最开始的考虑,macOS上有一个系统应用,叫“活动监视器“,这里面可以比较清晰的看到IntelliJ IDEA的cpu、内存、硬盘、网络的使用情况,当然你也可以在终端中使用top或者htop来确认。
通过我的观察,我发现我输入中文的时候,我的八个很容易就达到了100%,CPU使用率轻轻松松超过400%

如果你使用IntelliJ IDEA开发程序,那么Java应用的卡顿问题如何处理,你应该是比较熟悉的,对吧?但是如果没有源码,我们直接去查IntelliJ IDEA的线程信息其实帮助也不是很大,我稍微花了一点时间在网络上翻找了一些帖子。

IntelliJ IDEA其实是有自己的分析工具,其位置在于【顶栏->Help->Diagnostic Tools->Activity Monitor】

说个题外话,不建议安装IntelliJ IDEA的中文语言包,因为互联网上大量文档主要还是用英文来写的,我在解决这个IntelliJ IDEA卡顿问题的时候也在IntelliJ IDEA自己的论坛看了很多帖子,如果你长期使用中文语言包,对于一些词汇太陌生会导致自己处理问题比较麻烦。

从这个工具里面咱们就可以看到具体什么进程导致CPU的高占用,对于进程名不熟悉的,借助于Google也可以很快了解具体是做什么的。

不同的使用场景下,会存在不同的原因,并且因为IntelliJ IDEA还支持了插件,所以导致卡顿的原因更是不计其数,但只要你懂得如何去排查问题,这个事儿就变得没有那么困难了。

一个一个的禁用插件来排查

这个方法是很多人都有提到的,并且在实际应用上是真的有效果!如果你安装的插件比较多,那么请一个一个的disable掉,利用排查法找到具体是哪个插件所导致的,插件越多理论上时间会比较长,你也可以选择以五个为单位快速定位一个大致的范围。

常见的一些解决方案

修改IntelliJ IDEA的内存

放到第一位肯定是相当重要的,但IntelliJ IDEA在扫描、编译、处理各类问题的时候,确实是需要很大内存的。我个人目前是给到了6G。

网上有各种各样教你修改配置文件的方法,但是IntelliJ IDEA自己就提供了这样的功能,你直接需要点击【顶栏->Help->Edit Custom VM Options】就可以在IntelliJ IDEA编辑框打开一个以.vmoptions结尾的文件。如果之前已经有-Xmx属性那么就改一下,如果没有就新起一行加上即可,如果你想和我一样配置成6G,那么修改属性值应该是-Xmx6144m即可,这表示最小堆内存位6G

使用更高版本的jdk以及IntelliJ IDEA的新界面

java 原来使用的是OpenGL,但是macOS从Mojave开始启用了新的Metal框架,jetbrains对此也是早早布局,我这里放两个链接供你了解更多的内容:

  1. Metal for IntelliJ Platform | The JetBrains Platform Blog
  2. https://youtrack.jetbrains.com/issue/JBR-745/Improve-java2d-rendering-performance-on-macOS-by-using-Metal-framework

当你的分辨率非常高,或者是显示器非常的多时,渲染的压力就会越大,cpu就会飙升,IntelliJ IDEA也会变卡。截止目前IntelliJ IDEA已经发布了New UI,虽然被标记为Beta,但从我个人使用情况来说,我还没遇到过问题。反而新版本的UI更让我聚焦我的开发工作,用了几天很快就适应了。
简单来说,你需要jre 17及以上版本且IntelliJ IDEA版本保持为最新版即可。

插件导致的卡顿

git插件

排查思路很简单,就是我在上一个章节中提到的一个一个的禁用插件来排查,如果你已经确定是IntelliJ IDEA的git插件导致的卡顿,但是你又想像我一样继续使用这个git插件,那么应该怎么解决呢?

这个问题我是偶然一次浏览到的,macOS 下 Intellij IDEA 变得特别卡该如何解决? - 知乎 其中第一个高赞回答就是解决方法,其实就是.gitignore文件设置不合理,导致git插件索引了大量无意义的文件,我目前维护的这个项目git下同时存放了多个子系统的代码,文件数量和层级都非常的夸张。

我在我本地修改了.gitignore文件的内容,去掉了一些我不需要管的文件夹后,git插件导致的IntelliJ IDEA卡顿问题就迎刃而解了。

其他插件

  • 如果你确定你不需要,比如alibaba的p3c检查,或者是一些其他的检查扫描类插件,可以disable的都尽量卸载即可。
  • 对于一些比较小众的插件,你可以尝试通过GitHub直接联系作者以寻求解决方案。

MacOS软件推荐

与此同时,这还是一份我个人重装macOS系统的备忘录😁

工具类

软件名称 软件用途 价格 推荐下载方式
homebrew macOS包管理工具 免费 终端执行:/bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)”
mos 用于鼠标切换上下滚动的顺序,以及鼠标平滑滚动 免费 brew install mos
AppCleaner 卸载app,并且删掉相关联的文件 免费 brew install appcleaner
numbers 替代Excel 免费 app store
keynote 替代PowerPoint 免费 app store
pages 替代word 免费 app store
chrome浏览器 上网、开发调试 免费 https://google.cn/chrome
sinology drive client 群晖文件同步工具 免费 Synology Drive
snipaste 截图、贴图工具 基本版免费(高级版macOS还没上) brew install snipaste
mircsoft remote windows操作系统远程桌面工具 免费 美区app store
infuse 一个跨iOS iPadOS macOS tvos,带资源刮削的播放器 x刀/年 美区app store
Obisidian markdown笔记软件 免费(同步服务收费) brew install Obisidian
marktext markdown编辑软件,操作表格的时候会比Obisidian好用很多很多,可以搭配使用 免费 brew install mark-text
ForkLift ftp、sftp软件 收费,买断制 brew install –cask forklift
Maccy 剪贴板记录软件 免费 brew install maccy
MonitorContror 显示器亮度控制软件 免费 brew install –cask monitorcontrol
Itsycal 菜单栏中的日期选起控件 免费 brew install Itsycal
omnidisksweeper 磁盘清理工具 免费 brew install –cask omnidisksweeper
vmware-fusion vmware虚拟机免费版 个人免费(需要自己在官网申请license) brew install –cask vmware-fusion

通讯软件

软件名称 软件用途 价格 推荐安装方式
telegram 聊天 免费(高级会员需订阅) app store(有沙盒机制)
foxmail 管理企业邮件 免费 brew install –cask foxmail

编程软件

软件名称 软件用途 价格 推荐安装方式
drawio UML绘图工具 免费 brew install drawio
vscode 文本编译器(也可以是IDE) 免费 brew install –cask visual-studio-code
docker 容器化工具 免费 brew install –cask docker
nginx web、代理服务等 免费 brew install nginx
mat java堆内存分析工具 免费 brew install mat
jmeter 并发测试工具 免费 brew install jmeter
node 开发环境 免费 brew install node
git 代码分支管理工具 免费 brew install git
sdkman 各类SDK管理工具 免费 curl -s “https://get.sdkman.io

Java云原生开发初体验报告

背景

前段时间在考虑做一款小工具,功能非常简单,调用多个HTTP接口,分析处理返回的数据,生成Excel文件即可。 为了尽量的让这个工具的实用性更高,我首先想到Java的云原生开发方案,直接构建为可执行文件,不需要使用的人再去安装jre运行环境,或者是带着庞大的jre文件发出。再者,我也想试试Java的云原生方案到底好不好用。

技术选型

因为一直在使用Spring开发业务,所以我这次直接使用了Spring Native

开发过程

注:均基于 macOS

开发环境安装

Spring官网的文章写的非常好,直接参考官文就可以了。Spring官方文档 我选择安装了sdk man,然后

1
sdk install java 22.1.r11-nik

剩下的就是直接用spring native创建一个项目就可以了,这个非常简单。

编译构建

  1. 如果你用了阿里云的maven仓库,请记得切换成apache的原库

  2. macOS默认mvn命令指定的jdk版本可能不是你新安装的GraalVM(像我本地就有七八个不同的JDK版本),会出现一些编译错误,那么你需要创建~/.mavenrc文件

1
2
// 路径记得自己改成正确的
export JAVA_HOME=/Users/baofeidyz/.sdkman/candidates/java/current

报错集锦

报错1

1
2
3
gu install native-image
Downloading: Component catalog from download.bell-sw.com
Error: Unknown component: native-image

在高版本里面,这个native-image好像不需要手动安装了(也有可能是我之前安装过)Install fails in 19.2.0 with gu · Issue #1665 · oracle/graal · GitHub 然后我直接运行了一下native-image发现已经有了

报错2 反射错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.baofeidyz.XXXDTO` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: UNKNOWN; byte offset: #UNKNOWN] (through reference chain: java.util.ArrayList[0])
at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1904)
at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:400)
at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1349)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1415)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:351)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:184)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer._deserializeFromArray(CollectionDeserializer.java:355)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:244)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:28)
at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)
at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:4650)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2856)
有省略部分堆栈

这个报错只有在GraalVM下运行时才会出现,我最开始以为是因为我用了lombok然后导致的编译问题,同时我也有注意到,Spring Native本身是直接带了lombok的,我觉得不太可能吧。 但是我还是尝试去掉了lombok,当然并没有什么用。

然后我又开始在网上寻找一些蛛丝马迹,看看有没有其他人也遇到了类似的问题。但是Java Native问题的搜索真的是非常难找,因为这类问题有可能因为其他的原因也会出现,并且由于Spring Native使用人非常的少,你很难在Google的结果中找到真正的答案。我也尝试使用site:github.com再去Google搜索,仍没有找到答案。 我甚至都想去提issue了 😂 GitHub - graalvm/native-build-tools: Native-image plugins for various build tools

我后来咨询了一位做过Spring Native开发的朋友,他告诉我,可能是因为反射导致的,需要增加配置。 我顺着这位朋友的思路,去看了一下反射配置的问题,正好在这篇文章中给出了一个示例

1
2
3
@TypeHint(types = Data.class, typeNames = "com.example.webclient.Data$SuperHero") 
@SpringBootApplication
public class SampleApplication { // ... }

我顺着这个例子,修改了一下代码

1
2
3
4
5
@TypeHint(types = XXXDTO.class, typeNames = "com.baofeidyz.XXXDTO")  
@SpringBootApplication
public class MySpringNativeApplication {
// ...
}

确实解决了这个jackson反序列化导致的错误,但我又遇到了新的错误。

报错3 缺少字符集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
java.nio.charset.UnsupportedCharsetException: CP1252
at java.nio.charset.Charset.forName(Charset.java:529)
at org.apache.poi.util.LocaleUtil.<clinit>(LocaleUtil.java:56)
at org.apache.poi.ss.usermodel.DataFormatter.<init>(DataFormatter.java:242)
at org.apache.poi.ss.usermodel.DataFormatter.<init>(DataFormatter.java:233)
at org.apache.poi.ss.formula.functions.TextFunction.<clinit>(TextFunction.java:33)
at org.apache.poi.ss.formula.atp.AnalysisToolPak.createFunctionsMap(AnalysisToolPak.java:82)
at org.apache.poi.ss.formula.atp.AnalysisToolPak.<init>(AnalysisToolPak.java:47)
at org.apache.poi.ss.formula.atp.AnalysisToolPak.<clinit>(AnalysisToolPak.java:33)
at org.apache.poi.ss.formula.udf.AggregatingUDFFinder.<clinit>(AggregatingUDFFinder.java:35)
at java.lang.Class.ensureInitialized(DynamicHub.java:518)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:155) ~[na:na]
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:226) ~[na:na]
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:214) ~[na:na]
// 有省略堆栈信息

这个看起来像是poi在操作的时候,遇到了一个chartset问题,spring有一个专门的仓库我在这个仓库里面找到了这个issue,我看到一个人也遇到了这个charset的问题,但是他是mysql的时候遇到的,他提到加了一个参数用于解决这个问题。 紧接着,我又找到了几个issue:

了解到说,需要在native-image编译的时候,增加一个AddAllCharsets参数 但是我是使用的spring native的maven插件,我的构建命令是mvn -Pnative,我并没有直接使用native-image,我不知道怎么增加这个参数才是对的。 此外,我还看了两份文档:

终于,我知道如何在Spring Native中增加这个AddAllCharsets参数了 😄

1
2
3
4
5
6
7
@TypeHint(types = XXXDTO.class, typeNames = "com.baofeidyz.XXXDTO")  
// 👇 下面这行代码就解决了我的问题
@NativeHint(options = "-H:+AddAllCharsets")
@SpringBootApplication
public class MySpringNativeApplication {
// ...
}

最佳实践就是加一个@NativeHint(options = "-H:+AddAllCharsets") 当然不可能这么顺利的,很快我又遇到了新的报错

错误4 POI的resource文件未加载

1
2
3
4
5
6
7
8
9
10
11
12
org.apache.xmlbeans.SchemaTypeLoaderException: XML-BEANS compiled schema: Could not locate compiled schema resource org/apache/poi/schemas/ooxml/system/ooxml/index.xsb (org.apache.poi.schemas.ooxml.system.ooxml.index) - code 0
at org.apache.xmlbeans.impl.schema.XsbReader.<init>(XsbReader.java:63)
at org.apache.xmlbeans.impl.schema.SchemaTypeSystemImpl.initFromHeader(SchemaTypeSystemImpl.java:235)
at org.apache.xmlbeans.impl.schema.SchemaTypeSystemImpl.<init>(SchemaTypeSystemImpl.java:201)
at org.apache.poi.schemas.ooxml.system.ooxml.TypeSystemHolder.<init>(TypeSystemHolder.java:9)
at org.apache.poi.schemas.ooxml.system.ooxml.TypeSystemHolder.<clinit>(TypeSystemHolder.java:6)
at org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook.<clinit>(CTWorkbook.java:22)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.onWorkbookCreate(XSSFWorkbook.java:475)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:232)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:226)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:214)
// 有省略

我猜测应该是因为资源没有引入导致的,所以我理解应该还是应该用spring native提供的hint去实现。我参考这个代码块 增加了一个@ResourceHint

1
2
3
4
5
6
7
@TypeHint(types = XXXDTO.class, typeNames = "com.baofeidyz.XXXDTO")  
@ResourceHint(patterns = {"(^/|[a-zA-Z])*/.+(/$)?.xsb"})
@NativeHint(options = "-H:+AddAllCharsets")
@SpringBootApplication
public class MySpringNativeApplication {
// ...
}

报错5

1
2
3
4
5
6
java.lang.ClassCastException: org.apache.xmlbeans.impl.values.XmlComplexContentImpl cannot be cast to org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook
at org.apache.poi.xssf.usermodel.XSSFWorkbook.onWorkbookCreate(XSSFWorkbook.java:475)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:232)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:226)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:214)
// 有省略

然后我在GraalVM的issue清单中找到了这个issue:Getting following error while generating excel file using native image. · Issue #1929 · oracle/graal · GitHub 基本上错误信息就是一致的。 我试了一下,不行。

我感觉POI和GraalVM配合坑有点多,我不打算一个一个找了,我尝试去找一些大而全的文章,于是,我找到了这篇文章:Graalvm使用采坑 - 行万里路才能回到内心深处,读万卷书才能看得清皓月繁星

可惜还是失败了,我感觉算了吧,POI和GraalVM的路还很长哦…

一些思考

  1. 对于这种POI组件的问题,处理起来确实很难。我查了GraalVM的ISSUE清单,5.0之前的POI确实是有一些问题,但与此同时GraalVM可能需要大量的构建参数去配置,然后Spring Native又在其中转了一次。也就是说,我需要知道这个问题不是POI导致的,然后去看native-image对应的解决方案(配置参数)是什么,然后再转成Spring Native的hints。如果我不能确定这个问题是不是POI导致的,我连提ISSUE给谁都不清楚,如果自己尝试去排查编译问题,这就会进入一个更深的坑。

  2. 我建议如果Spring Native example下找不到对应的例子之前,不要去趟这个浑水,整个开发过程非常阻塞,问题很难说真正的解决完。

  3. Java云原生的路确实很难走,不管是GraalVM去适配组件,还是组件去适配GraalVM,整个适配时间会拉得很长很长。

  4. GraalVM编译时间很长,我的项目并不大,4核8线程,16G内存,但是每次都需要大概3分钟左右,并且编译的时候,CPU使用率一直都很高。

后续

我后来用GO重写了整个程序,这是我第一次用GO,从0开始学,大概花了20个小时就写完了,并且我还用了协程并发,处理了一些线程安全的问题。相比之下,Spring Native至少花了我四倍的时间,并且没有做完。 GO编译速度非常快,我交叉编译linux或windows也才10s,CPU使用率也不高,相比之下,GO做这类小工具的云原生开发真的是非常好用。

所以我在怀疑,Java云原生是否真的有意义?希望十年后,能被打脸。

以上就是我Java云原生的初步体验报告,如果对你有一点点帮助,希望可以给我的文章点个赞和收藏。

0%