免费个人网站制作设计,移动网站建设学习,全网营销推广定义,阿里 网站备案核验单概述
因为公司业务需求#xff0c;需要将一部分原本已经用C/C写好的程序封装到flink内部使用。
操作系统
CentOS 7使用的技术和工具
flink 1.17.1
JDK 19.0.2
JNA 5.12.1
maven 3.9.4技术实现
利用JNA将C/C的程序封装到JAR包里面#xff0c;然后结合flink依赖#xff0…概述
因为公司业务需求需要将一部分原本已经用C/C写好的程序封装到flink内部使用。
操作系统
CentOS 7使用的技术和工具
flink 1.17.1
JDK 19.0.2
JNA 5.12.1
maven 3.9.4技术实现
利用JNA将C/C的程序封装到JAR包里面然后结合flink依赖打包运行即可。注意JNA可以加载JAR包内部的so库QA
Q 1.Exception in thread “main” java.lang.reflect.InaccessibleObjectException: Unable to make field private final java.net.DatagramSocket java.net.DatagramSocket.delegate accessible: module java.base does not “opens java.net” to unnamed module 26f67b76
2.Exception in thread “main” java.lang.reflect.InaccessibleObjectException: Unable to make field private final byte[] java.lang.String.value accessible: module java.base does not “opens java.lang” to unnamed module 1a810908
3.Exception in thread “main” java.lang.reflect.InaccessibleObjectException: Unable to make field private final sun.nio.ch.DatagramChannelImpl sun.nio.ch.DatagramSocketAdaptor.dc accessible: module java.base does not “opens sun.nio.ch” to unnamed module 26f67b76
A 执行的时候加上以下选项 –add-opensjava.base/java.langALL-UNNAMED --add-opensjava.base/java.ioALL-UNNAMED --add-opensjava.base/java.utilALL-UNNAMED --add-opensjava.base/java.util.concurrentALL-UNNAMED --add-opensjava.rmi/sun.rmi.transportALL-UNNAMED --add-opensjava.base/java.lang.reflectALL-UNNAMED --add-opensjava.base/java.utilALL-UNNAMED --add-opensjava.base/java.mathALL-UNNAMED --add-opensjava.base/java.netALL-UNNAMED --add-opensjava.base/sun.nio.chALL-UNNAMED
Q java.lang.Exception: Could not create actor system A 百度发现是打包的flink依赖包版本不对运行是1.17.1JAR包用的是1.13.1
Q: Exception in thread “main” org.apache.flink.api.common.InvalidProgramException: java.io.FileDescriptor3a82f6ef is not serializable. The object probably contains or references non serializable fields
A: DatagramSocket对象内部存在不支持序列化的字段所以不能定义为SourceFunction派生类的属性。 因为flink分布式的特性所以JAR包内的类都需要支持序列化。 为了避免该问题将DatagramSocket挪到run函数内部初始化即可
Q JNA加载动态库以下称为主库的时候不会加载主库所依赖的其他动态库
A 这种情况解决方法有以下几种 1. 导出LD_LIBRARY_PATH 2. 将主库所依赖的动态库编译成.a一起打包到主库 3. 将依赖库所在的路径添加到能被搜索到的路径具体请查看“参考链接”
参考链接
在JDK17尝鲜Flink1.17 flink1.12.2之后的版本和scala的兼容性问题 Linux下5种动态库运行时搜索路径的方法